syndication

POST /v1/syndication/plans

Save a syndication plan.

All syndication endpoints

Authentication

Send an API key as a bearer token. This endpoint does not state a specific permission in the specification, so give your key the least it needs and check the response rather than assuming.

Where your organisation id goes

This endpoint takes org_id as a query parameter. Leave it out and the call covers your whole tenancy subtree; send it to narrow the call to one organisation.

Your organisation id is on the API keys screen in your dashboard, beside the key itself. It is the same id in every call you make.

Try it

Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.

curl -X POST https://api.zinndigital.com/v1/syndication/plans \
  -H "Authorization: Bearer zdk_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "scope": <string<post, recipe, org_default>> }'

Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console

Details

A plan for one article (`post`), for a recipe (`recipe`) or for everything (`org_default`); the most specific one wins and a disabled plan stops the search rather than falling through. `approval_mode` defaults to `hold` — owner ruling, 2026-08-20. Gated on `syndication.manage`.

Parameters

NameTypeRequiredWhat it is
org_id (query)stringNo

Request body

NameTypeRequiredWhat it is
scopestring<post, recipe, org_default>Yes
post_idstringNo
recipe_idstringNo
enabledbooleanNo
write_modestring<ai_per_channel, one_text>No
approval_modestring<hold, send>No
connection_idsstring[]No

Response

NameTypeRequiredWhat it is
idstringYes
scopestring<post, recipe, org_default>YesMost specific wins — an article's own plan beats its recipe's beats the org default.
post_idstringYes
recipe_idstringYes
enabledbooleanYes
write_modestring<ai_per_channel, one_text>Yes⚖️ Owner ruling 2026-08-20 — the AI writes per channel by default, because an X post and a LinkedIn update are not the same piece of writing.
approval_modestring<hold, send>Yes⚖️ Owner ruling 2026-08-20 — hold for approval by default.
channelsSyndicationPlanChannel[]Yes
created_atstringYes

Errors this endpoint can return

401 · 403 · 422