API Reference
Comprehensive endpoint specifications, parameter schemas, code samples, and response payloads for the TrackSERPs REST API.
Account
Account details, plan metadata, check credit balances, and API call quotas.
/accountScope: rankings:readGet account profile
Returns the authenticated account's basic profile, timezone, and effective API plan identifier (trial accounts without an active subscription report `starter`).
/account/usageScope: rankings:readGet account credit and API usage
Exposes the account's monthly check credit balance, topup balance, and API call quota for the billing period.
Discovery
Explore and query projects, settings, and supported geographic search locations.
/projectsScope: rankings:readList projects
Returns paginated list of tracking projects for the account. Supports cursor pagination.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
limit | query | integer | Optional | Number of records to return per page (default 50, max 500). Default: 50 |
cursor | query | string | Optional | Opaque pagination cursor for fetching the next page of results. |
/projects/{project_id}Scope: rankings:readGet project details
Retrieves metadata, settings, and keyword statistics for a specific project.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
project_id | path | string | Required | The unique identifier of the project (e.g. `proj_abc123`). |
/locationsScope: rankings:readSearch locations
Searches geographic locations supported by DataForSEO and Google SERP tracking.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
q | query | string | Optional | Search term (city, state, or country name). |
country | query | string | Optional | Two-letter ISO country code (e.g. US, GB, CA). |
limit | query | integer | Optional | Maximum number of locations to return (default 20, max 100). Default: 20 |
Keywords
Manage keyword portfolios, device targeting, location overrides, and tag groupings.
/projects/{project_id}/keywordsScope: rankings:readList project keywords
Returns paginated keywords tracked in a project. Effective devices and location code are shown.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
project_id | path | string | Required | The unique identifier of the project (e.g. `proj_abc123`). |
tag | query | string | Optional | Filter results by keyword tag. |
limit | query | integer | Optional | Number of records to return per page (default 50, max 500). Default: 50 |
cursor | query | string | Optional | Opaque pagination cursor for fetching the next page of results. |
/projects/{project_id}/keywordsScope: keywords:writeUpsert keywords
Adds or updates keywords in the project (up to 500 keywords per request). Upsert matches on normalised phrase. Existing keywords have tags and tracked URLs merged. Requires `keywords:write` scope and an active plan with write access.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
project_id | path | string | Required | The unique identifier of the project (e.g. `proj_abc123`). |
Idempotency-Key | header | string | Optional | Optional unique idempotency key (UUID or client-generated string, up to 100 characters) to prevent duplicate execution of write requests. |
/projects/{project_id}/keywords/{keyword_id}Scope: keywords:writeArchive keyword
Soft-archives a keyword from the project. Requires `keywords:write` scope.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
project_id | path | string | Required | The unique identifier of the project (e.g. `proj_abc123`). |
keyword_id | path | string | Required | The unique identifier of the keyword (e.g. `kw_abc123`). |
Rankings
Query latest ranking snapshots across devices, keyword time series, and 400-day bulk movements.
/projects/{project_id}/rankings/latestScope: rankings:readGet latest rankings across project
Returns the latest ranking snapshot for every keyword and device in the project.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
project_id | path | string | Required | The unique identifier of the project (e.g. `proj_abc123`). |
device | query | string | Optional | Filter results by device (`desktop` or `mobile`). |
tag | query | string | Optional | Filter results by keyword tag. |
limit | query | integer | Optional | Number of records to return per page (default 50, max 500). Default: 50 |
cursor | query | string | Optional | Opaque pagination cursor for fetching the next page of results. |
/projects/{project_id}/keywords/{keyword_id}/rankings/latestScope: rankings:readGet latest rankings for a keyword
Returns the latest ranking snapshot for all tracked devices of a specific keyword.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
project_id | path | string | Required | The unique identifier of the project (e.g. `proj_abc123`). |
keyword_id | path | string | Required | The unique identifier of the keyword (e.g. `kw_abc123`). |
/projects/{project_id}/keywords/{keyword_id}/rankings/historyScope: rankings:readGet keyword ranking history
Returns chronological ranking series for a keyword, including delta summary (start_rank, end_rank, rank_change).
| Name | In | Type | Required | Description |
|---|---|---|---|---|
project_id | path | string | Required | The unique identifier of the project (e.g. `proj_abc123`). |
keyword_id | path | string | Required | The unique identifier of the keyword (e.g. `kw_abc123`). |
start | query | string | Optional | Start date in `YYYY-MM-DD` format (UTC). |
end | query | string | Optional | End date in `YYYY-MM-DD` format (UTC). |
device | query | string | Optional | Filter results by device (`desktop` or `mobile`). |
/projects/{project_id}/rankings/historyScope: rankings:readBulk ranking history
Returns bulk history grouped by keyword, paginated by keyword (default 50, max 200). Range is capped at 400 days. Includes aggregate summary with improved, declined, unchanged, and average rank change. Counts as 5 requests toward rate limit and monthly quota. Accepts `application/json` or `application/x-ndjson` (one keyword per line).
| Name | In | Type | Required | Description |
|---|---|---|---|---|
project_id | path | string | Required | The unique identifier of the project (e.g. `proj_abc123`). |
start | query | string | Optional | Start date in `YYYY-MM-DD` format (UTC). |
end | query | string | Optional | End date in `YYYY-MM-DD` format (UTC). |
device | query | string | Optional | Filter results by device (`desktop` or `mobile`). |
tag | query | string | Optional | Filter results by keyword tag. |
updated_after | query | string | Optional | ISO 8601 timestamp to retrieve keywords updated after this time. |
limit | query | integer | Optional | Max keywords per page (default 50, max 200). Default: 50 |
cursor | query | string | Optional | Opaque pagination cursor for fetching the next page of results. |
unranked_as | query | integer | Optional | Position value assigned to unranked keywords when computing average rank change (e.g. 101). Default leaves unranked pairs out. |
Accept | header | string | Optional | Response format (`application/json` or `application/x-ndjson`). Default: application/json |
Search Volume
Monthly historical Google search volume, estimated CPC, and competition benchmarks.
/projects/{project_id}/keywords/{keyword_id}/volumeScope: rankings:readGet keyword search volume
Returns monthly historical search volume, CPC, and competition for a keyword.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
project_id | path | string | Required | The unique identifier of the project (e.g. `proj_abc123`). |
keyword_id | path | string | Required | The unique identifier of the keyword (e.g. `kw_abc123`). |
months | query | integer | Optional | Number of historical months to retrieve (1 to 24, default 12). Default: 12 |
/projects/{project_id}/volumeScope: rankings:readGet latest search volume for project keywords
Returns latest month search volume data across all keywords in the project.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
project_id | path | string | Required | The unique identifier of the project (e.g. `proj_abc123`). |
limit | query | integer | Optional | Number of records to return per page (default 50, max 500). Default: 50 |
cursor | query | string | Optional | Opaque pagination cursor for fetching the next page of results. |
Runs
Trigger manual depth-100 check runs and simulate credit charges with dry-run calculations.
/projects/{project_id}/runsScope: runs:writeTrigger manual check run
Starts a manual ranking check run for all active keywords in the project. Enforces one manual run per project per hour and maximum 10 run requests per key per hour. Pass `?dry_run=true` to test credit balance and allowance without starting the run or spending credits. Requires `runs:write` scope.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
project_id | path | string | Required | The unique identifier of the project (e.g. `proj_abc123`). |
dry_run | query | boolean | Optional | If true, calculates credit requirements without starting the run. Default: false |
Idempotency-Key | header | string | Optional | Optional unique idempotency key (UUID or client-generated string, up to 100 characters) to prevent duplicate execution of write requests. |
/projects/{project_id}/runs/latestScope: rankings:readGet latest check run
Returns the status and execution metrics of the most recent run for the project.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
project_id | path | string | Required | The unique identifier of the project (e.g. `proj_abc123`). |
/projects/{project_id}/runs/{run_id}Scope: rankings:readGet check run by ID
Returns status and progress metrics of a specific check run.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
project_id | path | string | Required | The unique identifier of the project (e.g. `proj_abc123`). |
run_id | path | string | Required | The unique identifier of the check run (e.g. `run_abc123`). |
Webhooks
Register, update, and monitor signed real-time HTTPS webhook delivery endpoints.
/webhooksScope: webhooks:writeList webhook endpoints
Returns all configured webhook notification endpoints for the account. Requires `webhooks:write` scope.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
limit | query | integer | Optional | Number of records to return per page (default 50, max 500). Default: 50 |
cursor | query | string | Optional | Opaque pagination cursor for fetching the next page of results. |
/webhooksScope: webhooks:writeCreate webhook endpoint
Registers a new HTTPS webhook destination. Validates destination host with SSRF protection (refuses loopback, link-local, and private RFC-1918 IPs). Returns signing secret once. Requires `webhooks:write` scope.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | string | Optional | Optional unique idempotency key (UUID or client-generated string, up to 100 characters) to prevent duplicate execution of write requests. |
/webhooks/{id}Scope: webhooks:writeGet webhook endpoint
Returns configuration details of a specific webhook endpoint. Requires `webhooks:write` scope.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Required | The unique identifier of the webhook endpoint (e.g. `wh_123`). |
/webhooks/{id}Scope: webhooks:writeUpdate webhook endpoint
Modifies URL, subscribed event types, description, or enabled status of a webhook endpoint. Requires `webhooks:write` scope.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Required | The unique identifier of the webhook endpoint (e.g. `wh_123`). |
/webhooks/{id}Scope: webhooks:writeDelete webhook endpoint
Removes a webhook endpoint and cancels any pending delivery retries. Requires `webhooks:write` scope.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Required | The unique identifier of the webhook endpoint (e.g. `wh_123`). |
/webhooks/{id}/rotate-secretScope: webhooks:writeRotate webhook signing secret
Invalidates the current signing secret and issues a new secret. Revealed once. Requires `webhooks:write` scope.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Required | The unique identifier of the webhook endpoint (e.g. `wh_123`). |
/webhooks/{id}/testScope: webhooks:writeSend test webhook event
Dispatches an immediate test event ping to the endpoint to verify receiver signatures and connectivity. Requires `webhooks:write` scope.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Required | The unique identifier of the webhook endpoint (e.g. `wh_123`). |
/webhooks/{id}/deliveriesScope: webhooks:writeList webhook deliveries
Returns paginated delivery log history for an endpoint (kept for 30 days). Requires `webhooks:write` scope.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Required | The unique identifier of the webhook endpoint (e.g. `wh_123`). |
limit | query | integer | Optional | Max deliveries to return (default 50, max 200). Default: 50 |
cursor | query | string | Optional | Opaque pagination cursor for fetching the next page of results. |