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
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"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.
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.
| Plan | Units per day | Rows per request | Active keys | Requests per minute |
|---|---|---|---|---|
| Free | No API access | — | — | — |
| Starter | 1,000 | up to 25 | 3 | 30 |
| Pro | 5,000 | up to 50 | 10 | 60 |
| Agency | 20,000 | up to 50 | 25 | 120 |
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:
| Header | Meaning |
|---|---|
X-Units-Limit | Your daily unit allowance |
X-Units-Used | Units used today, including this call |
X-Units-Reset | When the count resets (UTC) |
Retry-After | On 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 |
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
| Parameter | Required | Meaning |
|---|---|---|
domain | yes | The project’s domain, as returned by /v1/projects |
sections | no | Comma-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
| Parameter | Required | Meaning |
|---|---|---|
domain | yes | The project’s domain |
limit | no | Rows 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
| Parameter | Required | Meaning |
|---|---|---|
topic | yes | Words the question should contain, at least two letters |
market | no | IN, US, GB or any. Default any |
limit | no | Rows 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."
}
}One shape for success, one for failure
A successful call returns { "data": ..., "meta": ... }. A failed call returns an HTTP status and { "error": { "code", "message" } }.
| Status | Code | Meaning |
|---|---|---|
| 401 | missing_key | No key was sent |
| 401 | invalid_key | The key is wrong or has been revoked |
| 403 | plan_required | The workspace has no active paid plan |
| 429 | daily_limit | The workspace has used today’s units |
| 429 | key_daily_limit | This key has used its own daily limit |
| 429 | rate_limit | Too many requests in the last minute. Wait for Retry-After, then retry |
| 400 | invalid_sections | A section name in ?sections= is not recognised |
| 400 | invalid_topic | ?topic= is missing or shorter than two letters |
| 400 | invalid_market | ?market= is not IN, US, GB or any |
| 404 | project_not_found | No project with that domain in this workspace |
| 404 | not_found | No such endpoint |
| 405 | method_not_allowed | Only GET is supported |
| 503 | brief_unavailable | The Brief could not be built. Try again in a minute |
| 500 | server_error | Something failed on our side. Not counted against your units |
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.
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.