Skip to Content

Introduction

Base URL, authentication, request and response conventions, status codes and rate limits for the RankParse REST API.

The RankParse API is a REST API over HTTPS. It takes query parameters or JSON bodies and always answers with JSON (apart from the two legacy redirects and unknown routes). Every page in this reference documents one operation: its parameters, its response fields, what it costs and the errors it returns.

Base URL

https://api.rankparse.com/v1

Every path in this reference is relative to that base, so GET /v1/backlinks is https://api.rankparse.com/v1/backlinks. Requests must use HTTPS. The API allows cross-origin requests, but a key must never be shipped in browser code (see Authentication).

Authentication

Send your API key in the X-API-Key header on every request. Keys start with rp_ and are created under Settings, Developers, API keys in the dashboard.

curl "https://api.rankparse.com/v1/domain-authority?domain=github.com" \
  -H "X-API-Key: rp_your_key"

A missing, unknown or revoked key returns 401 invalid_api_key. A key in the query string is not read. The public GET /v1/pricing and the free tools are the only routes that need no key.

Requests

  • GET operations take query parameters. Domains are bare hostnames such as stripe.com, never URLs: https://stripe.com returns 400 invalid_domain. URL parameters (url=) take a full public http or https URL.
  • POST and PATCH operations take a JSON body. Send Content-Type: application/json.
  • A few write operations keep their target in the query string, for example POST /v1/indexnow/key?domain=, POST /v1/site-scan/recheck?site_id=, POST /v1/site-audit/run?site_id=, PATCH /v1/site-context?site_id= and PATCH /v1/rank-tracking/alert-settings?site_id=. Each operation page says where every parameter goes.
  • site_id is the id of one of your websites. List them with GET /v1/websites or GET /v1/rank-tracking/sites.

Responses

Billable endpoints wrap their result in one envelope:

GET /v1/backlinks?domain=stripe.com&limit=1
{
  "domain": "stripe.com",
  "data": [
    {
      "from_domain": "example-blog.com",
      "from_url": "https://example-blog.com/payments",
      "to_url": "https://stripe.com/",
      "anchor_text": "Stripe",
      "rel": null,
      "link_type": "hyperlink",
      "crawled_at": "2026-02-11"
    }
  ],
  "total": 18342,
  "limit": 1,
  "credits_used": 2,
  "credits_remaining": 998
}
FieldPresent onMeaning
dataEvery billable endpointThe result: an array for row-based endpoints, an object for single-record ones.
domain or urlDomain-level or URL-level endpointsWhat you asked about, normalised.
totalRow-based endpointsHow many matching rows exist. It can be larger than the rows returned.
limitRow-based endpointsThe limit you sent, echoed as sent (not clamped). Use the length of data as the truth.
credits_usedEvery billable endpointWhat this call cost after any refund. 0 means you were not charged.
credits_remainingEvery billable endpointYour spendable balance after the call: monthly plan credits plus purchased credits.
partialSome link graph endpointstrue when part of the answer ran out of time. Treat what is missing as unknown, not zero.

Fields that do not apply are left out rather than sent as null. Free routes (account, rank tracking, Search Console, Google Ads, issues, indexing, AI visibility, site audits, project context, the approval inbox and outreach) have their own shapes, documented on their pages. The details, with examples, are in Response format.

Pagination

  • limit defaults to 100. On the link graph endpoints it is clamped to 1 to 1000 (similar-domains stops at 100, competitor-gap defaults to 50). A non-numeric value falls back to the default.
  • The link graph endpoints return the top limit rows in their own order and take no offset.
  • A few routes page with limit and offset: /v1/usage, /v1/indexing and the rank tracking lists. Their pages give the exact limits.
  • A domain with no data returns 200 with data: [] and is billed as usual. RankParse never answers 404 for "no data".

Errors

Errors return a non-2xx status and a JSON body with a stable code. Branch on code, not on the message text.

402 Payment Required
{
  "error": "Payment Required",
  "code": "insufficient_credits",
  "message": "Add credits at https://rankparse.com/pricing"
}
StatusMeaning
200Success. Also returned for an empty result.
201Created: a new API key, or a new IndexNow key.
202Accepted but not done yet: a proposal waiting in the approval inbox, a queued AI visibility re-check, or a queued site audit.
301Legacy path: /v1/page-meta redirects to /v1/page-seo, /v1/url-index to /v1/sitemap.
400A parameter or body is missing or invalid, or a required connection is missing.
401The API key is missing, unknown or revoked, or a connected account (Google, Zeekeo) needs reconnecting.
402Not enough credits (insufficient_credits), the monthly spend cap was reached (spend_cap_reached) or the plan limit was reached (plan_limit_reached).
403Your role or plan does not allow the action, or an upstream provider denied access.
404The route, or a resource you named by id, does not exist in your workspace.
409The resource is in a state that does not allow this now (a campaign launch in progress, a task already claimed).
422IndexNow rejected the URLs for the key or host.
429The per-key rate limit, a daily cap or an upstream quota was hit.
500, 502An unexpected server or upstream error. Retry with backoff.
503The data store, a live fetch or an upstream service timed out or is unavailable.

Every code, with what to do about it, is in Errors.

Rate limit

Each API key may make 60 requests per minute, counted over a sliding 60 second window. Going over returns 429 rate_limited with no Retry-After header. Two keys do not share a counter. The account routes (/v1/credits, /v1/me, /v1/keys, /v1/usage, /v1/pricing) and the connection status routes are not counted. PageSpeed and Google Ads also have daily caps. See Rate limiting.

Credits

  • Each billable call is charged in one atomic step, before the work runs. The cost is on every operation page and in the table on Credits.
  • Monthly plan credits (Pro and Agency) are spent first, then purchased credits. credits_remaining is the sum.
  • A call that fails on the server side (a data store timeout, a failed live fetch, a failed IndexNow submission) is refunded automatically, and its credits_used reads 0.
  • Every data lookup and live page endpoint validates its parameters before charging, so a 400 for a missing or invalid parameter costs nothing.

Caching and retries

  • Link graph answers are cached for 30 days per crawl release, endpoint and parameters. A cached answer is billed exactly like a fresh one and is the same data. Nothing in the response says whether it came from the cache. page-performance results are cached for 24 hours per URL and strategy.
  • There is no Idempotency-Key header. Retrying a billed call that succeeded charges it again; retrying one that failed with a refunded error is free.
  • Some writes are safe to repeat: POST /v1/indexnow/key returns the same key for a host, a proposal for the same action returns the existing proposal, and POST /v1/activity takes an optional client_request_id that makes a repeat return the first note.
  • A 503 query_timeout or upstream_error carries retry: true, retry_after: 3 and a Retry-After: 3 header. deterministic_timeout carries retry: false: change the request instead of retrying it.

Resources

Competitive analysis

Live page analysis

Platforms

Your websites

Agent actions

Account

On this page