Analyze backlinks
target_scope=site expects a bare domain and honors
include_subdomains; target_scope=page expects a full URL and ignores it. The
target is validated locally first, so an unsupported input returns the
unsupported_target problem before any provider call is made.
result_limit accepts 100, 300, 500, or 1000 rows. mode=as_is returns
rows as the provider stores them, mode=one_per_domain asks the provider for a
single best row per referring domain across the whole corpus, not only across the
rows you fetched. Endpoints that can spend provider budget require write scope.
One paid snapshot per target is kept for 24 hours and shared with MCP and the
UI, so filtering, sorting, and grouping the rows you already paid for is free.
fresh=true skips the cache read and pays again. Use estimate_only=true for a
free, cache-aware dry run: it returns no rows, sets estimate: true, and reports
estimated_cost_cents without calling the provider, consuming budget, or writing
the cost ledger. max_cost_cents is a best-effort guard applied to the
pre-estimate; the monthly provider budget remains the hard stop.
The response envelope carries target, target_scope, include_subdomains,
provider, fetched_at, cached, cached_until, cost_cents,
fetched_row_count, and total_rows_available. summary reports
backlinks_total, referring domain counts, dofollow_pct, domain_rank,
broken backlink and page counts, and provider-lifetime new_backlinks,
lost_backlinks, new_referring_domains, and lost_referring_domains.
history always holds the last twelve months as {month, new_links, lost_links}.
Each row carries source_domain, source_url, anchor, target_url,
flags (nofollow, ugc, sponsored, image, sitewide), links_count,
domain_authority (the provider’s referring-domain rank on the 0-100 scale),
spam_score, first_seen, lost_at, and status. status and lost_at come
straight from the provider’s own new and lost markers rather than from
comparing snapshots, and sitewide is a derived heuristic over links_count.
A provider result with no backlinks is a successful empty response, not an error.
Unsupported targets, exhausted budgets, provider throttling, reauthorization,
and missing eligible connections use the standard problem response.
Load more rows
limit is a multiple of 100 between 100 and 1000. The response is the
same envelope, but rows contains only the newly fetched rows; append them to
the rows you already hold and use the updated fetched_row_count and
cost_cents. When the snapshot has expired or does not exist, the endpoint
returns the snapshot_expired problem with status 409; run the analyze
request again to pay for a fresh snapshot.