Pagination & parameters
These conventions apply across every endpoint, so once you've integrated one you've effectively integrated them all.
Pagination
List endpoints are paginated. Pass `page` and `per_page` query parameters; the response reports the current position and totals under `meta`.
| Parameter | Type | Description |
|---|---|---|
page | integer | 1-based page number. Defaults to `1`. |
per_page | integer | Items per page. Defaults to `50`, maximum `100`. |
{
"data": [ /* ... */ ],
"meta": {
"page": 1,
"per_page": 50,
"total": 318,
"total_pages": 7
}
}Sorting & filtering
- Sorting - pass `sort` with a field name and `order` (`asc` or `desc`). Supported sort fields are listed on each endpoint.
- Filtering - most list endpoints accept a `q` free-text filter plus endpoint-specific filters (for example, `min_score` or `dofollow`).
Country & language
Search-data endpoints accept `country` (2-letter ISO 3166 code, e.g. `us`, `gb`, `pk`) and `language` (2-letter ISO 639 code, e.g. `en`). Both default to `us` / `en` when omitted.
Timestamps
All timestamps are returned as ISO-8601 strings in UTC, for example `2026-06-15T09:30:00Z`.
Asynchronous jobs
Some operations (keyword ideas, SERP analysis, rank checks, backlink-gap runs, AI-visibility checks, site audits) run as background jobs. These endpoints return immediately with a `status` of `pending` or `running`. Poll the job's detail endpoint until `status` is `completed` (or `failed`), then read the results.
{
"data": {
"id": "job_3f9a2c",
"status": "running",
"progress": 42
},
"meta": { "request_id": "req_8f2c1a" }
}Poll job status every few seconds with backoff, not in a tight loop - polling counts toward your rate limit. Status reads are free of credits.