Posts
Publish now, schedule, queue or save drafts to one or many accounts.
Create a post
Section titled “Create a post”/v1/postsPublishes now unless you send scheduledFor, queue: true or draft: true. Each target is one account and can carry its own text, media and network options (instagram, youtube, tiktok…). TikTok targets always need tiktok options.
Body
contentstringrequiredText posted to every target that has no content of its own.
mediaobject[]Images, videos or documents. Upload them first with POST /v1/media/upload-url.
media
typestringrequiredurlstring (uri)requiredaltTextstring
targetsobject[]requiredtargets
accountIdstringrequiredA connected account (GET /v1/accounts).
contentstringReplaces the post text on this network.
mediaobject[]media
typestringrequiredurlstring (uri)requiredaltTextstring
youtubeobjectyoutube
titlestringVideo title (up to 100 characters).
visibilitystringpublic,unlistedorprivate.madeForKidsbooleanCOPPA flag. YouTube may limit videos that do not set it.
categoryIdstringNumeric YouTube category id.
playlistIdstringAdd it to this playlist.
tagsstring[]Tags (500 characters in total).
firstCommentstringComment posted right after.
thumbnailUrlstring (uri)Custom thumbnail.
containsSyntheticMediabooleanContains realistic AI-generated or altered content.
notifySubscribersbooleanfalseuploads it without notifying subscribers.
tiktokobjecttiktok
privacystringrequiredWho sees it:
public,friends,followersorprivate.allowCommentsbooleanrequiredAllow comments.
allowDuetbooleanAllow duets.
allowStitchbooleanAllow stitches.
commercialContentstringown_brandwhen it promotes your business,paid_partnershipwhen sponsored. Not withprivateprivacy.autoAddMusicbooleanPhotos only: TikTok may add recommended music.
consenttruerequiredAlways
true: the user saw the preview and agreed to post.
instagramobjectinstagram
formatstringfeed,reelorstory. By default images go to the feed and a video is a Reel.shareToFeedbooleanReels only:
falsekeeps it out of the profile grid.collaboratorsstring[]Up to 3 business or creator usernames invited as collaborators. Not for Stories.
firstCommentstringComment posted right after. Not for Stories.
coverUrlstring (uri)Reels only: cover image.
facebookobjectfacebook
formatstringfeed,reelorstory.reelTitlestringReels only: a title separate from the text.
firstCommentstringComment posted right after. Not for Stories.
linkedinobjectlinkedin
firstCommentstringComment posted right after.
disableLinkPreviewbooleanHide the link preview.
documentTitlestringTitle of document (PDF) posts.
xobjectx
threadstring[]Thread replies, in order. The post’s text is the first tweet.
replySettingsstringWho can reply:
following,mentionedUsers,subscribersorverified.
threadsobjectthreads
threadstring[]Thread replies, in order.
topicTagstringTopic of the post.
firstCommentstringComment posted right after.
blueskyobjectbluesky
threadstring[]Thread replies, in order.
pinterestobjectpinterest
titlestringPin title.
linkstring (uri)Where the Pin leads.
boardIdstringBoard. Defaults to the one picked when connecting.
googleBusinessobjectgoogleBusiness
callToActionobjectThe post’s button.
callToAction
typestringrequiredlearn_more,book,order,shop,sign_uporcall.urlstring (uri)Where the button leads. Required except for
call.
telegramobjecttelegram
parseModestringText format:
htmlormarkdown.disableLinkPreviewbooleanHide the link preview.
silentbooleanSend without sound.
protectContentbooleanPrevent forwarding or saving it.
snapchatobjectsnapchat
formatstringstory(gone after 24 h),saved_story(stays on the profile) orspotlight.
redditobjectreddit
subredditstringSubreddit without
r/.titlestringPost title.
linkstring (uri)Makes it a link post.
flairIdstringSubreddit flair.
nsfwbooleanMark it NSFW.
spoilerbooleanMark it as a spoiler.
scheduledForstring (date-time)When to publish (ISO 8601 with offset). Omit to publish now.
timezonestringIANA timezone that scheduledFor refers to.
queuebooleanTake the next free slot of the profile's queue.
draftbooleanSave without publishing or scheduling.
requiresApprovalbooleanHold it as
pending_approvaluntil an owner or admin approves it. Members of a workspace that requires approval always get it.
Response 201
data
idstringrequiredcontentstringrequiredmediaobject[]requiredmedia
typestringrequiredurlstring (uri)requiredaltTextstring
targetsobject[]requiredtargets
accountIdstringrequiredplatformstringrequiredcontentstringmediaobject[]media
typestringrequiredurlstring (uri)requiredaltTextstring
statusstringrequiredurlstring (uri)The live post, once published.
errorstring
statusstringrequiredscheduledForstring (date-time)approvalobjectPresent once the post went through review.
approval
requestedBystringUser who asked for it; absent when an API key did.
requestedAtstring (date-time)requiredqueuebooleanApproving puts it in the profile’s queue.
decisionstringdecidedBystringdecidedAtstring (date-time)notestringWhy it was rejected.
recyclingobjectPresent once recycling was turned on.
recycling
activebooleanrequiredeveryintegerrequiredunitstringrequiredstartAtstring (date-time)maxCopiesintegeruntilstring (date-time)variationsstring[]timezonestringcopiesintegerrequiredCopies created so far.
nextAtstring (date-time)When the next copy goes out; absent once it stopped.
lastCopyIdstringThe latest copy, a post of its own.
recycledFromstringOn a recycled copy: the original post.
createdAtstring (date-time)requiredupdatedAtstring (date-time)required
curl -X POST "https://api.usecrier.com/v1/posts" \ -H "Authorization: Bearer $CRIER_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "content": "Our autumn collection is here 🍂", "media": [ { "type": "image", "url": "https://cdn.acme.com/autumn.jpg" } ], "targets": [ { "accountId": "acc_3k9x2m" }, { "accountId": "acc_9z8y7x", "youtube": { "title": "Autumn collection" } } ], "scheduledFor": "2026-10-30T09:00:00+01:00" }'const res = await fetch('https://api.usecrier.com/v1/posts', { method: 'POST', headers: { Authorization: `Bearer ${process.env.CRIER_API_KEY}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ "content": "Our autumn collection is here 🍂", "media": [ { "type": "image", "url": "https://cdn.acme.com/autumn.jpg" } ], "targets": [ { "accountId": "acc_3k9x2m" }, { "accountId": "acc_9z8y7x", "youtube": { "title": "Autumn collection" } } ], "scheduledFor": "2026-10-30T09:00:00+01:00" }),});const { data } = await res.json();import os, requests
res = requests.post( "https://api.usecrier.com/v1/posts", headers={"Authorization": f"Bearer {os.environ['CRIER_API_KEY']}"}, json={ "content": "Our autumn collection is here 🍂", "media": [ { "type": "image", "url": "https://cdn.acme.com/autumn.jpg" } ], "targets": [ { "accountId": "acc_3k9x2m" }, { "accountId": "acc_9z8y7x", "youtube": { "title": "Autumn collection" } } ], "scheduledFor": "2026-10-30T09:00:00+01:00" },)data = res.json()["data"]List posts
Section titled “List posts”/v1/postsNewest first.
Parameters
limitinteger
Response 200
data []
idstringrequiredcontentstringrequiredmediaobject[]requiredmedia
typestringrequiredurlstring (uri)requiredaltTextstring
targetsobject[]requiredtargets
accountIdstringrequiredplatformstringrequiredcontentstringmediaobject[]media
typestringrequiredurlstring (uri)requiredaltTextstring
statusstringrequiredurlstring (uri)The live post, once published.
errorstring
statusstringrequiredscheduledForstring (date-time)approvalobjectPresent once the post went through review.
approval
requestedBystringUser who asked for it; absent when an API key did.
requestedAtstring (date-time)requiredqueuebooleanApproving puts it in the profile’s queue.
decisionstringdecidedBystringdecidedAtstring (date-time)notestringWhy it was rejected.
recyclingobjectPresent once recycling was turned on.
recycling
activebooleanrequiredeveryintegerrequiredunitstringrequiredstartAtstring (date-time)maxCopiesintegeruntilstring (date-time)variationsstring[]timezonestringcopiesintegerrequiredCopies created so far.
nextAtstring (date-time)When the next copy goes out; absent once it stopped.
lastCopyIdstringThe latest copy, a post of its own.
recycledFromstringOn a recycled copy: the original post.
createdAtstring (date-time)requiredupdatedAtstring (date-time)required
curl "https://api.usecrier.com/v1/posts?limit=20" \ -H "Authorization: Bearer $CRIER_API_KEY"const res = await fetch('https://api.usecrier.com/v1/posts?limit=20', { headers: { Authorization: `Bearer ${process.env.CRIER_API_KEY}`, },});const { data } = await res.json();import os, requests
res = requests.get( "https://api.usecrier.com/v1/posts?limit=20", headers={"Authorization": f"Bearer {os.environ['CRIER_API_KEY']}"},)data = res.json()["data"]Import posts from a CSV
Section titled “Import posts from a CSV”/v1/posts/importOne post per row, up to 50 rows. Columns: content, accounts (ids separated by |) or group, schedule_time, timezone, queue, draft, media_urls and per-network columns (see the CSV import guide). Send dryRun: true first to check every row without posting.
Body
csvstringrequiredThe CSV text, header row first.
dryRunbooleanCheck every row without posting.
Response 200
data
totalintegerrequiredvalidintegerrequiredinvalidintegerrequireddryRunbooleanrequiredunknownColumnsstring[]requiredColumns that were ignored.
rowsobject[]requiredrows
rowintegerrequired1-based, header excluded.
okbooleanrequiredpostIdstringerrorstring
curl -X POST "https://api.usecrier.com/v1/posts/import" \ -H "Authorization: Bearer $CRIER_API_KEY"const res = await fetch('https://api.usecrier.com/v1/posts/import', { method: 'POST', headers: { Authorization: `Bearer ${process.env.CRIER_API_KEY}`, },});const { data } = await res.json();import os, requests
res = requests.post( "https://api.usecrier.com/v1/posts/import", headers={"Authorization": f"Bearer {os.environ['CRIER_API_KEY']}"},)data = res.json()["data"]Change a post that is not live
Section titled “Change a post that is not live”/v1/posts/{id}Drafts, scheduled, failed and cancelled posts. Fields you leave out keep their value; targets replaces the whole list. draft: false publishes a draft now, or at scheduledFor, or in the queue.
Parameters
idstringrequired
Body
contentstringText posted to every target that has no content of its own.
mediaobject[]Images, videos or documents. Upload them first with POST /v1/media/upload-url.
media
typestringrequiredurlstring (uri)requiredaltTextstring
targetsobject[]targets
accountIdstringrequiredA connected account (GET /v1/accounts).
contentstringReplaces the post text on this network.
mediaobject[]media
typestringrequiredurlstring (uri)requiredaltTextstring
youtubeobjectyoutube
titlestringVideo title (up to 100 characters).
visibilitystringpublic,unlistedorprivate.madeForKidsbooleanCOPPA flag. YouTube may limit videos that do not set it.
categoryIdstringNumeric YouTube category id.
playlistIdstringAdd it to this playlist.
tagsstring[]Tags (500 characters in total).
firstCommentstringComment posted right after.
thumbnailUrlstring (uri)Custom thumbnail.
containsSyntheticMediabooleanContains realistic AI-generated or altered content.
notifySubscribersbooleanfalseuploads it without notifying subscribers.
tiktokobjecttiktok
privacystringrequiredWho sees it:
public,friends,followersorprivate.allowCommentsbooleanrequiredAllow comments.
allowDuetbooleanAllow duets.
allowStitchbooleanAllow stitches.
commercialContentstringown_brandwhen it promotes your business,paid_partnershipwhen sponsored. Not withprivateprivacy.autoAddMusicbooleanPhotos only: TikTok may add recommended music.
consenttruerequiredAlways
true: the user saw the preview and agreed to post.
instagramobjectinstagram
formatstringfeed,reelorstory. By default images go to the feed and a video is a Reel.shareToFeedbooleanReels only:
falsekeeps it out of the profile grid.collaboratorsstring[]Up to 3 business or creator usernames invited as collaborators. Not for Stories.
firstCommentstringComment posted right after. Not for Stories.
coverUrlstring (uri)Reels only: cover image.
facebookobjectfacebook
formatstringfeed,reelorstory.reelTitlestringReels only: a title separate from the text.
firstCommentstringComment posted right after. Not for Stories.
linkedinobjectlinkedin
firstCommentstringComment posted right after.
disableLinkPreviewbooleanHide the link preview.
documentTitlestringTitle of document (PDF) posts.
xobjectx
threadstring[]Thread replies, in order. The post’s text is the first tweet.
replySettingsstringWho can reply:
following,mentionedUsers,subscribersorverified.
threadsobjectthreads
threadstring[]Thread replies, in order.
topicTagstringTopic of the post.
firstCommentstringComment posted right after.
blueskyobjectbluesky
threadstring[]Thread replies, in order.
pinterestobjectpinterest
titlestringPin title.
linkstring (uri)Where the Pin leads.
boardIdstringBoard. Defaults to the one picked when connecting.
googleBusinessobjectgoogleBusiness
callToActionobjectThe post’s button.
callToAction
typestringrequiredlearn_more,book,order,shop,sign_uporcall.urlstring (uri)Where the button leads. Required except for
call.
telegramobjecttelegram
parseModestringText format:
htmlormarkdown.disableLinkPreviewbooleanHide the link preview.
silentbooleanSend without sound.
protectContentbooleanPrevent forwarding or saving it.
snapchatobjectsnapchat
formatstringstory(gone after 24 h),saved_story(stays on the profile) orspotlight.
redditobjectreddit
subredditstringSubreddit without
r/.titlestringPost title.
linkstring (uri)Makes it a link post.
flairIdstringSubreddit flair.
nsfwbooleanMark it NSFW.
spoilerbooleanMark it as a spoiler.
scheduledForstring (date-time)When to publish (ISO 8601 with offset). Omit to publish now.
timezonestringIANA timezone that scheduledFor refers to.
queuebooleanTake the next free slot of the profile's queue.
draftbooleanSave without publishing or scheduling.
requiresApprovalbooleanHold it as
pending_approvaluntil an owner or admin approves it. Members of a workspace that requires approval always get it.
Response 200
data
idstringrequiredcontentstringrequiredmediaobject[]requiredmedia
typestringrequiredurlstring (uri)requiredaltTextstring
targetsobject[]requiredtargets
accountIdstringrequiredplatformstringrequiredcontentstringmediaobject[]media
typestringrequiredurlstring (uri)requiredaltTextstring
statusstringrequiredurlstring (uri)The live post, once published.
errorstring
statusstringrequiredscheduledForstring (date-time)approvalobjectPresent once the post went through review.
approval
requestedBystringUser who asked for it; absent when an API key did.
requestedAtstring (date-time)requiredqueuebooleanApproving puts it in the profile’s queue.
decisionstringdecidedBystringdecidedAtstring (date-time)notestringWhy it was rejected.
recyclingobjectPresent once recycling was turned on.
recycling
activebooleanrequiredeveryintegerrequiredunitstringrequiredstartAtstring (date-time)maxCopiesintegeruntilstring (date-time)variationsstring[]timezonestringcopiesintegerrequiredCopies created so far.
nextAtstring (date-time)When the next copy goes out; absent once it stopped.
lastCopyIdstringThe latest copy, a post of its own.
recycledFromstringOn a recycled copy: the original post.
createdAtstring (date-time)requiredupdatedAtstring (date-time)required
curl -X PATCH "https://api.usecrier.com/v1/posts/pst_7q1w0e" \ -H "Authorization: Bearer $CRIER_API_KEY"const res = await fetch('https://api.usecrier.com/v1/posts/pst_7q1w0e', { method: 'PATCH', headers: { Authorization: `Bearer ${process.env.CRIER_API_KEY}`, },});const { data } = await res.json();import os, requests
res = requests.patch( "https://api.usecrier.com/v1/posts/pst_7q1w0e", headers={"Authorization": f"Bearer {os.environ['CRIER_API_KEY']}"},)data = res.json()["data"]Get a post
Section titled “Get a post”/v1/posts/{id}Parameters
idstringrequired
Response 200
data
idstringrequiredcontentstringrequiredmediaobject[]requiredmedia
typestringrequiredurlstring (uri)requiredaltTextstring
targetsobject[]requiredtargets
accountIdstringrequiredplatformstringrequiredcontentstringmediaobject[]media
typestringrequiredurlstring (uri)requiredaltTextstring
statusstringrequiredurlstring (uri)The live post, once published.
errorstring
statusstringrequiredscheduledForstring (date-time)approvalobjectPresent once the post went through review.
approval
requestedBystringUser who asked for it; absent when an API key did.
requestedAtstring (date-time)requiredqueuebooleanApproving puts it in the profile’s queue.
decisionstringdecidedBystringdecidedAtstring (date-time)notestringWhy it was rejected.
recyclingobjectPresent once recycling was turned on.
recycling
activebooleanrequiredeveryintegerrequiredunitstringrequiredstartAtstring (date-time)maxCopiesintegeruntilstring (date-time)variationsstring[]timezonestringcopiesintegerrequiredCopies created so far.
nextAtstring (date-time)When the next copy goes out; absent once it stopped.
lastCopyIdstringThe latest copy, a post of its own.
recycledFromstringOn a recycled copy: the original post.
createdAtstring (date-time)requiredupdatedAtstring (date-time)required
curl "https://api.usecrier.com/v1/posts/pst_7q1w0e" \ -H "Authorization: Bearer $CRIER_API_KEY"const res = await fetch('https://api.usecrier.com/v1/posts/pst_7q1w0e', { headers: { Authorization: `Bearer ${process.env.CRIER_API_KEY}`, },});const { data } = await res.json();import os, requests
res = requests.get( "https://api.usecrier.com/v1/posts/pst_7q1w0e", headers={"Authorization": f"Bearer {os.environ['CRIER_API_KEY']}"},)data = res.json()["data"]Delete a post
Section titled “Delete a post”/v1/posts/{id}Removes it from Crier. A post that is still live must be unpublished first.
Parameters
idstringrequired
Response 204
No content
curl -X DELETE "https://api.usecrier.com/v1/posts/pst_7q1w0e" \ -H "Authorization: Bearer $CRIER_API_KEY"await fetch('https://api.usecrier.com/v1/posts/pst_7q1w0e', { method: 'DELETE', headers: { Authorization: `Bearer ${process.env.CRIER_API_KEY}`, },});import os, requests
requests.delete( "https://api.usecrier.com/v1/posts/pst_7q1w0e", headers={"Authorization": f"Bearer {os.environ['CRIER_API_KEY']}"},)Edit the text of a live post
Section titled “Edit the text of a live post”/v1/posts/{id}/editOn X (Premium accounts, within 1 hour), Facebook, LinkedIn, YouTube, Pinterest, Google Business, Telegram, Discord and Reddit. Media cannot change.
Parameters
idstringrequired
Body
contentstringrequiredThe new text of the live post.
accountIdstringEdit only this account’s copy; every live copy otherwise.
Response 200
data
idstringrequiredcontentstringrequiredmediaobject[]requiredmedia
typestringrequiredurlstring (uri)requiredaltTextstring
targetsobject[]requiredtargets
accountIdstringrequiredplatformstringrequiredcontentstringmediaobject[]media
typestringrequiredurlstring (uri)requiredaltTextstring
statusstringrequiredurlstring (uri)The live post, once published.
errorstring
statusstringrequiredscheduledForstring (date-time)approvalobjectPresent once the post went through review.
approval
requestedBystringUser who asked for it; absent when an API key did.
requestedAtstring (date-time)requiredqueuebooleanApproving puts it in the profile’s queue.
decisionstringdecidedBystringdecidedAtstring (date-time)notestringWhy it was rejected.
recyclingobjectPresent once recycling was turned on.
recycling
activebooleanrequiredeveryintegerrequiredunitstringrequiredstartAtstring (date-time)maxCopiesintegeruntilstring (date-time)variationsstring[]timezonestringcopiesintegerrequiredCopies created so far.
nextAtstring (date-time)When the next copy goes out; absent once it stopped.
lastCopyIdstringThe latest copy, a post of its own.
recycledFromstringOn a recycled copy: the original post.
createdAtstring (date-time)requiredupdatedAtstring (date-time)required
curl -X POST "https://api.usecrier.com/v1/posts/pst_7q1w0e/edit" \ -H "Authorization: Bearer $CRIER_API_KEY"const res = await fetch('https://api.usecrier.com/v1/posts/pst_7q1w0e/edit', { method: 'POST', headers: { Authorization: `Bearer ${process.env.CRIER_API_KEY}`, },});const { data } = await res.json();import os, requests
res = requests.post( "https://api.usecrier.com/v1/posts/pst_7q1w0e/edit", headers={"Authorization": f"Bearer {os.environ['CRIER_API_KEY']}"},)data = res.json()["data"]Get the metrics of a post
Section titled “Get the metrics of a post”/v1/posts/{id}/metricsImpressions, reach, views, likes, comments, shares, saves and clicks, in total and per account. Each network reports its own subset.
Parameters
idstringrequired
Response 200
data
totalobjectrequiredtotal
impressionsintegerrequiredreachintegerrequiredviewsintegerrequiredlikesintegerrequiredcommentsintegerrequiredsharesintegerrequiredsavesintegerrequiredclicksintegerrequiredengagementRatenumberrequiredPercentage: interactions over impressions (or reach).
targetsobject[]requiredtargets
accountIdstringrequiredplatformstringrequiredmetricsobjectrequiredmetrics
impressionsintegerrequiredreachintegerrequiredviewsintegerrequiredlikesintegerrequiredcommentsintegerrequiredsharesintegerrequiredsavesintegerrequiredclicksintegerrequiredengagementRatenumberrequiredPercentage: interactions over impressions (or reach).
updatedAtstring (date-time)
curl "https://api.usecrier.com/v1/posts/pst_7q1w0e/metrics" \ -H "Authorization: Bearer $CRIER_API_KEY"const res = await fetch('https://api.usecrier.com/v1/posts/pst_7q1w0e/metrics', { headers: { Authorization: `Bearer ${process.env.CRIER_API_KEY}`, },});const { data } = await res.json();import os, requests
res = requests.get( "https://api.usecrier.com/v1/posts/pst_7q1w0e/metrics", headers={"Authorization": f"Bearer {os.environ['CRIER_API_KEY']}"},)data = res.json()["data"]Cancel a scheduled post, draft or post waiting for approval
Section titled “Cancel a scheduled post, draft or post waiting for approval”/v1/posts/{id}/cancelParameters
idstringrequired
Response 200
data
idstringrequiredcontentstringrequiredmediaobject[]requiredmedia
typestringrequiredurlstring (uri)requiredaltTextstring
targetsobject[]requiredtargets
accountIdstringrequiredplatformstringrequiredcontentstringmediaobject[]media
typestringrequiredurlstring (uri)requiredaltTextstring
statusstringrequiredurlstring (uri)The live post, once published.
errorstring
statusstringrequiredscheduledForstring (date-time)approvalobjectPresent once the post went through review.
approval
requestedBystringUser who asked for it; absent when an API key did.
requestedAtstring (date-time)requiredqueuebooleanApproving puts it in the profile’s queue.
decisionstringdecidedBystringdecidedAtstring (date-time)notestringWhy it was rejected.
recyclingobjectPresent once recycling was turned on.
recycling
activebooleanrequiredeveryintegerrequiredunitstringrequiredstartAtstring (date-time)maxCopiesintegeruntilstring (date-time)variationsstring[]timezonestringcopiesintegerrequiredCopies created so far.
nextAtstring (date-time)When the next copy goes out; absent once it stopped.
lastCopyIdstringThe latest copy, a post of its own.
recycledFromstringOn a recycled copy: the original post.
createdAtstring (date-time)requiredupdatedAtstring (date-time)required
curl -X POST "https://api.usecrier.com/v1/posts/pst_7q1w0e/cancel" \ -H "Authorization: Bearer $CRIER_API_KEY"const res = await fetch('https://api.usecrier.com/v1/posts/pst_7q1w0e/cancel', { method: 'POST', headers: { Authorization: `Bearer ${process.env.CRIER_API_KEY}`, },});const { data } = await res.json();import os, requests
res = requests.post( "https://api.usecrier.com/v1/posts/pst_7q1w0e/cancel", headers={"Authorization": f"Bearer {os.environ['CRIER_API_KEY']}"},)data = res.json()["data"]Approve or reject a post
Section titled “Approve or reject a post”/v1/posts/{id}/reviewOnly for posts in pending_approval, by owners, admins or an API key. Approving schedules it for its date, puts it in the queue if it asked for one, or publishes it now if its date already passed. Rejecting returns it to draft with the note and sends post.rejected.
Parameters
idstringrequired
Body
decisionstringrequiredapproveschedules it (or publishes it now if its date passed);rejectreturns it to draft.notestringWhy, for whoever wrote it. Shown with the draft after a rejection.
Response 200
data
idstringrequiredcontentstringrequiredmediaobject[]requiredmedia
typestringrequiredurlstring (uri)requiredaltTextstring
targetsobject[]requiredtargets
accountIdstringrequiredplatformstringrequiredcontentstringmediaobject[]media
typestringrequiredurlstring (uri)requiredaltTextstring
statusstringrequiredurlstring (uri)The live post, once published.
errorstring
statusstringrequiredscheduledForstring (date-time)approvalobjectPresent once the post went through review.
approval
requestedBystringUser who asked for it; absent when an API key did.
requestedAtstring (date-time)requiredqueuebooleanApproving puts it in the profile’s queue.
decisionstringdecidedBystringdecidedAtstring (date-time)notestringWhy it was rejected.
recyclingobjectPresent once recycling was turned on.
recycling
activebooleanrequiredeveryintegerrequiredunitstringrequiredstartAtstring (date-time)maxCopiesintegeruntilstring (date-time)variationsstring[]timezonestringcopiesintegerrequiredCopies created so far.
nextAtstring (date-time)When the next copy goes out; absent once it stopped.
lastCopyIdstringThe latest copy, a post of its own.
recycledFromstringOn a recycled copy: the original post.
createdAtstring (date-time)requiredupdatedAtstring (date-time)required
curl -X POST "https://api.usecrier.com/v1/posts/pst_7q1w0e/review" \ -H "Authorization: Bearer $CRIER_API_KEY"const res = await fetch('https://api.usecrier.com/v1/posts/pst_7q1w0e/review', { method: 'POST', headers: { Authorization: `Bearer ${process.env.CRIER_API_KEY}`, },});const { data } = await res.json();import os, requests
res = requests.post( "https://api.usecrier.com/v1/posts/pst_7q1w0e/review", headers={"Authorization": f"Bearer {os.environ['CRIER_API_KEY']}"},)data = res.json()["data"]Recycle a post
Section titled “Recycle a post”/v1/posts/{id}/recyclingPosts it again every every weeks or months as a new post (recycledFrom points back), until maxCopies or until. YouTube and TikTok targets are left out of the copies, and each account can have up to 10 posts recycling. Sending it again changes the rule and keeps the count.
Parameters
idstringrequired
Body
everyintegerrequiredHow many units between copies.
unitstringrequiredweekormonth.startAtstring (date-time)When the first copy goes out. Defaults to one interval after the post’s date; for an old post, the next date of that series, at the same time of day.
maxCopiesintegerStop after this many copies.
untilstring (date-time)Stop after this date.
variationsstring[]Texts used in turn instead of the post’s text. A target’s own text still wins. Recommended for X and Pinterest, which flag repeats.
timezonestringIANA time zone (e.g.
Europe/Madrid) the interval is counted in, so copies keep their local time when the clocks change. UTC by default.
Response 200
data
idstringrequiredcontentstringrequiredmediaobject[]requiredmedia
typestringrequiredurlstring (uri)requiredaltTextstring
targetsobject[]requiredtargets
accountIdstringrequiredplatformstringrequiredcontentstringmediaobject[]media
typestringrequiredurlstring (uri)requiredaltTextstring
statusstringrequiredurlstring (uri)The live post, once published.
errorstring
statusstringrequiredscheduledForstring (date-time)approvalobjectPresent once the post went through review.
approval
requestedBystringUser who asked for it; absent when an API key did.
requestedAtstring (date-time)requiredqueuebooleanApproving puts it in the profile’s queue.
decisionstringdecidedBystringdecidedAtstring (date-time)notestringWhy it was rejected.
recyclingobjectPresent once recycling was turned on.
recycling
activebooleanrequiredeveryintegerrequiredunitstringrequiredstartAtstring (date-time)maxCopiesintegeruntilstring (date-time)variationsstring[]timezonestringcopiesintegerrequiredCopies created so far.
nextAtstring (date-time)When the next copy goes out; absent once it stopped.
lastCopyIdstringThe latest copy, a post of its own.
recycledFromstringOn a recycled copy: the original post.
createdAtstring (date-time)requiredupdatedAtstring (date-time)required
curl -X PUT "https://api.usecrier.com/v1/posts/pst_7q1w0e/recycling" \ -H "Authorization: Bearer $CRIER_API_KEY"const res = await fetch('https://api.usecrier.com/v1/posts/pst_7q1w0e/recycling', { method: 'PUT', headers: { Authorization: `Bearer ${process.env.CRIER_API_KEY}`, },});const { data } = await res.json();import os, requests
res = requests.put( "https://api.usecrier.com/v1/posts/pst_7q1w0e/recycling", headers={"Authorization": f"Bearer {os.environ['CRIER_API_KEY']}"},)data = res.json()["data"]Stop recycling a post
Section titled “Stop recycling a post”/v1/posts/{id}/recyclingCopies already created stay as they are.
Parameters
idstringrequired
Response 200
data
idstringrequiredcontentstringrequiredmediaobject[]requiredmedia
typestringrequiredurlstring (uri)requiredaltTextstring
targetsobject[]requiredtargets
accountIdstringrequiredplatformstringrequiredcontentstringmediaobject[]media
typestringrequiredurlstring (uri)requiredaltTextstring
statusstringrequiredurlstring (uri)The live post, once published.
errorstring
statusstringrequiredscheduledForstring (date-time)approvalobjectPresent once the post went through review.
approval
requestedBystringUser who asked for it; absent when an API key did.
requestedAtstring (date-time)requiredqueuebooleanApproving puts it in the profile’s queue.
decisionstringdecidedBystringdecidedAtstring (date-time)notestringWhy it was rejected.
recyclingobjectPresent once recycling was turned on.
recycling
activebooleanrequiredeveryintegerrequiredunitstringrequiredstartAtstring (date-time)maxCopiesintegeruntilstring (date-time)variationsstring[]timezonestringcopiesintegerrequiredCopies created so far.
nextAtstring (date-time)When the next copy goes out; absent once it stopped.
lastCopyIdstringThe latest copy, a post of its own.
recycledFromstringOn a recycled copy: the original post.
createdAtstring (date-time)requiredupdatedAtstring (date-time)required
curl -X DELETE "https://api.usecrier.com/v1/posts/pst_7q1w0e/recycling" \ -H "Authorization: Bearer $CRIER_API_KEY"await fetch('https://api.usecrier.com/v1/posts/pst_7q1w0e/recycling', { method: 'DELETE', headers: { Authorization: `Bearer ${process.env.CRIER_API_KEY}`, },});import os, requests
requests.delete( "https://api.usecrier.com/v1/posts/pst_7q1w0e/recycling", headers={"Authorization": f"Bearer {os.environ['CRIER_API_KEY']}"},)Retry the failed targets
Section titled “Retry the failed targets”/v1/posts/{id}/retryParameters
idstringrequired
Response 200
data
idstringrequiredcontentstringrequiredmediaobject[]requiredmedia
typestringrequiredurlstring (uri)requiredaltTextstring
targetsobject[]requiredtargets
accountIdstringrequiredplatformstringrequiredcontentstringmediaobject[]media
typestringrequiredurlstring (uri)requiredaltTextstring
statusstringrequiredurlstring (uri)The live post, once published.
errorstring
statusstringrequiredscheduledForstring (date-time)approvalobjectPresent once the post went through review.
approval
requestedBystringUser who asked for it; absent when an API key did.
requestedAtstring (date-time)requiredqueuebooleanApproving puts it in the profile’s queue.
decisionstringdecidedBystringdecidedAtstring (date-time)notestringWhy it was rejected.
recyclingobjectPresent once recycling was turned on.
recycling
activebooleanrequiredeveryintegerrequiredunitstringrequiredstartAtstring (date-time)maxCopiesintegeruntilstring (date-time)variationsstring[]timezonestringcopiesintegerrequiredCopies created so far.
nextAtstring (date-time)When the next copy goes out; absent once it stopped.
lastCopyIdstringThe latest copy, a post of its own.
recycledFromstringOn a recycled copy: the original post.
createdAtstring (date-time)requiredupdatedAtstring (date-time)required
curl -X POST "https://api.usecrier.com/v1/posts/pst_7q1w0e/retry" \ -H "Authorization: Bearer $CRIER_API_KEY"const res = await fetch('https://api.usecrier.com/v1/posts/pst_7q1w0e/retry', { method: 'POST', headers: { Authorization: `Bearer ${process.env.CRIER_API_KEY}`, },});const { data } = await res.json();import os, requests
res = requests.post( "https://api.usecrier.com/v1/posts/pst_7q1w0e/retry", headers={"Authorization": f"Bearer {os.environ['CRIER_API_KEY']}"},)data = res.json()["data"]Take a published post down
Section titled “Take a published post down”/v1/posts/{id}/unpublishFrom every network, or only from accountId.
Parameters
idstringrequired
Body
accountIdstring
Response 200
data
idstringrequiredcontentstringrequiredmediaobject[]requiredmedia
typestringrequiredurlstring (uri)requiredaltTextstring
targetsobject[]requiredtargets
accountIdstringrequiredplatformstringrequiredcontentstringmediaobject[]media
typestringrequiredurlstring (uri)requiredaltTextstring
statusstringrequiredurlstring (uri)The live post, once published.
errorstring
statusstringrequiredscheduledForstring (date-time)approvalobjectPresent once the post went through review.
approval
requestedBystringUser who asked for it; absent when an API key did.
requestedAtstring (date-time)requiredqueuebooleanApproving puts it in the profile’s queue.
decisionstringdecidedBystringdecidedAtstring (date-time)notestringWhy it was rejected.
recyclingobjectPresent once recycling was turned on.
recycling
activebooleanrequiredeveryintegerrequiredunitstringrequiredstartAtstring (date-time)maxCopiesintegeruntilstring (date-time)variationsstring[]timezonestringcopiesintegerrequiredCopies created so far.
nextAtstring (date-time)When the next copy goes out; absent once it stopped.
lastCopyIdstringThe latest copy, a post of its own.
recycledFromstringOn a recycled copy: the original post.
createdAtstring (date-time)requiredupdatedAtstring (date-time)required
curl -X POST "https://api.usecrier.com/v1/posts/pst_7q1w0e/unpublish" \ -H "Authorization: Bearer $CRIER_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "accountId": "acc_3k9x2m" }'const res = await fetch('https://api.usecrier.com/v1/posts/pst_7q1w0e/unpublish', { method: 'POST', headers: { Authorization: `Bearer ${process.env.CRIER_API_KEY}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ "accountId": "acc_3k9x2m" }),});const { data } = await res.json();import os, requests
res = requests.post( "https://api.usecrier.com/v1/posts/pst_7q1w0e/unpublish", headers={"Authorization": f"Bearer {os.environ['CRIER_API_KEY']}"}, json={ "accountId": "acc_3k9x2m" },)data = res.json()["data"]© 2026 Crier by TWOFACES ·usecrier.com ·Dashboard ·soporte@twofacesco.com