Capture a story draft from a shared inbox conversation
Captures permitted conversation content as a draft, reusing the existing story for the same conversation. Requires beta, story-management and SMS inbox access. Requires the impact_stories feature. Requires permission: one of beta_features; plus one of impact_stories_manage; plus one of sms_inbox_view, sms_inbox_reply, sms_inbox_manage.
curl --request POST \
--url https://api.gratona.com/v1/admin/impact-stories/intake/shared-inbox/{conversationId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "Field update from the education program",
"headline": "Headline",
"summary": "Summary",
"body": "Students received their new supplies this week.",
"story_type": "field_update",
"privacy_level": "internal",
"consent_status": "unknown"
}
'import requests
url = "https://api.gratona.com/v1/admin/impact-stories/intake/shared-inbox/{conversationId}"
payload = {
"title": "Field update from the education program",
"headline": "Headline",
"summary": "Summary",
"body": "Students received their new supplies this week.",
"story_type": "field_update",
"privacy_level": "internal",
"consent_status": "unknown"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: 'Field update from the education program',
headline: 'Headline',
summary: 'Summary',
body: JSON.stringify('Students received their new supplies this week.'),
story_type: 'field_update',
privacy_level: 'internal',
consent_status: 'unknown'
})
};
fetch('https://api.gratona.com/v1/admin/impact-stories/intake/shared-inbox/{conversationId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.gratona.com/v1/admin/impact-stories/intake/shared-inbox/{conversationId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => 'Field update from the education program',
'headline' => 'Headline',
'summary' => 'Summary',
'body' => 'Students received their new supplies this week.',
'story_type' => 'field_update',
'privacy_level' => 'internal',
'consent_status' => 'unknown'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.gratona.com/v1/admin/impact-stories/intake/shared-inbox/{conversationId}"
payload := strings.NewReader("{\n \"title\": \"Field update from the education program\",\n \"headline\": \"Headline\",\n \"summary\": \"Summary\",\n \"body\": \"Students received their new supplies this week.\",\n \"story_type\": \"field_update\",\n \"privacy_level\": \"internal\",\n \"consent_status\": \"unknown\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.gratona.com/v1/admin/impact-stories/intake/shared-inbox/{conversationId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"Field update from the education program\",\n \"headline\": \"Headline\",\n \"summary\": \"Summary\",\n \"body\": \"Students received their new supplies this week.\",\n \"story_type\": \"field_update\",\n \"privacy_level\": \"internal\",\n \"consent_status\": \"unknown\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/impact-stories/intake/shared-inbox/{conversationId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"Field update from the education program\",\n \"headline\": \"Headline\",\n \"summary\": \"Summary\",\n \"body\": \"Students received their new supplies this week.\",\n \"story_type\": \"field_update\",\n \"privacy_level\": \"internal\",\n \"consent_status\": \"unknown\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 42,
"primary_program_id": 42,
"primary_entity_id": 42,
"primary_donor_id": 42,
"title": "Education update",
"headline": "Education update",
"summary": "Education update",
"story_type": "Education update",
"source_type": "Education update",
"source_external_id": "Education update",
"status": "draft",
"privacy_level": "internal",
"consent_status": "unknown",
"story_date": "2026-10-20",
"asset_count": 2,
"offer_count": 2,
"publication_count": 2,
"primary_asset": {
"id": 42,
"client_id": 42,
"impact_story_id": 42,
"upload_id": 42,
"asset_type": "Education update",
"title": "Education update",
"caption": "Education update",
"source_url": "Education update",
"drive_file_id": "Education update",
"consent_status": "unknown",
"is_primary": true,
"metadata_json": {},
"created_by_user_id": 42,
"created_at": "2026-10-20T12:00:00Z",
"updated_at": "2026-10-20T12:00:00Z",
"preview": {
"id": 42,
"asset_type": "Education update",
"title": "Education update",
"caption": "Education update",
"provider": "Education update",
"available": true,
"open_source": true,
"workspace_file_id": "Education update",
"preview_url": "Education update",
"thumbnail_url": "Education update",
"source_url": "Education update",
"download_url": "Education update",
"drive_file_id": "Education update",
"consent_status": "unknown",
"is_primary": true,
"metadata_json": {}
}
},
"created_at": "2026-10-20T12:00:00Z",
"updated_at": "2026-10-20T12:00:00Z",
"reach": {
"audience": "Education update",
"blocked_count": 2,
"held_back": true,
"blocked_message": "Education update",
"blocked_files": [
{
"file_ref": "Education update",
"reason": "Education update"
}
]
},
"slug": "Education update",
"body": "Education update",
"pull_quote": "Education update",
"audience_json": {},
"tags_json": {},
"impact_metrics_json": {},
"source_payload_json": {},
"governance_json": {},
"approved_at": "2026-10-20T12:00:00Z",
"archived_at": "2026-10-20T12:00:00Z",
"assets": [
{
"id": 42,
"client_id": 42,
"impact_story_id": 42,
"upload_id": 42,
"asset_type": "Education update",
"title": "Education update",
"caption": "Education update",
"source_url": "Education update",
"drive_file_id": "Education update",
"consent_status": "unknown",
"is_primary": true,
"metadata_json": {},
"created_by_user_id": 42,
"created_at": "2026-10-20T12:00:00Z",
"updated_at": "2026-10-20T12:00:00Z",
"preview": {
"id": 42,
"asset_type": "Education update",
"title": "Education update",
"caption": "Education update",
"provider": "Education update",
"available": true,
"open_source": true,
"workspace_file_id": "Education update",
"preview_url": "Education update",
"thumbnail_url": "Education update",
"source_url": "Education update",
"download_url": "Education update",
"drive_file_id": "Education update",
"consent_status": "unknown",
"is_primary": true,
"metadata_json": {}
}
}
],
"relations": [
{
"record_type": "Education update",
"record_id": 42,
"label": "Education update",
"url": "Education update",
"relationship_role": "Education update"
}
],
"offers": [
{
"id": 42,
"client_id": 42,
"impact_story_id": 42,
"created_by_user_id": 42,
"approved_by_user_id": 42,
"title": "Education update",
"status": "Education update",
"beneficiary_label": "Education update",
"problem_statement": "Education update",
"solution_statement": "Education update",
"cost_currency": "Education update",
"cost_label": "Education update",
"hope_statement": "Education update",
"ask_copy": "Education update",
"donor_safe_summary": "Education update",
"cost_amount": "25.00",
"suggested_audience_json": {},
"channel_copy_json": {},
"source_payload_json": {},
"approved_at": "2026-10-20T12:00:00Z",
"created_at": "2026-10-20T12:00:00Z",
"updated_at": "2026-10-20T12:00:00Z"
}
],
"publications": [
{
"id": 42,
"client_id": 42,
"impact_story_id": 42,
"impact_story_offer_id": 42,
"target_id": 42,
"created_by_user_id": 42,
"channel": "Education update",
"status": "Education update",
"target_type": "Education update",
"target_url": "Education update",
"audience_snapshot_json": {},
"payload_json": {},
"published_at": "2026-10-20T12:00:00Z",
"created_at": "2026-10-20T12:00:00Z",
"updated_at": "2026-10-20T12:00:00Z"
}
],
"consent_releases": [
{
"id": 42,
"client_id": 42,
"impact_story_id": 42,
"impact_story_intake_path_id": 42,
"release_upload_id": 42,
"revoked_by_user_id": 42,
"subject_id": 42,
"status": "Education update",
"consent_scope": "Education update",
"signer_name": "Education update",
"signer_email": "Education update",
"signer_role": "Education update",
"signature_text": "Education update",
"release_text": "Education update",
"release_file_name": "Education update",
"release_file_key": "Education update",
"release_file_mime": "Education update",
"evidence_kind": "Education update",
"subject_type": "Education update",
"signed_at": "2026-10-20T12:00:00Z",
"valid_from": "2026-10-20T12:00:00Z",
"expires_at": "2026-10-20T12:00:00Z",
"revoked_at": "2026-10-20T12:00:00Z",
"created_at": "2026-10-20T12:00:00Z",
"updated_at": "2026-10-20T12:00:00Z",
"metadata_json": {}
}
],
"primary_program": {
"record_type": "Education update",
"record_id": 42,
"label": "Education update",
"url": "Education update",
"relationship_role": "Education update"
},
"primary_entity": {
"record_type": "Education update",
"record_id": 42,
"label": "Education update",
"url": "Education update",
"relationship_role": "Education update"
},
"primary_donor": {
"record_type": "Education update",
"record_id": 42,
"label": "Education update",
"url": "Education update",
"relationship_role": "Education update"
}
}
}{
"message": "Unauthorized",
"status": "error"
}{
"message": "Not Found",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}Authorizations
Passport bearer token authentication for legacy admin sessions.
Path Parameters
Conversation id in the current organization.
Body
Validated request fields for this operation.
Title. Validation: nullable, string, max:255.
255"Field update from the education program"
Headline. Validation: nullable, string, max:255.
255"Headline"
Summary. Validation: nullable, string, max:5000.
5000"Summary"
Body. Validation: nullable, string.
"Students received their new supplies this week."
Story type. Validation: nullable, string, max:64.
64"field_update"
Privacy level. Validation: nullable, string; allowed values: internal, donor_safe, public.
internal, donor_safe, public, null "internal"
Consent status. Validation: nullable, string; allowed values: unknown, internal_only, donor_safe, public_safe.
unknown, internal_only, donor_safe, public_safe, null "unknown"
Response
Operation result.
Detailed governed story. Related records are filtered by current user access; unavailable references can be null.
Show child attributes
Show child attributes
curl --request POST \
--url https://api.gratona.com/v1/admin/impact-stories/intake/shared-inbox/{conversationId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "Field update from the education program",
"headline": "Headline",
"summary": "Summary",
"body": "Students received their new supplies this week.",
"story_type": "field_update",
"privacy_level": "internal",
"consent_status": "unknown"
}
'import requests
url = "https://api.gratona.com/v1/admin/impact-stories/intake/shared-inbox/{conversationId}"
payload = {
"title": "Field update from the education program",
"headline": "Headline",
"summary": "Summary",
"body": "Students received their new supplies this week.",
"story_type": "field_update",
"privacy_level": "internal",
"consent_status": "unknown"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: 'Field update from the education program',
headline: 'Headline',
summary: 'Summary',
body: JSON.stringify('Students received their new supplies this week.'),
story_type: 'field_update',
privacy_level: 'internal',
consent_status: 'unknown'
})
};
fetch('https://api.gratona.com/v1/admin/impact-stories/intake/shared-inbox/{conversationId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.gratona.com/v1/admin/impact-stories/intake/shared-inbox/{conversationId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => 'Field update from the education program',
'headline' => 'Headline',
'summary' => 'Summary',
'body' => 'Students received their new supplies this week.',
'story_type' => 'field_update',
'privacy_level' => 'internal',
'consent_status' => 'unknown'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.gratona.com/v1/admin/impact-stories/intake/shared-inbox/{conversationId}"
payload := strings.NewReader("{\n \"title\": \"Field update from the education program\",\n \"headline\": \"Headline\",\n \"summary\": \"Summary\",\n \"body\": \"Students received their new supplies this week.\",\n \"story_type\": \"field_update\",\n \"privacy_level\": \"internal\",\n \"consent_status\": \"unknown\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.gratona.com/v1/admin/impact-stories/intake/shared-inbox/{conversationId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"Field update from the education program\",\n \"headline\": \"Headline\",\n \"summary\": \"Summary\",\n \"body\": \"Students received their new supplies this week.\",\n \"story_type\": \"field_update\",\n \"privacy_level\": \"internal\",\n \"consent_status\": \"unknown\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/impact-stories/intake/shared-inbox/{conversationId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"Field update from the education program\",\n \"headline\": \"Headline\",\n \"summary\": \"Summary\",\n \"body\": \"Students received their new supplies this week.\",\n \"story_type\": \"field_update\",\n \"privacy_level\": \"internal\",\n \"consent_status\": \"unknown\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 42,
"primary_program_id": 42,
"primary_entity_id": 42,
"primary_donor_id": 42,
"title": "Education update",
"headline": "Education update",
"summary": "Education update",
"story_type": "Education update",
"source_type": "Education update",
"source_external_id": "Education update",
"status": "draft",
"privacy_level": "internal",
"consent_status": "unknown",
"story_date": "2026-10-20",
"asset_count": 2,
"offer_count": 2,
"publication_count": 2,
"primary_asset": {
"id": 42,
"client_id": 42,
"impact_story_id": 42,
"upload_id": 42,
"asset_type": "Education update",
"title": "Education update",
"caption": "Education update",
"source_url": "Education update",
"drive_file_id": "Education update",
"consent_status": "unknown",
"is_primary": true,
"metadata_json": {},
"created_by_user_id": 42,
"created_at": "2026-10-20T12:00:00Z",
"updated_at": "2026-10-20T12:00:00Z",
"preview": {
"id": 42,
"asset_type": "Education update",
"title": "Education update",
"caption": "Education update",
"provider": "Education update",
"available": true,
"open_source": true,
"workspace_file_id": "Education update",
"preview_url": "Education update",
"thumbnail_url": "Education update",
"source_url": "Education update",
"download_url": "Education update",
"drive_file_id": "Education update",
"consent_status": "unknown",
"is_primary": true,
"metadata_json": {}
}
},
"created_at": "2026-10-20T12:00:00Z",
"updated_at": "2026-10-20T12:00:00Z",
"reach": {
"audience": "Education update",
"blocked_count": 2,
"held_back": true,
"blocked_message": "Education update",
"blocked_files": [
{
"file_ref": "Education update",
"reason": "Education update"
}
]
},
"slug": "Education update",
"body": "Education update",
"pull_quote": "Education update",
"audience_json": {},
"tags_json": {},
"impact_metrics_json": {},
"source_payload_json": {},
"governance_json": {},
"approved_at": "2026-10-20T12:00:00Z",
"archived_at": "2026-10-20T12:00:00Z",
"assets": [
{
"id": 42,
"client_id": 42,
"impact_story_id": 42,
"upload_id": 42,
"asset_type": "Education update",
"title": "Education update",
"caption": "Education update",
"source_url": "Education update",
"drive_file_id": "Education update",
"consent_status": "unknown",
"is_primary": true,
"metadata_json": {},
"created_by_user_id": 42,
"created_at": "2026-10-20T12:00:00Z",
"updated_at": "2026-10-20T12:00:00Z",
"preview": {
"id": 42,
"asset_type": "Education update",
"title": "Education update",
"caption": "Education update",
"provider": "Education update",
"available": true,
"open_source": true,
"workspace_file_id": "Education update",
"preview_url": "Education update",
"thumbnail_url": "Education update",
"source_url": "Education update",
"download_url": "Education update",
"drive_file_id": "Education update",
"consent_status": "unknown",
"is_primary": true,
"metadata_json": {}
}
}
],
"relations": [
{
"record_type": "Education update",
"record_id": 42,
"label": "Education update",
"url": "Education update",
"relationship_role": "Education update"
}
],
"offers": [
{
"id": 42,
"client_id": 42,
"impact_story_id": 42,
"created_by_user_id": 42,
"approved_by_user_id": 42,
"title": "Education update",
"status": "Education update",
"beneficiary_label": "Education update",
"problem_statement": "Education update",
"solution_statement": "Education update",
"cost_currency": "Education update",
"cost_label": "Education update",
"hope_statement": "Education update",
"ask_copy": "Education update",
"donor_safe_summary": "Education update",
"cost_amount": "25.00",
"suggested_audience_json": {},
"channel_copy_json": {},
"source_payload_json": {},
"approved_at": "2026-10-20T12:00:00Z",
"created_at": "2026-10-20T12:00:00Z",
"updated_at": "2026-10-20T12:00:00Z"
}
],
"publications": [
{
"id": 42,
"client_id": 42,
"impact_story_id": 42,
"impact_story_offer_id": 42,
"target_id": 42,
"created_by_user_id": 42,
"channel": "Education update",
"status": "Education update",
"target_type": "Education update",
"target_url": "Education update",
"audience_snapshot_json": {},
"payload_json": {},
"published_at": "2026-10-20T12:00:00Z",
"created_at": "2026-10-20T12:00:00Z",
"updated_at": "2026-10-20T12:00:00Z"
}
],
"consent_releases": [
{
"id": 42,
"client_id": 42,
"impact_story_id": 42,
"impact_story_intake_path_id": 42,
"release_upload_id": 42,
"revoked_by_user_id": 42,
"subject_id": 42,
"status": "Education update",
"consent_scope": "Education update",
"signer_name": "Education update",
"signer_email": "Education update",
"signer_role": "Education update",
"signature_text": "Education update",
"release_text": "Education update",
"release_file_name": "Education update",
"release_file_key": "Education update",
"release_file_mime": "Education update",
"evidence_kind": "Education update",
"subject_type": "Education update",
"signed_at": "2026-10-20T12:00:00Z",
"valid_from": "2026-10-20T12:00:00Z",
"expires_at": "2026-10-20T12:00:00Z",
"revoked_at": "2026-10-20T12:00:00Z",
"created_at": "2026-10-20T12:00:00Z",
"updated_at": "2026-10-20T12:00:00Z",
"metadata_json": {}
}
],
"primary_program": {
"record_type": "Education update",
"record_id": 42,
"label": "Education update",
"url": "Education update",
"relationship_role": "Education update"
},
"primary_entity": {
"record_type": "Education update",
"record_id": 42,
"label": "Education update",
"url": "Education update",
"relationship_role": "Education update"
},
"primary_donor": {
"record_type": "Education update",
"record_id": 42,
"label": "Education update",
"url": "Education update",
"relationship_role": "Education update"
}
}
}{
"message": "Unauthorized",
"status": "error"
}{
"message": "Not Found",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}