links

GET /v1/link-targets

The Link Tracker report — domains this org's sites link out to.

All links endpoints

All developer docs →

Authentication

Send an API key as a bearer token. The endpoint checks links.view; 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/link-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

V1's columns, rebuilt: Domain | Site | Reflinks | Ref posts | Ref sites. Ranked by reflinks by default, because the question is "who am I linking to most". Search rolls variants up. www., letter case and punycode/Unicode are folded on the write path, so they are already one row by the time you search — that is the fix for the production defect where cu-tv.com showed 185 reflinks and www.cu-tv.com showed 1 (docs/96 §1.4, D1328). Subdomains stay separate rows, because an operator cares which host they hit, but a search for skokka.com finds blog.skokka.com too and rollup gives the combined totals across the whole match. ⛔ Paged by offset, not by cursor. The shared cursor paginator is keyset over the sortable id, which is chronological; this list is ranked, and a keyset cursor cannot express that ordering. total is the full match so the screen can page all of it — there is no hidden cap. coverage says how much of the estate the report is based on. ⛔ Without it a customer cannot tell "no outbound links" from "nobody has scanned this yet", and those two readings lead to opposite actions.

Parameters

NameTypeRequiredWhat it is
org_id (query)stringNoNarrow to one organisation in the caller's subtree — what the dashboard's org switcher sends. ⛔ Narrow only: it is intersected with what the caller may already read, so an org…
q (query)stringNoA domain, or any text. A value that parses as a hostname matches that host and every subdomain of it; anything else is a substring match, because someone typing casino means…
owned (query)string<own, external>Noown shows only targets that are the customer's own sites; external only those that are not. Omitted shows both.
site_id (query)stringNoOnly targets linked to from this site.
include_ips (query)booleanNoBare-IP targets are real links and are tracked, but they never group sensibly. Set false to hide them.
min_links (query)integerNoThe noise filter. Padding links (google.com, youtube.com) sit beside the money links deliberately. ⛔ They are filterable, never auto-deleted — removing a link a customer…
sort (query)string<links, posts, sites, host, recent>No—
limit (query)integerNo—
offset (query)integerNo—

Response

NameTypeRequiredWhat it is
itemsLinkTarget[]Yes—
totalintegerYes—
offsetintegerYes—
limitintegerYes—
has_morebooleanYes—
rollupLinkRollupYesCombined totals across every target the filters matched — the "including variants of it" number. Not the sum of the page, so it does not change as you page.
coverageLinkCoverageYesHow much of the estate the report is based on. ⛔ Without it a customer cannot tell "no outbound links" from "never scanned", and those lead to opposite actions.

Errors this endpoint can return

401 · 403 · 429