links

GET /v1/link-targets

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

All links 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 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 o…
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` mea…
owned (query)string<own, external>No`own` 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