API

Dorqa API

Pull your Dorqa data into your own dashboards, scripts and client reports. Plain JSON over HTTPS, one key per workspace, a stated daily limit, and every figure with its source and date.

Version 2026-09-25 · Last updated 25 September 2026

Quick start

Three calls to your first result

1. Create a key in the app, under AI assistants and API. Copy it when it appears. It is shown once.

2. Check it works. This call is free and returns your plan and today’s units.

curl https://api.dorqa.io/v1/usage \
  -H "Authorization: Bearer YOUR_KEY"

3. List your projects, then ask for one project’s Brief by its domain.

curl https://api.dorqa.io/v1/projects \
  -H "Authorization: Bearer YOUR_KEY"

curl "https://api.dorqa.io/v1/projects/example.com/brief?sections=search_console" \
  -H "Authorization: Bearer YOUR_KEY"
Authentication

One key per workspace, sent as a header

Send the key in the Authorization: Bearer dq_live_... header. x-api-key: dq_live_... is also accepted.

Keys belong to the workspace, not to a person. Everyone in the workspace sees the same keys, and a key keeps working when the person who made it leaves. The owner, or the person who made a key, can rotate or revoke it at any time. Rotating gives a new secret and stops the old one straight away.

Dorqa stores keys only as hashes, so a lost key cannot be recovered. Create a new one instead.

Every call runs with the access the workspace already has in the app: the same projects, the same data. The API cannot change anything.

Units and limits

A stated daily allowance, not a surprise bill

Each call costs a number of units, shown on every endpoint below. Units are counted per workspace per UTC day and reset at 00:00 UTC. A key can also carry its own daily limit, so one runaway script cannot use up the whole workspace’s allowance. Requests are also limited per minute, counted across all of the workspace’s keys, so a burst is slowed down rather than spending the day’s units in seconds.

PlanUnits per dayRows per requestActive keysRequests per minute
FreeNo API access———
Starter1,000up to 25330
Pro5,000up to 501060
Agency20,000up to 5025120

Calls that fail on our side (a 5xx response) are not counted. API units are separate from the credits you spend in the app. See pricing for plans.

Every response carries these headers:

HeaderMeaning
X-Units-LimitYour daily unit allowance
X-Units-UsedUnits used today, including this call
X-Units-ResetWhen the count resets (UTC)
Retry-AfterOn a 429 only: seconds until you can call again. Under a minute for the per-minute limit; until 00:00 UTC for a daily limit
Endpoints

Five endpoints in version one

Base address: https://api.dorqa.io/v1. Every endpoint is a GET.

GET /v1/usage

Your plan, today’s units, the reset time and the row cap. · 0 units

curl https://api.dorqa.io/v1/usage -H "Authorization: Bearer YOUR_KEY"
{
  "data": {
    "plan": "pro",
    "daily_units": 5000,
    "units_used_today": 6,
    "units_remaining_today": 4994,
    "resets_at": "2026-09-26T00:00:00+00:00",
    "row_cap": 50,
    "endpoint_units": { "usage": 0, "projects": 1, "brief": 5, "internal_links": 1, "questions": 1 }
  },
  "meta": { "endpoint": "usage", "units_charged": 0, "units_used_today": 6, "api_version": "2026-09-25" }
}

GET /v1/projects

The projects in your workspace, and whether Search Console and Analytics are connected. · 1 unit

curl https://api.dorqa.io/v1/projects -H "Authorization: Bearer YOUR_KEY"
{
  "data": {
    "projects": [
      { "domain": "example.com", "name": "example.com", "search_console": true, "analytics": true }
    ],
    "count": 1,
    "note": "Refer to a project by its domain in other endpoints."
  },
  "meta": { "endpoint": "projects", "units_charged": 1, "units_used_today": 1, "api_version": "2026-09-25" }
}

GET /v1/projects/{domain}/brief

The Dorqa Brief for one project: Search Console, Analytics, organic performance, site audit, domain overview, AI visibility, questions, internal linking, audience and watched trends. The last 28 days against the 28 before. · 5 units

