Capture a Slack thread permalink as a story draft
Stores the supplied permalink and text as draft provenance, reusing an existing matching source identity. This route does not fetch Slack thread content. Requires the impact_stories feature. Requires permission: one of impact_stories_manage.
curl --request POST \
--url https://api.gratona.com/v1/admin/impact-stories/intake/slack \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"permalink": "https://example.org/story",
"channel_name": "Channel Name",
"thread_ts": "Thread Ts",
"source_external_id": "Source External Id",
"title": "Field update from the education program",
"headline": "Headline",
"summary": "Summary",
"body": "Students received their new supplies this week.",
"story_type": "field_update",
"status": "draft",
"privacy_level": "internal",
"consent_status": "unknown",
"primary_program_id": 1,
"primary_entity_id": 1,
"primary_donor_id": 1,
"story_date": "2026-10-20T12:00:00Z",
"tags_json": {},
"source_payload_json": {},
"governance_json": {}
}
'import requests
url = "https://api.gratona.com/v1/admin/impact-stories/intake/slack"
payload = {
"permalink": "https://example.org/story",
"channel_name": "Channel Name",
"thread_ts": "Thread Ts",
"source_external_id": "Source External Id",
"title": "Field update from the education program",
"headline": "Headline",
"summary": "Summary",
"body": "Students received their new supplies this week.",
"story_type": "field_update",
"status": "draft",
"privacy_level": "internal",
"consent_status": "unknown",
"primary_program_id": 1,
"primary_entity_id": 1,
"primary_donor_id": 1,
"story_date": "2026-10-20T12:00:00Z",
"tags_json": {},
"source_payload_json": {},
"governance_json": {}
}
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({
permalink: 'https://example.org/story',
channel_name: 'Channel Name',
thread_ts: 'Thread Ts',
source_external_id: 'Source External Id',
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',
status: 'draft',
privacy_level: 'internal',
consent_status: 'unknown',
primary_program_id: 1,
primary_entity_id: 1,
primary_donor_id: 1,
story_date: '2026-10-20T12:00:00Z',
tags_json: {},
source_payload_json: {},
governance_json: {}
})
};
fetch('https://api.gratona.com/v1/admin/impact-stories/intake/slack', 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/slack",
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([
'permalink' => 'https://example.org/story',
'channel_name' => 'Channel Name',
'thread_ts' => 'Thread Ts',
'source_external_id' => 'Source External Id',
'title' => 'Field update from the education program',
'headline' => 'Headline',
'summary' => 'Summary',
'body' => 'Students received their new supplies this week.',
'story_type' => 'field_update',
'status' => 'draft',
'privacy_level' => 'internal',
'consent_status' => 'unknown',
'primary_program_id' => 1,
'primary_entity_id' => 1,
'primary_donor_id' => 1,
'story_date' => '2026-10-20T12:00:00Z',
'tags_json' => [
],
'source_payload_json' => [
],
'governance_json' => [
]
]),
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/slack"
payload := strings.NewReader("{\n \"permalink\": \"https://example.org/story\",\n \"channel_name\": \"Channel Name\",\n \"thread_ts\": \"Thread Ts\",\n \"source_external_id\": \"Source External Id\",\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 \"status\": \"draft\",\n \"privacy_level\": \"internal\",\n \"consent_status\": \"unknown\",\n \"primary_program_id\": 1,\n \"primary_entity_id\": 1,\n \"primary_donor_id\": 1,\n \"story_date\": \"2026-10-20T12:00:00Z\",\n \"tags_json\": {},\n \"source_payload_json\": {},\n \"governance_json\": {}\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/slack")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"permalink\": \"https://example.org/story\",\n \"channel_name\": \"Channel Name\",\n \"thread_ts\": \"Thread Ts\",\n \"source_external_id\": \"Source External Id\",\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 \"status\": \"draft\",\n \"privacy_level\": \"internal\",\n \"consent_status\": \"unknown\",\n \"primary_program_id\": 1,\n \"primary_entity_id\": 1,\n \"primary_donor_id\": 1,\n \"story_date\": \"2026-10-20T12:00:00Z\",\n \"tags_json\": {},\n \"source_payload_json\": {},\n \"governance_json\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/impact-stories/intake/slack")
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 \"permalink\": \"https://example.org/story\",\n \"channel_name\": \"Channel Name\",\n \"thread_ts\": \"Thread Ts\",\n \"source_external_id\": \"Source External Id\",\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 \"status\": \"draft\",\n \"privacy_level\": \"internal\",\n \"consent_status\": \"unknown\",\n \"primary_program_id\": 1,\n \"primary_entity_id\": 1,\n \"primary_donor_id\": 1,\n \"story_date\": \"2026-10-20T12:00:00Z\",\n \"tags_json\": {},\n \"source_payload_json\": {},\n \"governance_json\": {}\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.
Body
Validated request fields for this operation.
Permalink. Validation: required, url, max:2048.
2048"https://example.org/story"
Channel name. Validation: nullable, string, max:255.
255"Channel Name"
Thread ts. Validation: nullable, string, max:255.
255"Thread Ts"
Source external id. Validation: nullable, string, max:128.
128"Source External Id"
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"
Status. Validation: nullable, string; allowed values: draft, needs_context, ready_for_review, approved, published, rejected, archived.
draft, needs_context, ready_for_review, approved, published, rejected, archived, null "draft"
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"
Primary program id. Validation: nullable, integer.
1
Primary entity id. Validation: nullable, integer.
1
Primary donor id. Validation: nullable, integer.
1
Story date. Validation: nullable, date.
"2026-10-20T12:00:00Z"
Tags json. Validation: nullable, array.
Show child attributes
Show child attributes
Source payload json. Validation: nullable, array.
Show child attributes
Show child attributes
Governance json. Validation: nullable, array.
Show child attributes
Show child attributes
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/slack \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"permalink": "https://example.org/story",
"channel_name": "Channel Name",
"thread_ts": "Thread Ts",
"source_external_id": "Source External Id",
"title": "Field update from the education program",
"headline": "Headline",
"summary": "Summary",
"body": "Students received their new supplies this week.",
"story_type": "field_update",
"status": "draft",
"privacy_level": "internal",
"consent_status": "unknown",
"primary_program_id": 1,
"primary_entity_id": 1,
"primary_donor_id": 1,
"story_date": "2026-10-20T12:00:00Z",
"tags_json": {},
"source_payload_json": {},
"governance_json": {}
}
'import requests
url = "https://api.gratona.com/v1/admin/impact-stories/intake/slack"
payload = {
"permalink": "https://example.org/story",
"channel_name": "Channel Name",
"thread_ts": "Thread Ts",
"source_external_id": "Source External Id",
"title": "Field update from the education program",
"headline": "Headline",
"summary": "Summary",
"body": "Students received their new supplies this week.",
"story_type": "field_update",
"status": "draft",
"privacy_level": "internal",
"consent_status": "unknown",
"primary_program_id": 1,
"primary_entity_id": 1,
"primary_donor_id": 1,
"story_date": "2026-10-20T12:00:00Z",
"tags_json": {},
"source_payload_json": {},
"governance_json": {}
}
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({
permalink: 'https://example.org/story',
channel_name: 'Channel Name',
thread_ts: 'Thread Ts',
source_external_id: 'Source External Id',
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',
status: 'draft',
privacy_level: 'internal',
consent_status: 'unknown',
primary_program_id: 1,
primary_entity_id: 1,
primary_donor_id: 1,
story_date: '2026-10-20T12:00:00Z',
tags_json: {},
source_payload_json: {},
governance_json: {}
})
};
fetch('https://api.gratona.com/v1/admin/impact-stories/intake/slack', 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/slack",
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([
'permalink' => 'https://example.org/story',
'channel_name' => 'Channel Name',
'thread_ts' => 'Thread Ts',
'source_external_id' => 'Source External Id',
'title' => 'Field update from the education program',
'headline' => 'Headline',
'summary' => 'Summary',
'body' => 'Students received their new supplies this week.',
'story_type' => 'field_update',
'status' => 'draft',
'privacy_level' => 'internal',
'consent_status' => 'unknown',
'primary_program_id' => 1,
'primary_entity_id' => 1,
'primary_donor_id' => 1,
'story_date' => '2026-10-20T12:00:00Z',
'tags_json' => [
],
'source_payload_json' => [
],
'governance_json' => [
]
]),
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/slack"
payload := strings.NewReader("{\n \"permalink\": \"https://example.org/story\",\n \"channel_name\": \"Channel Name\",\n \"thread_ts\": \"Thread Ts\",\n \"source_external_id\": \"Source External Id\",\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 \"status\": \"draft\",\n \"privacy_level\": \"internal\",\n \"consent_status\": \"unknown\",\n \"primary_program_id\": 1,\n \"primary_entity_id\": 1,\n \"primary_donor_id\": 1,\n \"story_date\": \"2026-10-20T12:00:00Z\",\n \"tags_json\": {},\n \"source_payload_json\": {},\n \"governance_json\": {}\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/slack")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"permalink\": \"https://example.org/story\",\n \"channel_name\": \"Channel Name\",\n \"thread_ts\": \"Thread Ts\",\n \"source_external_id\": \"Source External Id\",\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 \"status\": \"draft\",\n \"privacy_level\": \"internal\",\n \"consent_status\": \"unknown\",\n \"primary_program_id\": 1,\n \"primary_entity_id\": 1,\n \"primary_donor_id\": 1,\n \"story_date\": \"2026-10-20T12:00:00Z\",\n \"tags_json\": {},\n \"source_payload_json\": {},\n \"governance_json\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/impact-stories/intake/slack")
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 \"permalink\": \"https://example.org/story\",\n \"channel_name\": \"Channel Name\",\n \"thread_ts\": \"Thread Ts\",\n \"source_external_id\": \"Source External Id\",\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 \"status\": \"draft\",\n \"privacy_level\": \"internal\",\n \"consent_status\": \"unknown\",\n \"primary_program_id\": 1,\n \"primary_entity_id\": 1,\n \"primary_donor_id\": 1,\n \"story_date\": \"2026-10-20T12:00:00Z\",\n \"tags_json\": {},\n \"source_payload_json\": {},\n \"governance_json\": {}\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."
}