links

GET /v1/content/targets

Which of your sites can receive a post, and why the rest cannot.

All links endpoints

All developer docs →

Authentication

Send an API key as a bearer token. The key must carry the links.view permission; a key without it is refused with 403, not 404.

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 GET https://api.zinndigital.com/v1/content/targets \
  -H "Authorization: Bearer zdk_live_…"

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

Every live site in scope with its suitability: can it take an article, and — when it cannot — whose fact that is. Gated on links.view. ⛔⛔ suitability has five values and the difference between two of them is the whole point of this endpoint. unsuitable is measured: every adapter was asked which sites it claims and each one declined, so this kind of site genuinely has nowhere to put an article. unknown means we could not determine it — the box was unreachable, the credential has never been tested, or nothing has checked this site yet. A client MUST NOT render unknown as a refusal, MUST NOT silently exclude it from a selection, and SHOULD count it separately in any confirmation ("9 ready, 3 unchecked"). Treating "we could not look" as "no" is the defect this endpoint exists to prevent. ⛔ This endpoint makes no outbound calls. Suitability is served from the last stored probe with checkedAt beside it, because probing every row of a 500-site page would be an uncached external call in an interactive path. checkedAt: null means never checked and MUST be shown as such, not as a fresh result. Use probeContentTargets to refresh. ⭐ requires takes capability ids a recipe needs; each row then carries missingCapabilities, so an editor can grey a site out and say what it cannot do. A site whose capabilities are not established reports nothing missing rather than everything missing — for the same reason unknown is not unsuitable.

Parameters

NameTypeRequiredWhat it is
org_id (query)stringNoNarrow to one organisation in a reseller subtree. Can never widen scope.
q (query)stringNoMatch on domain or site name.
suitability (query)string<ready, needs_setup, unknown, unsuitable, blocked>No—
product_line (query)stringNo—
stack_type (query)stringNo—
group_id (query)stringNoOnly sites in this site group.
cms (query)string<wordpress, headless_rest, git_static>NoOnly sites whose target is this kind.
requires (query)stringNoComma-separated capability ids a recipe requires, e.g. cms_target:featured_image,cms_target:category.
limit (query)integerNo—
offset (query)integerNo—

Response

NameTypeRequiredWhat it is
itemsSiteTarget[]Yes—
totalintegerYesEvery site matching the filters, not the page. This is the number a select-all-matching control shows.
offsetintegerYes—
limitintegerYes—
has_morebooleanYes—

Errors this endpoint can return

401 · 403 · 422