Rank Tracker SERP Opportunity Pages
const url = 'https://sitechecker.pro/api/v1/serp_opportunities?project_id=12345&content_type=listings&limit=50&offset=0';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://sitechecker.pro/api/v1/serp_opportunities?project_id=12345&content_type=listings&limit=50&offset=0' \ --header 'Authorization: Bearer <token>'Returns the monthly list of URLs identified as SERP opportunities for the project. This report is a monthly snapshot and takes no date range; the snapshot dates come back in the response meta.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Example
12345Project ID.
Substring search in title or URL.
Filter by content type (lowercase machine value).
Return URLs ranking for keywords containing this text. Aggregates are recomputed over the matching keywords only.
Substring filter on the opportunity URL.
Sort as “
Page size. Rank Tracker list endpoints cap at 50 rows per request.
Pagination offset.
Responses
Section titled “Responses”Paginated SERP opportunity URLs
object
Monthly SERP opportunity URL aggregate. Use opportunity_id for the serp_opportunity_keywords drilldown; ids may expire after the monthly snapshot regeneration.
object
Opaque opportunity id. Pass it to the opportunity keywords endpoint.
URL identified as an opportunity.
Host of that URL.
Page title as seen in the SERP.
Primary content type the page was classified as.
All content types the page was classified as.
Mean position this URL holds across the keywords it ranks for.
Tracked keywords this URL ranks for.
Date of the monthly snapshot this row comes from.
Date the next snapshot is due.
Pagination meta plus monthly snapshot dates.
object
Rows matching the request, before pagination.
Page size that was applied.
Pagination offset that was applied.
Date of the monthly snapshot these rows come from.
Date the next snapshot is due.
Example
{ "data": [ { "opportunity_id": "opp_aHR0cHM6Ly93d3cuc2VvcHRpbWVyLmNvbS8", "page_url": "https://www.seoptimer.com/", "domain": "seoptimer.com", "title": "SEOptimer: Analyze Websites", "content_type": "competitors", "content_types": [ "competitors", "info" ], "average_position": 22.6, "keywords_count": 131, "snapshot_date": "2026-04-25", "next_snapshot_date": "2026-05-25" } ], "meta": { "total": 131, "limit": 50, "offset": 0, "snapshot_date": "2026-04-25", "next_snapshot_date": "2026-05-25" }}Missing or invalid API key
Returned as INVALID_API_KEY when the key is missing or unknown, and as REVOKED_API_KEY when the key exists but was revoked — the latter needs a new key.
object
object
Example
{ "error": { "code": "INVALID_API_KEY", "message": "Invalid or missing API key." }}No active API entitlement for the account, or the project belongs to another account
Returned as MISSING_PUBLIC_API_ACCESS when the account has no active API entitlement, and as ACCESS_DENIED when the requested project belongs to another account.
object
object
Example
{ "error": { "code": "MISSING_PUBLIC_API_ACCESS", "message": "API access is not available: the account has no active API entitlement." }}Project not found
The exact missing resource is in error.code: PROJECT_NOT_FOUND, SEGMENT_NOT_FOUND, CRAWL_NOT_FOUND, KEYWORD_NOT_FOUND, OPPORTUNITY_NOT_FOUND, SNAPSHOT_UNAVAILABLE or NOT_FOUND.
object
object
Example
{ "error": { "code": "PROJECT_NOT_FOUND", "message": "Project not found." }}Validation error (including date_from/date_to, which this snapshot endpoint rejects)
Rejected query parameters. error.code is VALIDATION_ERROR for parameter validation (including a query parameter the endpoint does not accept), or INVALID_DATE_RANGE / INVALID_FILTER / INVALID_EVENT_TYPE / UNSUPPORTED_FILTER / UNSUPPORTED_DIMENSION / UNSUPPORTED_METRIC / UNSUPPORTED_SCOPE / SEGMENT_FILTER_UNSUPPORTED for module-specific rules.
object
object
Example
{ "error": { "code": "VALIDATION_ERROR", "message": "project_id is required." }}Rate limit exceeded — retry after the interval in the Retry-After header
object
object
Example
{ "error": { "code": "RATE_LIMIT_EXCEEDED", "message": "Rate limit exceeded. Try again later." }}Internal server error
object
object
Example
{ "error": { "code": "INTERNAL_ERROR", "message": "Internal server error." }}