v1Resources/Distribution/postPreview a content package
Preview a content package
Validates a package for a client and reports what an import would do, item by item. Nothing is written.
post
distribution:write/api/v1/distribution/packages/previewQuery parameters
clientIdstringoptional
The client, when the body is a raw text/markdown file.
Request body
clientIdstringrequired
The client the package belongs to.
manifestobjectoptional
A synup.distribution/v1 manifest: the campaign, its files (assets) and one variant per destination post.
schemastring (synup.distribution/v1)required
campaignobjectrequired
externalIdstringrequired
versionintegerrequired
titlestringrequired
templatestringoptional
subjectstringoptional
canonicalUrlstringoptional
anchorVideoUrlstringoptional
customerReviewRequiredbooleanoptional
allowRawAssetsbooleanoptional
slackobjectoptional
teamIdstringoptional
channelIdstringoptional
threadTsstringoptional
assetsarray of objectrequired
idstringrequired
rolestring (video | image | cover | captions | document | raw)required
filenamestringrequired
mimestringrequired
bytesintegerrequired
sha256stringrequired
widthintegeroptional
heightintegeroptional
durationSecnumberoptional
languagestringoptional
sourceobjectoptional
urlstringoptional
provenanceobjectoptional
attributionRequiredbooleanoptional
customerReviewRequiredbooleanoptional
variantsarray of objectrequired
keystringrequired
platformstring (facebook | instagram | linkedin | x | pinterest | threads | bluesky | mastodon | reddit | medium | substack | vimeo | dailymotion | youtube | tiktok)required
connectionIdstringoptional
formatstring (feed | video | reel | short | image | carousel | article | link | text)optional
textstringoptional
titlestringoptional
descriptionstringoptional
mediaarray of stringoptional
coverstringoptional
captionsstringoptional
firstCommentstringoptional
linkobjectoptional
urlstringoptional
utmobjectoptional
articleobjectoptional
titlestringoptional
subtitlestringoptional
htmlstringoptional
redditobjectoptional
subredditstringoptional
flairstringoptional
postTypestring (text | link | image | video)optional
tagsarray of stringoptional
videoobjectoptional
privacystringoptional
categorystringoptional
isForKidsbooleanoptional
playlistIdstringoptional
tiktokobjectoptional
disableCommentbooleanoptional
disableDuetbooleanoptional
disableStitchbooleanoptional
brandContentbooleanoptional
suggestedAtstringoptional
timezonestringoptional
customerReviewRequiredbooleanoptional
markdownstringoptional
A Series Markdown file, sent instead of manifest.
fileNamestringoptional
The Markdown file's name. A .md name marks the string as Markdown.
filesarray of objectoptional
Size and sha256 of each file the Markdown names, matched by file name. Required to import a series that has files; the preview accepts it without them.
filenamestringrequired
bytesintegerrequired
sha256stringrequired
widthintegeroptional
heightintegeroptional
durationSecnumberoptional
urlstringoptional
An https link Synup fetches the file from, instead of you uploading it.
intoSeriesIdstringoptional
Import the file as the next version of this existing series.
Response
dataobjectoptional
campaignobjectoptional
versionintegeroptional
versionStatestring (new | unchanged | conflict | older)optional
itemsarray of objectoptional
kindstring (asset | variant)optional
refstringoptional
outcomestring (created | revised | unchanged | update_available | published_unchanged | skipped)optional
postIdstringoptional
assetIdstringoptional
messagesarray of stringoptional
countsobjectoptional
markdownobjectoptional
The Markdown file's own line-numbered errors and warnings, plus the posts and files it names. Errors must be fixed; warnings can be imported as they are.
titlestringoptional
timezonestringoptional
errorsintegeroptional
warningsintegeroptional
issuesarray of objectoptional
lineintegerrequired
The line in the file, counting from 1.
postIndexintegeroptional
The post the issue belongs to (its ## section), counting from 0.
severitystring (error | warning)required
codestringrequired
A stable code, for example unknown_network, file_not_declared or past_date.
paramsobjectrequired
postsarray of objectoptional
indexintegeroptional
lineintegeroptional
headingstringoptional
keystringoptional
platformstringoptional
includedbooleanoptional
filesarray of objectoptional
filenamestringoptional
assetIdstringoptional
rolestring (video | image | cover | captions | document)optional
mimestringoptional
lineintegeroptional
attachedbooleanoptional
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
409The request conflicts with the current state of the resource — for example, changing the email or phone of a recipient who has already been messaged, or a team invite that was already accepted (or hasn't been accepted yet).
429Too many requests. Retry after the number of seconds in the Retry-After header.
post/api/v1/distribution/packages/preview
Your API key
clientId
Request body*
{
"data": {
"campaign": {
"externalId": "topic-local-seo-2026-10",
"title": "Why local SEO still wins",
"exists": false,
"currentVersion": 0,
"template": "topic",
"customerReviewRequired": false
},
"version": 1,
"versionState": "new",
"items": [
{
"kind": "asset",
"ref": "short-1",
"outcome": "created",
"messages": []
},
{
"kind": "asset",
"ref": "short-1-cover",
"outcome": "created",
"messages": []
},
{
"kind": "variant",
"ref": "short-1-linkedin",
"outcome": "created",
"messages": []
},
{
"kind": "variant",
"ref": "short-1-instagram",
"outcome": "skipped",
"messages": [
"account con_999 is not one of this client's instagram accounts"
]
}
],
"counts": {
"assets": 2,
"variants": 2,
"skipped": 0
}
}
}