ParameterRequiredMeaning
domainyesThe project’s domain, as returned by /v1/projects
sectionsnoComma-separated list to return only some sections: search_console, analytics, organic_performance, site_audit, domain_overview, ai_visibility, questions, internal_linking, audience, trends
curl "https://api.dorqa.io/v1/projects/example.com/brief?sections=search_console" \
  -H "Authorization: Bearer YOUR_KEY"
{
  "data": {
    "project": { "domain": "example.com", "name": "example.com" },
    "generated_at": "2026-09-25T07:58:03.317Z",
    "window": {
      "current":  { "start": "2026-08-26", "end": "2026-09-22" },
      "previous": { "start": "2026-07-29", "end": "2026-08-25" },
      "data_through": "2026-09-22",
      "days": 28
    },
    "sections": {
      "search_console": {
        "status": "ok",
        "headline": {
          "source": "Google Search Console",
          "clicks": { "value": 47, "change_pct": 30.6 },
          "impressions": { "value": 10509, "change_pct": -16.8 }
        }
      }
    }
  },
  "meta": { "endpoint": "brief", "units_charged": 5, "cache": "hit", "api_version": "2026-09-25" }
}

GET /v1/projects/{domain}/internal-links

Internal links worth adding, from the latest site scan: the page to edit, the words already on it to link, the page to link to, and a score. Only suggestions not yet accepted or dismissed. · 1 unit

ParameterRequiredMeaning
domainyesThe project’s domain
limitnoRows to return. Default 15, capped by your plan
curl "https://api.dorqa.io/v1/projects/example.com/internal-links?limit=10" \
  -H "Authorization: Bearer YOUR_KEY"
{
  "data": {
    "project": { "domain": "example.com" },
    "suggestions": [
      {
        "page_to_edit": { "url": "https://example.com/guide/", "title": "The guide" },
        "link_text": "keyword research",
        "link_to": { "url": "https://example.com/keyword-research/", "title": "Keyword research" },
        "score": 82,
        "why": "the link text is a search the target page already appears for"
      }
    ],
    "source": "Dorqa site scan"
  }
}

GET /v1/questions

Questions people ask about a topic, from People Also Ask, autocomplete, Quora, Reddit, Hacker News and keyword research, with monthly searches where measured. · 1 unit

ParameterRequiredMeaning
topicyesWords the question should contain, at least two letters
marketnoIN, US, GB or any. Default any
limitnoRows to return. Default 20, capped by your plan
curl "https://api.dorqa.io/v1/questions?topic=seo+course&market=IN" \
  -H "Authorization: Bearer YOUR_KEY"
{
  "data": {
    "topic": "seo course",
    "questions": [
      { "question": "which seo course is best", "market": "India",
        "monthly_searches": 1300, "volume_source": "keyword_research", "seen_on": ["paa"] }
    ],
    "note": "monthly_searches is null when no volume was measured."
  }
}
Responses and errors

One shape for success, one for failure

A successful call returns { "data": ..., "meta": ... }. A failed call returns an HTTP status and { "error": { "code", "message" } }.

StatusCodeMeaning
401missing_keyNo key was sent
401invalid_keyThe key is wrong or has been revoked
403plan_requiredThe workspace has no active paid plan
429daily_limitThe workspace has used today’s units
429key_daily_limitThis key has used its own daily limit
429rate_limitToo many requests in the last minute. Wait for Retry-After, then retry
400invalid_sectionsA section name in ?sections= is not recognised
400invalid_topic?topic= is missing or shorter than two letters
400invalid_market?market= is not IN, US, GB or any
404project_not_foundNo project with that domain in this workspace
404not_foundNo such endpoint
405method_not_allowedOnly GET is supported
503brief_unavailableThe Brief could not be built. Try again in a minute
500server_errorSomething failed on our side. Not counted against your units
Data rules

What the numbers mean

The API follows the same rules as every screen in Dorqa. Read them in full on data quality.

Stored data only. Version 1 reads data Dorqa already holds. No call starts a crawl or a paid lookup.

Every figure is sourced and dated. Brief sections state their source and window, or why they are not available.

Null means not measured, never zero. A missing figure is null, and a section that could not be built says so with a reason.

The Brief is rebuilt at most every six hours. generated_at in each response says when it was built. Search Console data lags two to three days, which the window’s data_through states.

Questions

Before you build

No. Version 1 reads data Dorqa already holds, so no call triggers a paid lookup. API calls are counted in units against a separate daily limit, which resets at 00:00 UTC.

Call it from your own server, script or scheduled job instead. A key gives read access to every project in the workspace, so it must never be shipped inside a browser app or a public repository.

Keys belong to the workspace, so the key keeps working and any dashboard built on it stays up. The key screen flags it as made by someone who has left, and the owner can rotate it in one click.

Yes. Connect https://mcp.dorqa.io/mcp as a custom connector and sign in to Dorqa. It reads the same data as the API, in plain language.

Be first. Not just found.

API access comes with every paid plan.