Connect social channels and publish posts to them.
List every social channel connected to your project. Each channel also carries the account name, handle and image, read live from the platform.
200The connected channels.The connected channels.
curl -X GET "https://api.fountain.fm/v1/social/channels" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY"{
"channels": [
{
"_id": "a1b2c3d4e5f6",
"platform": "x",
"status": "CONNECTED",
"info": {
"name": "Fountain",
"handle": "fountain_app",
"image": "https://pbs.twimg.com/profile_images/fountain.jpg"
}
}
]
}Begin the OAuth flow for a platform. Returns an authorization url - open it to grant access; on completion the channel becomes CONNECTED and can be used to publish posts. Any pending connection for the same platform is replaced.
Platform to connect.
redirectstringoptionalTrusted URL to return to after OAuth.
200The OAuth authorization URL.urlstringrequiredOpen this URL to authorize.
curl -X POST "https://api.fountain.fm/v1/social/channels" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"platform":"x"}'{
"platform": "x"
}{
"url": "https://x.com/i/oauth2/authorize?response_type=code&client_id=...&state=a1b2c3d4e5f6"
}Reconnect a channel whose access has expired or been revoked. Returns a fresh authorization url, just like Add Social Channel. The channel keeps its id and platform; on completion it is CONNECTED again.
idstringrequiredThe channel to reconnect.
reconnecttruerequiredConfirms the reconnection.
redirectstringoptionalTrusted URL to return to after OAuth.
200The OAuth authorization URL.urlstringrequiredOpen this URL to authorize.
curl -X PATCH "https://api.fountain.fm/v1/social/channels/{id}" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"reconnect":true}'{
"reconnect": true
}{
"url": "https://x.com/i/oauth2/authorize?response_type=code&client_id=...&state=a1b2c3d4e5f6"
}List every social post created through your project, drafts and published alike. Pass status to filter to a single lifecycle state, and source to filter to the content a post was cut from. Both can be combined.
Return only posts in this lifecycle state. Omit for every post.
Return only posts whose source.ids contains this link, e.g. episode:id:abc123 or show:id:xyz789.
200The posts.The posts.
curl -X GET "https://api.fountain.fm/v1/social/posts" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY"{
"posts": [
{
"_id": "p1q2r3s4t5u6",
"content": {
"context": "## Why this post\n\nBitcoin price went above $100,000, and this is generating a lot of engagement on X. The latest episode had John Doe, who discussed the effect of Bitcoin price fluctutations.",
"title": "Bitcoin price increase",
"text": "Bitcoin just hit $100,000. Check out my latest episode on why that matters.",
"uploads": []
},
"meta": {
"channel": "a1b2c3d4e5f6",
"created": "2026-06-01T12:00:00.000Z",
"updated": "2026-06-01T12:00:00.000Z",
"synced": "2026-06-02T12:00:00.000Z",
"published": "2026-06-01T12:00:05.000Z",
"status": "PUBLISHED"
},
"platform": {
"type": "x",
"id": "1789012345678901234"
},
"source": {
"ids": [
"episode:id:abc123",
"show:id:xyz789"
],
"media": "https://media.fountain.fm/episodes/abc123.mp3",
"transcript": "the genesis block was mined in 2009",
"ts_start": 2477.91,
"ts_end": 2493.9
},
"stats": {
"views": 1240,
"likes": 87,
"comments": 12
}
}
]
}Create a draft post on a CONNECTED channel. Omitted fields stay empty until you set them via Update Social Post. Pass a finalized SOCIAL_POST_VIDEO upload id as upload_id to attach media.
channel_idstringrequiredID of the connected channel to post to.
labelstringoptionalInternal label for the post.
titlestringoptionalPost title on the platform. YouTube only, at most 100 characters.
textstringoptionalPost text: the post on X, the description on YouTube, the caption on Instagram.
contextstringoptionalContext for choosing a candidate post, in Markdown.
Source media for the post. For an episode, ids must include both the episode:id: and show:id: links.
upload_idstringoptionalID of a COMPLETED SOCIAL_POST_VIDEO upload.
200The created post.The created post.
curl -X POST "https://api.fountain.fm/v1/social/posts" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"channel_id":"a1b2c3d4e5f6","label":"Bitcoin above $100k","text":"Bitcoin just went above $100,000. Here is what it means for you.","context":"## Why this post\n\nBitcoin went above $100,000 and the latest episode covers exactly that.","source":{"ids":["episode:id:abc123","show:id:xyz789"],"media":"https://media.fountain.fm/episodes/abc123.mp3","transcript":"the genesis block was mined in 2009","ts_start":2477.91,"ts_end":2493.9}}'{
"channel_id": "a1b2c3d4e5f6",
"label": "Bitcoin above $100k",
"text": "Bitcoin just went above $100,000. Here is what it means for you.",
"context": "## Why this post\n\nBitcoin went above $100,000 and the latest episode covers exactly that.",
"source": {
"ids": [
"episode:id:abc123",
"show:id:xyz789"
],
"media": "https://media.fountain.fm/episodes/abc123.mp3",
"transcript": "the genesis block was mined in 2009",
"ts_start": 2477.91,
"ts_end": 2493.9
}
}{
"post": {
"_id": "p1q2r3s4t5u6",
"content": {
"context": "## Why this post\n\nBitcoin price went above $100,000, and this is generating a lot of engagement on X. The latest episode had John Doe, who discussed the effect of Bitcoin price fluctutations.",
"title": "Bitcoin price increase",
"text": "Bitcoin just hit $100,000. Check out my latest episode on why that matters.",
"uploads": []
},
"meta": {
"channel": "a1b2c3d4e5f6",
"created": "2026-06-01T12:00:00.000Z",
"updated": "2026-06-01T12:00:00.000Z",
"synced": "2026-06-02T12:00:00.000Z",
"published": "2026-06-01T12:00:05.000Z",
"status": "PUBLISHED"
},
"platform": {
"type": "x",
"id": "1789012345678901234"
},
"source": {
"ids": [
"episode:id:abc123",
"show:id:xyz789"
],
"media": "https://media.fountain.fm/episodes/abc123.mp3",
"transcript": "the genesis block was mined in 2009",
"ts_start": 2477.91,
"ts_end": 2493.9
},
"stats": {
"views": 1240,
"likes": 87,
"comments": 12
}
}
}Load a social post by its id.
idstringrequiredThe post to load.
200The post.The post.
404No post with that id exists.curl -X GET "https://api.fountain.fm/v1/social/posts/{id}" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY"{
"post": {
"_id": "p1q2r3s4t5u6",
"content": {
"context": "## Why this post\n\nBitcoin price went above $100,000, and this is generating a lot of engagement on X. The latest episode had John Doe, who discussed the effect of Bitcoin price fluctutations.",
"title": "Bitcoin price increase",
"text": "Bitcoin just hit $100,000. Check out my latest episode on why that matters.",
"uploads": []
},
"meta": {
"channel": "a1b2c3d4e5f6",
"created": "2026-06-01T12:00:00.000Z",
"updated": "2026-06-01T12:00:00.000Z",
"synced": "2026-06-02T12:00:00.000Z",
"published": "2026-06-01T12:00:05.000Z",
"status": "PUBLISHED"
},
"platform": {
"type": "x",
"id": "1789012345678901234"
},
"source": {
"ids": [
"episode:id:abc123",
"show:id:xyz789"
],
"media": "https://media.fountain.fm/episodes/abc123.mp3",
"transcript": "the genesis block was mined in 2009",
"ts_start": 2477.91,
"ts_end": 2493.9
},
"stats": {
"views": 1240,
"likes": 87,
"comments": 12
}
}
}Update a post’s title, text, context, source, or attached media, and set its publish option. Every field is optional. Omit one to leave it unchanged. Omit upload_id to keep the existing media; pass a new finalized SOCIAL_POST_VIDEO upload id to replace it. publish drives the lifecycle: any option approves the post, SCHEDULE also gives it a publish time, and NOW publishes it right away (see SocialPostPublishMode). Published, publishing, and errored posts cannot be updated.
This endpoint is metered: it costs 1 credit per published post, drawn from your project credits. Charged when the post goes out, so a draft you never approve costs nothing. A clip on two channels is two posts.
idstringrequiredThe post to update.
Omitted fields stay unchanged.
labelstringoptionalInternal label for the post.
titlestringoptionalPost title on the platform. YouTube only, at most 100 characters.
textstringoptionalPost text: the post on X, the description on YouTube, the caption on Instagram.
contextstringoptionalContext for choosing a candidate post, in Markdown.
Source media for the post. For an episode, ids must include both the episode:id: and show:id: links.
upload_idstringoptionalID of a COMPLETED SOCIAL_POST_VIDEO upload.
publishobjectoptionalApprove, schedule or publish the post now.
mode'APPROVED' | 'NOW' | 'SCHEDULE'requiredApprove the post, schedule it or publish it now.
timestring | numberoptionalPublish time as an ISO-8601 instant. For SCHEDULE mode.
200The updated post.The updated post.
400The post is already published, already publishing, or in error.404No post with that id exists.curl -X PATCH "https://api.fountain.fm/v1/social/posts/{id}" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Updated title","text":"Updated caption","publish":{"mode":"APPROVED"}}'{
"title": "Updated title",
"text": "Updated caption",
"publish": {
"mode": "APPROVED"
}
}{
"post": {
"_id": "p1q2r3s4t5u6",
"content": {
"context": "## Why this post\n\nBitcoin price went above $100,000, and this is generating a lot of engagement on X. The latest episode had John Doe, who discussed the effect of Bitcoin price fluctutations.",
"title": "Bitcoin price increase",
"text": "Bitcoin just hit $100,000. Check out my latest episode on why that matters.",
"uploads": []
},
"meta": {
"channel": "a1b2c3d4e5f6",
"created": "2026-06-01T12:00:00.000Z",
"updated": "2026-06-01T12:00:00.000Z",
"synced": "2026-06-02T12:00:00.000Z",
"published": "2026-06-01T12:00:05.000Z",
"status": "PUBLISHED"
},
"platform": {
"type": "x",
"id": "1789012345678901234"
},
"source": {
"ids": [
"episode:id:abc123",
"show:id:xyz789"
],
"media": "https://media.fountain.fm/episodes/abc123.mp3",
"transcript": "the genesis block was mined in 2009",
"ts_start": 2477.91,
"ts_end": 2493.9
},
"stats": {
"views": 1240,
"likes": 87,
"comments": 12
}
}
}idstringrequiredThe post to delete.
200The post has been deleted succesfully.curl -X DELETE "https://api.fountain.fm/v1/social/posts/{id}" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY"