Skip to content

Monthly SERP opportunity URL list.

GET
/api/v1/serp_opportunities
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>'
project_id
required
integer
Example
12345

Project ID.

search
string

Substring search in title or URL.

content_type
string
Allowed values: listings info ugc news_media competitors reviews stores government education ai_chats web_dev

Filter by content type (lowercase machine value).

keyword
string

Return URLs ranking for keywords containing this text. Aggregates are recomputed over the matching keywords only.

page_url
string

Substring filter on the opportunity URL.

order_by
string

Sort as “_asc” or “_desc”. Sortable fields: page_url, title, average_position, keywords_count.

limit
integer
default: 50 >= 1 <= 50

Page size. Rank Tracker list endpoints cap at 50 rows per request.

offset
integer
0

Pagination offset.

Paginated SERP opportunity URLs

Media typeapplication/json
object
data
Array<object>

Monthly SERP opportunity URL aggregate. Use opportunity_id for the serp_opportunity_keywords drilldown; ids may expire after the monthly snapshot regeneration.

object
opportunity_id
string
page_url
string
domain
string
nullable
title
string
nullable
content_type
string
nullable
content_types
Array<string>
average_position
number format: float
nullable
keywords_count
integer
snapshot_date
string format: date
nullable
next_snapshot_date
string format: date
nullable
meta

Pagination meta plus monthly snapshot dates.

object
total
integer
limit
integer
offset
integer
snapshot_date
string format: date
nullable
next_snapshot_date
string format: date
nullable
Example
{
"data": [
{
"opportunity_id": "opp_aHR0cHM6Ly9leGFtcGxlLmNvbS8",
"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

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: validation_error bad_request project_not_found segment_not_found forbidden crawl_in_progress not_found upstream_error unauthorized rate_limit_exceeded api_access_denied internal_error crawl_not_found invalid_date_range invalid_filter invalid_event_type keyword_not_found opportunity_not_found snapshot_unavailable gsc_not_connected ga4_not_connected site_audit_data_unavailable ga4_data_unavailable unsupported_filter unsupported_dimension segment_filter_unsupported unsupported_scope ai_overview_data_unavailable prompt_data_unavailable
message
required
string
Example
{
"error": {
"code": "unauthorized",
"message": "Invalid or missing API key."
}
}

No active API entitlement for the account, or the project belongs to another account

Media typeapplication/json

Returned as api_access_denied when the account has no active API entitlement, and as forbidden when the requested project belongs to another account.

object
error
required
object
code
required
string
Allowed values: validation_error bad_request project_not_found segment_not_found forbidden crawl_in_progress not_found upstream_error unauthorized rate_limit_exceeded api_access_denied internal_error crawl_not_found invalid_date_range invalid_filter invalid_event_type keyword_not_found opportunity_not_found snapshot_unavailable gsc_not_connected ga4_not_connected site_audit_data_unavailable ga4_data_unavailable unsupported_filter unsupported_dimension segment_filter_unsupported unsupported_scope ai_overview_data_unavailable prompt_data_unavailable
message
required
string
Example
{
"error": {
"code": "api_access_denied",
"message": "API access is not available: the account has no active API entitlement."
}
}

Project not found

Media typeapplication/json

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
error
required
object
code
required
string
Allowed values: validation_error bad_request project_not_found segment_not_found forbidden crawl_in_progress not_found upstream_error unauthorized rate_limit_exceeded api_access_denied internal_error crawl_not_found invalid_date_range invalid_filter invalid_event_type keyword_not_found opportunity_not_found snapshot_unavailable gsc_not_connected ga4_not_connected site_audit_data_unavailable ga4_data_unavailable unsupported_filter unsupported_dimension segment_filter_unsupported unsupported_scope ai_overview_data_unavailable prompt_data_unavailable
message
required
string
Example
{
"error": {
"code": "project_not_found",
"message": "Project not found."
}
}

Validation error (including date_from/date_to, which this snapshot endpoint rejects)

Media typeapplication/json

Rejected query parameters. error.code is validation_error for parameter validation, or invalid_date_range / invalid_filter / invalid_event_type / unsupported_filter / unsupported_dimension / unsupported_scope / segment_filter_unsupported for module-specific rules.

object
error
required
object
code
required
string
Allowed values: validation_error bad_request project_not_found segment_not_found forbidden crawl_in_progress not_found upstream_error unauthorized rate_limit_exceeded api_access_denied internal_error crawl_not_found invalid_date_range invalid_filter invalid_event_type keyword_not_found opportunity_not_found snapshot_unavailable gsc_not_connected ga4_not_connected site_audit_data_unavailable ga4_data_unavailable unsupported_filter unsupported_dimension segment_filter_unsupported unsupported_scope ai_overview_data_unavailable prompt_data_unavailable
message
required
string
Example
{
"error": {
"code": "validation_error",
"message": "project_id is required."
}
}

Rate limit exceeded — retry after the interval in the Retry-After header

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: validation_error bad_request project_not_found segment_not_found forbidden crawl_in_progress not_found upstream_error unauthorized rate_limit_exceeded api_access_denied internal_error crawl_not_found invalid_date_range invalid_filter invalid_event_type keyword_not_found opportunity_not_found snapshot_unavailable gsc_not_connected ga4_not_connected site_audit_data_unavailable ga4_data_unavailable unsupported_filter unsupported_dimension segment_filter_unsupported unsupported_scope ai_overview_data_unavailable prompt_data_unavailable
message
required
string
Example
{
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Try again later."
}
}

Internal server error

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: validation_error bad_request project_not_found segment_not_found forbidden crawl_in_progress not_found upstream_error unauthorized rate_limit_exceeded api_access_denied internal_error crawl_not_found invalid_date_range invalid_filter invalid_event_type keyword_not_found opportunity_not_found snapshot_unavailable gsc_not_connected ga4_not_connected site_audit_data_unavailable ga4_data_unavailable unsupported_filter unsupported_dimension segment_filter_unsupported unsupported_scope ai_overview_data_unavailable prompt_data_unavailable
message
required
string
Example
{
"error": {
"code": "internal_error",
"message": "Internal server error."
}
}