Domain Analytics

Jump to Get Supported CountriesGet Supported Countries

Returns the complete, unpaginated list of databases the product has data for: one entry per supported country and device type pair. Use it to fill the country and device_type parameters of the other services’ requests.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/meta/countries

Query parameters

device_type

Filter by device type. When omitted, countries are returned for every device type. Supported values: DESKTOP, MOBILE.

Value/Type: string

Response Parameters

country

Country (database) code in ISO 3166-1 Alpha-2 format.

Value/Type: string

device

Device type the country’s data is available for. Possible values: DESKTOP, MOBILE.

Value/Type: string

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/meta/countries?device_type=DESKTOP"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "device_type": "DESKTOP"
  },
  "data": [
      {
          "country": "us",
          "device": "DESKTOP"
      },
      {
          "country": "gb",
          "device": "DESKTOP"
      },
      {
          "country": "de",
          "device": "DESKTOP"
      }
  ]
}

Jump to Get Monthly Domain RankingsGet Monthly Domain Rankings

Price: 40 API units per line

Returns a list of monthly domains with their summary metrics.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/domain-rankings/monthly

Query parameters

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case, for example, us. The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

filter

Domains filter string. For syntax, refer to Advanced filtering. A money field is filtered by its numeric value alone, never by the pair: traffic_cost > 2.50, and the currency is never part of a filter. Available fields: rank, domain, positions, traffic, traffic_cost, organic_positions, organic_traffic, organic_traffic_cost, serp_features_positions, serp_features_traffic, serp_features_traffic_cost, adwords_positions, adwords_traffic, adwords_traffic_cost, pla_positions, pla_copies, positions_difference, traffic_difference, traffic_cost_difference, organic_positions_difference, organic_traffic_difference, organic_traffic_cost_difference, serp_features_positions_difference, serp_features_traffic_difference, serp_features_traffic_cost_difference, adwords_positions_difference, adwords_traffic_difference, adwords_traffic_cost_difference. Example: organic_traffic > 100

Value/Type: string

fields

Field names from the response entity to include in the response. Supported values: rank, domain, month, positions, traffic, traffic_cost, organic_positions, organic_traffic, organic_traffic_cost, serp_features_positions, serp_features_traffic, serp_features_traffic_cost, adwords_positions, adwords_traffic, adwords_traffic_cost, pla_positions, pla_copies, positions_difference, traffic_difference, traffic_cost_difference, organic_positions_difference, organic_traffic_difference, organic_traffic_cost_difference, serp_features_positions_difference, serp_features_traffic_difference, serp_features_traffic_cost_difference, adwords_positions_difference, adwords_traffic_difference, adwords_traffic_cost_difference.

Value/Type: string[]

limit

Maximum number of domain rankings to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of domain rankings to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

order_by

Field name to sort by. Default: rank. Supported values: rank, domain, positions, traffic, traffic_cost, organic_positions, organic_traffic, organic_traffic_cost, serp_features_positions, serp_features_traffic, serp_features_traffic_cost, adwords_positions, adwords_traffic, adwords_traffic_cost, pla_positions, pla_copies, positions_difference, traffic_difference, traffic_cost_difference, organic_positions_difference, organic_traffic_difference, organic_traffic_cost_difference, serp_features_positions_difference, serp_features_traffic_difference, serp_features_traffic_cost_difference, adwords_positions_difference, adwords_traffic_difference, adwords_traffic_cost_difference.

Value/Type: string

direction

Sorting direction (ascending or descending). Default: ASC. Supported values: ASC, DESC. Example: DESC

Value/Type: string

Response Parameters

rank

Visibility rank of the domain.

Value/Type: integer

domain

Domain name.

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM).

Value/Type: string

positions

Total number of keyword positions.

Value/Type: integer

traffic

Total estimated traffic.

Value/Type: integer

traffic_cost

Value/Type: object

organic_positions

Organic search keyword positions.

Value/Type: integer

organic_traffic

Estimated organic traffic.

Value/Type: integer

organic_traffic_cost

Value/Type: object

organic_positions_difference

Organic position change compared to the previous period.

Value/Type: integer

organic_traffic_difference

Organic traffic change compared to the previous period.

Value/Type: integer

organic_traffic_cost_difference

Value/Type: object

adwords_positions

Paid search (AdWords) positions.

Value/Type: integer

adwords_traffic

Estimated traffic from paid search.

Value/Type: integer

adwords_traffic_cost

Value/Type: object

adwords_positions_difference

Paid search position change compared to the previous period.

Value/Type: integer

adwords_traffic_difference

Paid search traffic change compared to the previous period.

Value/Type: integer

adwords_traffic_cost_difference

Value/Type: object

serp_features_positions

Positions with SERP features.

Value/Type: integer

serp_features_traffic

Traffic from SERP features.

Value/Type: integer

serp_features_traffic_cost

Value/Type: object

serp_features_positions_difference

SERP feature position change compared to the previous period.

Value/Type: integer

serp_features_traffic_difference

SERP feature traffic change compared to the previous period.

Value/Type: integer

serp_features_traffic_cost_difference

Value/Type: object

pla_positions

Product Listing Ads (PLA) positions.

Value/Type: integer

pla_copies

Number of unique PLA ad copies.

Value/Type: integer

positions_difference

Position change compared to the previous period.

Value/Type: integer

traffic_difference

Traffic change compared to the previous period.

Value/Type: integer

traffic_cost_difference

Value/Type: object

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/domain-rankings/monthly?country=US&device_type=DESKTOP&month=2024-12&filter=organic_traffic%20%3E%20100&fields=rank,domain,traffic,organic_traffic,positions&limit=10"
Response example
JSON
{
  "data": [
      {
          "rank": 1,
          "domain": "example.com",
          "month": "2024-12",
          "positions": 45230,
          "traffic": 152800,
          "traffic_cost": {
              "value": 4850.25,
              "currency": "USD"
          },
          "organic_positions": 45230,
          "organic_traffic": 152800,
          "organic_traffic_cost": {
              "value": 4850.25,
              "currency": "USD"
          },
          "organic_positions_difference": 120,
          "organic_traffic_difference": 3450,
          "organic_traffic_cost_difference": {
              "value": 95.50,
              "currency": "USD"
          },
          "adwords_positions": 0,
          "adwords_traffic": 0,
          "adwords_traffic_cost": {
              "value": 0,
              "currency": "USD"
          },
          "adwords_positions_difference": 0,
          "adwords_traffic_difference": 0,
          "adwords_traffic_cost_difference": {
              "value": 0,
              "currency": "USD"
          },
          "serp_features_positions": 8950,
          "serp_features_traffic": 21450,
          "serp_features_traffic_cost": {
              "value": 625.75,
              "currency": "USD"
          },
          "serp_features_positions_difference": 45,
          "serp_features_traffic_difference": 890,
          "serp_features_traffic_cost_difference": {
              "value": 18.30,
              "currency": "USD"
          },
          "pla_positions": 0,
          "pla_copies": 0,
          "positions_difference": 165,
          "traffic_difference": 4340,
          "traffic_cost_difference": {
              "value": 113.80,
              "currency": "USD"
          }
      },
      {
          "rank": 2,
          "domain": "competitor.com",
          "month": "2024-12",
          "positions": 38120,
          "traffic": 98500,
          "traffic_cost": {
              "value": 2950.75,
              "currency": "USD"
          },
          "organic_positions": 38120,
          "organic_traffic": 98500,
          "organic_traffic_cost": {
              "value": 2950.75,
              "currency": "USD"
          },
          "organic_positions_difference": -85,
          "organic_traffic_difference": -2100,
          "organic_traffic_cost_difference": {
              "value": -63.00,
              "currency": "USD"
          },
          "adwords_positions": 120,
          "adwords_traffic": 5600,
          "adwords_traffic_cost": {
              "value": 450.00,
              "currency": "USD"
          },
          "adwords_positions_difference": 5,
          "adwords_traffic_difference": 280,
          "adwords_traffic_cost_difference": {
              "value": 22.50,
              "currency": "USD"
          },
          "serp_features_positions": 6200,
          "serp_features_traffic": 14850,
          "serp_features_traffic_cost": {
              "value": 425.20,
              "currency": "USD"
          },
          "serp_features_positions_difference": -30,
          "serp_features_traffic_difference": -650,
          "serp_features_traffic_cost_difference": {
              "value": -15.60,
              "currency": "USD"
          },
          "pla_positions": 0,
          "pla_copies": 0,
          "positions_difference": -110,
          "traffic_difference": -2470,
          "traffic_cost_difference": {
              "value": -73.10,
              "currency": "USD"
          }
      }
  ],
  "meta": {
      "country": "US",
      "device_type": "DESKTOP",
      "filter": "organic_traffic > 100",
      "limit": 10,
      "month": "2024-12",
      "offset": 0,
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true
  }
}

Jump to Get Monthly Domain Rankings TotalGet Monthly Domain Rankings Total

Price: 10 API units per request

Returns the total number of monthly domains matching the request.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/domain-rankings/monthly/total

Query parameters

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case, for example, us. The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE.

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

filter

Domains filter string. For syntax, refer to Advanced filtering. A money field is filtered by its numeric value alone, never by the pair: traffic_cost > 2.50, and the currency is never part of a filter. Available fields: rank, domain, positions, traffic, traffic_cost, organic_positions, organic_traffic, organic_traffic_cost, serp_features_positions, serp_features_traffic, serp_features_traffic_cost, adwords_positions, adwords_traffic, adwords_traffic_cost, pla_positions, pla_copies, positions_difference, traffic_difference, traffic_cost_difference, organic_positions_difference, organic_traffic_difference, organic_traffic_cost_difference, serp_features_positions_difference, serp_features_traffic_difference, serp_features_traffic_cost_difference, adwords_positions_difference, adwords_traffic_difference, adwords_traffic_cost_difference Example: traffic > 100

Value/Type: string

Response Parameters

total

Total number of matching domains.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/domain-rankings/monthly/total?country=US&device_type=DESKTOP&month=2024-12&filter=traffic > 100"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "month": "2024-12",
      "filter": "traffic > 100"
  },
  "data": {
      "total": 2543
  }
}

Jump to Get Monthly Domain SummariesGet Monthly Domain Summaries

Price: 10 API units per request

Returns the target’s monthly aggregated summary metrics grouped by database.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/domain-summaries/monthly

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: example.com

Value/Type: string

scopeRequired

Part of the URL to include in the analysis. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case. The United Kingdom is gb; uk is rejected. A country must have a database available for the selected device_type. Example: US

Value/Type: string

device_typeRequired

Search database device type. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

fields

Field names from the response to include. If omitted, all fields are returned. Supported values: database, rank, month, organic_positions, organic_positions_branded, organic_positions_1_3, organic_positions_4_10, organic_positions_11_20, organic_positions_21_30, organic_positions_31_40, organic_positions_41_50, organic_positions_51_60, organic_positions_61_70, organic_positions_71_80, organic_positions_81_90, organic_positions_91_inf, organic_positions_new, organic_positions_lost, organic_positions_improved, organic_positions_declined, organic_traffic, organic_traffic_cost, organic_traffic_branded, organic_traffic_cost_branded, adwords_positions, adwords_positions_1, adwords_positions_2, adwords_positions_3, adwords_positions_4, adwords_positions_5, adwords_positions_6, adwords_positions_7, adwords_positions_8, adwords_positions_9, adwords_positions_10, adwords_positions_11_20, adwords_positions_21_inf, adwords_traffic, adwords_traffic_cost, pla_positions, pla_positions_1, pla_positions_2, pla_positions_3, pla_positions_4, pla_positions_5, pla_positions_6, pla_positions_7, pla_positions_8, pla_positions_9, pla_positions_10, pla_positions_11_20, pla_positions_21_30, pla_positions_31_inf, pla_copies, intent_commercial_positions, intent_informational_positions, intent_navigational_positions, intent_transactional_positions, intent_unknown_positions, intent_commercial_traffic, intent_informational_traffic, intent_navigational_traffic, intent_transactional_traffic, intent_unknown_traffic, intent_commercial_traffic_cost, intent_informational_traffic_cost, intent_navigational_traffic_cost, intent_transactional_traffic_cost, intent_unknown_traffic_cost, serp_features_positions, serp_features_traffic, serp_features_traffic_cost, serp_features_positions_branded, serp_features_traffic_branded, serp_features_traffic_cost_branded, serp_features_positions_lost, serp_features_positions_new, traffic, traffic_cost, traffic_branded, traffic_cost_branded, keyword_serp_features, position_serp_features.

Value/Type: string[]

Response Parameters

rank

Domain rank.

Value/Type: integer

month

Month in ISO 8601 format (YYYY-MM).

Value/Type: string

database

Search database information.

Value/Type: object

metrics

Aggregated metrics for the domain.

Value/Type: object

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/domain-summaries/monthly?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&fields=rank,month,organic_traffic,organic_positions"
Response example
JSON
{
  "data": {
      "rank": 1,
      "month": "2024-12",
      "database": {
          "country": "US",
          "device": "DESKTOP"
      },
      "metrics": {
          "organic_traffic": 1250000,
          "organic_positions": 45000,
          "organic_traffic_cost": {
              "value": 345000.50,
              "currency": "USD"
          },
          "adwords_positions": 2100,
          "adwords_traffic": 89000
      }
  },
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "month": "2024-12",
      "scope": "ROOT_DOMAIN",
      "url": "example.com",
      "effective_url": "https://example.com"
  }
}

Jump to Get Monthly Domain Summaries TrendGet Monthly Domain Summaries Trend

Price: 10 API units per line

Returns the monthly trend of aggregated summary metrics for the target: one data point per month within the requested range, including months without data.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/domain-summaries/trend/monthly

Query parameters

urlRequired

Target URL to query. Maximum 2,000 characters. Accepts URLs with or without the protocol (https://). Example: example.com

Value/Type: string

scopeRequired

Part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

date_fromRequired

Start date of the range. Format: ISO 8601 YYYY-MM. Example: 2024-01

Value/Type: string

date_toRequired

End date of the range. Format: ISO 8601 YYYY-MM. Example: 2024-12

Value/Type: string

countryRequired

Country code in ISO 3166-1 Alpha-2 format (case-insensitive). For example, US for the United States, GB for the United Kingdom. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: desktop search database. MOBILE: mobile search database; not available for all countries. Example: DESKTOP

Value/Type: string

fields

Metric names to include in the response. If omitted, all metrics are returned. Supported values include position metrics (for example, organic_positions, adwords_positions), traffic metrics (for example, organic_traffic, adwords_traffic), cost metrics (for example, organic_traffic_cost), intent-based metrics (for example, intent_commercial_positions), and SERP feature metrics (for example, serp_features_positions). Example: organic_positions,organic_traffic,adwords_positions

Value/Type: string[]

Response Parameters

month

Month in ISO 8601 format (YYYY-MM). Always present whether or not requested in fields.

Value/Type: string

rank

Rank of the target in the database for this month. Not set for a month without data.

Value/Type: integer

metrics

Aggregated performance metrics, limited to the requested fields. Not set for a month without data or when no metrics are requested in fields.

Value/Type: object

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/domain-summaries/trend/monthly?url=example.com&scope=ROOT_DOMAIN&date_from=2024-01&date_to=2024-12&country=US&device_type=DESKTOP&fields=organic_positions,organic_traffic,rank,month"
Response example
JSON
{
  "meta": {
      "country": "US",
      "date_from": "2024-01",
      "date_to": "2024-03",
      "device_type": "DESKTOP",
      "effective_url": "https://example.com",
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "scope": "ROOT_DOMAIN",
      "status_code": 200,
      "success": true,
      "url": "example.com"
  },
  "data": [
      {
          "month": "2024-01",
          "rank": 1542,
          "metrics": {
              "organic_positions": 8234,
              "organic_traffic": 25680
          }
      },
      {
          "month": "2024-02",
          "rank": 1489,
          "metrics": {
              "organic_positions": 8567,
              "organic_traffic": 27150
          }
      },
      {
          "month": "2024-03",
          "rank": 1451,
          "metrics": {
              "organic_positions": 8945,
              "organic_traffic": 29420
          }
      }
  ]
}

Jump to Get Monthly Organic PositionsGet Monthly Organic Positions

Price: 10 API units per line

Returns a list of monthly organic positions by keywords that the domain ranks for.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/keywords/monthly

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://samplesite.com

Value/Type: string

scopeRequired

scope determines which part of the URL will be taken into account. Required. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM), for example, 2024-12. If omitted, the latest monthly snapshot for the selected country and device_type is returned. A month without a monthly snapshot is rejected; it is never replaced by the latest month.

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case, for example, us. The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

position_type

Type of positions to return. If omitted, organic and SERP-feature positions are both returned. Supported values: ORGANIC, SERP_FEATURE. ORGANIC: positions in the regular organic results only. SERP_FEATURE: positions inside SERP features only.

Value/Type: string

filter

Position filter string. For syntax, refer to Advanced filtering. domain is not filterable (it is the resolved target and therefore constant across the list); intents and trends are not filterable either. A money field is filtered by its numeric value alone, never by the pair: cpc > 2.50, and the currency is never part of a filter. Available fields: competition_density, cpc, keyword, keyword_difficulty, keyword_serp_features, position, position_difference, position_previous, position_serp_features, results, traffic, traffic_cost, traffic_cost_percent, traffic_difference, traffic_difference_abs, traffic_percent, url, volume, is_keyword_branded, is_serp_feature, serp_feature. SERP-feature fields (serp_feature, keyword_serp_features, position_serp_features) take SerpFeature value names as quoted strings, never numeric IDs. The flags (is_keyword_branded, is_serp_feature) take true or false, case-insensitive; 1 and 0 are accepted as well. Filter values use the same units as the response fields, without implicit scaling: cpc is in USD (cpc > 2.50 means $2.50) and competition_density is on 0 to 100. position_previous and position_difference compare ranked months only: a keyword with no previous position never matches such a comparison, whatever the operator. Example: keyword = "seo" AND position > 10, serp_feature = "ADS_BOTTOM", keyword_serp_features HAS_ANY ("REVIEWS", "AI_OVERVIEW"), cpc > 2.50 AND volume > 1000, is_keyword_branded = true. Example: volume > 100

Value/Type: string

fields

Field names from the response entity to include in the response. All if nothing is specified. A money field such as cpc or a *_traffic_cost selects the whole pair (value and currency), not a bare number. type is not selectable: it is set on every row. Supported values: competition_density, cpc, domain, keyword, keyword_difficulty, keyword_serp_features, position, position_difference, position_previous, position_serp_features, results, traffic, traffic_cost, traffic_cost_percent, traffic_difference, traffic_difference_abs, traffic_percent, trends, url, volume, intents, is_keyword_branded, is_serp_feature, serp_feature.

Value/Type: string[]

limit

Maximum number of positions to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of positions to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

order_by

Field name to sort by. Default: volume. domain is not sortable: it is the resolved target and therefore constant across the list. The repeated fields (keyword_serp_features, position_serp_features, trends, intents) are not sortable either: a list has no single value to order by. Money fields sort by their numeric value. Sorting by position_previous puts the new rankings, which have none, last in either direction. Supported values: competition_density, cpc, keyword, keyword_difficulty, position, position_difference, position_previous, results, traffic, traffic_cost, traffic_cost_percent, traffic_difference, traffic_difference_abs, traffic_percent, url, volume, is_keyword_branded, is_serp_feature, serp_feature.

Value/Type: string

direction

Sorting direction (ascending or descending). Default: DESC. Supported values: ASC, DESC. Example: DESC

Value/Type: string

Response Parameters

competition_density

Competition level of advertisers bidding on the keyword in paid search. Range: 0–100, where 100 is most competitive.

Value/Type: number

cpc

Value/Type: object

domain

Ranking domain.

Value/Type: string

intents

Search intents associated with the keyword. Possible values: COMMERCIAL, INFORMATIONAL, NAVIGATIONAL, TRANSACTIONAL.

Value/Type: string[]

is_keyword_branded

Specifies whether the keyword includes a brand name.

Value/Type: boolean

is_serp_feature

Specifies whether the position is a SERP feature rather than an organic result.

Value/Type: boolean

keyword

Keyword.

Value/Type: string

keyword_difficulty

Keyword difficulty score (0–100).

Value/Type: integer

keyword_serp_features

List of SERP features present for the keyword.

Value/Type: string[]

position

Current organic position.

Value/Type: integer

position_difference

Change in position (previous minus current; positive when ranking improved). Absent when there is no previous position.

Value/Type: integer

position_previous

Previous organic position. Absent when the keyword did not rank in the previous month.

Value/Type: integer

position_serp_features

List of SERP features of the position.

Value/Type: string[]

results

Number of search results for the keyword.

Value/Type: integer

serp_feature

Type of SERP feature if this is a SERP feature position (for example, INSTANT_ANSWER, FEATURED_SNIPPET).

Value/Type: string

traffic

Estimated monthly traffic from the keyword.

Value/Type: integer

traffic_cost

Value/Type: object

traffic_cost_percent

Share of keyword’s cost in total domain traffic cost as a percentage. Range: 0–100.

Value/Type: number

traffic_difference

Change in traffic (can be negative).

Value/Type: integer

traffic_difference_abs

Absolute value of traffic change.

Value/Type: integer

traffic_percent

Share of keyword traffic in total domain traffic as a percentage. Range: 0–100.

Value/Type: number

trends

Monthly search volume trend data. Each value is a relative index on a 0–100 scale.

Value/Type: integer[]

type

Position type: ORGANIC or SERP_FEATURE.

Value/Type: string

url

URL ranking for the keyword.

Value/Type: string

volume

Monthly search volume.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/keywords/monthly?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&position_type=ORGANIC&filter=volume%20%3E%20100&limit=10"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "effective_url": "https://example.com",
      "scope": "ROOT_DOMAIN",
      "month": "2024-12",
      "limit": 10,
      "offset": 0,
      "url": "https://example.com"
  },
  "data": [
      {
          "keyword": "seo tools",
          "volume": 2400,
          "position": 3,
          "traffic": 1850,
          "traffic_percent": 5.2,
          "traffic_cost": {
              "value": 92.50,
              "currency": "USD"
          },
          "traffic_cost_percent": 3.8,
          "traffic_difference": 120,
          "traffic_difference_abs": 120,
          "traffic_cost": {
              "value": 92.50,
              "currency": "USD"
          },
          "cpc": {
              "value": 5.25,
              "currency": "USD"
          },
          "competition_density": 85,
          "keyword_difficulty": 72,
          "results": 1250000000,
          "url": "https://example.com/seo-tools",
          "domain": "example.com",
          "is_keyword_branded": false,
          "is_serp_feature": false,
          "type": "ORGANIC",
          "position_previous": 4,
          "position_difference": 1,
          "keyword_serp_features": ["FEATURED_SNIPPET"],
          "position_serp_features": [],
          "intents": ["INFORMATIONAL", "COMMERCIAL"],
          "trends": [45, 52, 58, 65, 72, 78, 85, 88, 92, 95, 98, 100]
      },
      {
          "keyword": "content marketing strategy",
          "volume": 1800,
          "position": 7,
          "traffic": 920,
          "traffic_percent": 2.1,
          "traffic_difference": -150,
          "traffic_difference_abs": 150,
          "traffic_cost": {
              "value": 48.60,
              "currency": "USD"
          },
          "traffic_cost_percent": 2.0,
          "cpc": {
              "value": 4.05,
              "currency": "USD"
          },
          "competition_density": 62,
          "keyword_difficulty": 58,
          "results": 890000000,
          "url": "https://example.com/marketing/content-strategy",
          "domain": "example.com",
          "is_keyword_branded": false,
          "is_serp_feature": false,
          "type": "ORGANIC",
          "position_previous": 6,
          "position_difference": -1,
          "keyword_serp_features": [],
          "position_serp_features": [],
          "intents": ["INFORMATIONAL"],
          "trends": [30, 35, 40, 42, 45, 48, 52, 55, 58, 61, 64, 68]
      }
  ]
}

Jump to Get Monthly Organic Positions TotalGet Monthly Organic Positions Total

Price: 10 API units per request

Returns the total number of monthly organic keywords the domain ranks for.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/keywords/monthly/total

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://example.com

Value/Type: string

scopeRequired

Which part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. A month without a snapshot is rejected and never replaced with the latest month. Example: 2024-12

Value/Type: string

countryRequired

Country code in ISO 3166-1 Alpha-2 format, case-insensitive. The United Kingdom is gb; uk is rejected. A country with no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get available country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Search database device type. Supported values: DESKTOP, MOBILE. DESKTOP for the country’s desktop database; MOBILE for mobile (not all countries have a mobile database).

Value/Type: string

position_type

Type of positions to return. If omitted, both organic and SERP-feature positions are included. Supported values: ORGANIC, SERP_FEATURE. ORGANIC for regular organic results only; SERP_FEATURE for SERP features only.

Value/Type: string

filter

Position filter string. For syntax, refer to Advanced filtering. domain is not filterable (it is the resolved target and therefore constant across the list); intents and trends are not filterable either. A money field is filtered by its numeric value alone, never by the pair: cpc > 2.50, and the currency is never part of a filter. Available fields: competition_density, cpc, keyword, keyword_difficulty, keyword_serp_features, position, position_difference, position_previous, position_serp_features, results, traffic, traffic_cost, traffic_cost_percent, traffic_difference, traffic_difference_abs, traffic_percent, url, volume, is_keyword_branded, is_serp_feature, serp_feature. SERP-feature fields (serp_feature, keyword_serp_features, position_serp_features) take SerpFeature value names as quoted strings, never numeric IDs. The flags (is_keyword_branded, is_serp_feature) take true or false, case-insensitive; 1 and 0 are accepted as well. Filter values use the same units as the response fields, without implicit scaling: cpc is in USD (cpc > 2.50 means $2.50) and competition_density is on 0 to 100. position_previous and position_difference compare ranked months only: a keyword with no previous position never matches such a comparison, whatever the operator. Example: position > 10 AND volume > 1000

Value/Type: string

Response Parameters

data

total

Value/Type: integer

Value/Type: object

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/keywords/monthly/total?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&position_type=ORGANIC&filter=position > 10 AND volume > 1000"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "url": "https://example.com",
      "country": "US",
      "device_type": "DESKTOP",
      "scope": "ROOT_DOMAIN",
      "month": "2024-12",
      "position_type": "ORGANIC",
      "filter": "position > 10 AND volume > 1000",
      "effective_url": "https://example.com"
  },
  "data": {
      "total": 1247
  }
}

Jump to Get Monthly Position ChangesGet Monthly Position Changes

Price: 20 API units per line

Returns a list of monthly ranking changes. base_month and comparison_month are months in YYYY-MM format, for example, 2026-07 and 2026-08; they need not be adjacent. base_month must be earlier than comparison_month and at most 24 months before the latest monthly snapshot of the selected database. Both months need a monthly snapshot; a month without one is rejected, never replaced by another month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/keywords/changes/monthly

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://example.com

Value/Type: string

scopeRequired

Which part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

base_monthRequired

Earlier month of the comparison. Must be earlier than comparison_month. Values for this month are returned in the *_previous fields. Format: ISO 8601 YYYY-MM (for example, 2024-01).

Value/Type: string

comparison_monthRequired

Later month of the comparison, compared against base_month. Values for this month are returned in the fields without the _previous suffix. Format: ISO 8601 YYYY-MM (for example, 2024-12).

Value/Type: string

countryRequired

Country database code in ISO 3166-1 Alpha-2 format, in any letter case (for example, us). The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

position_type

Type of positions to return. If omitted, organic and SERP-feature positions are both returned. Supported values: ORGANIC, SERP_FEATURE. ORGANIC: positions in the regular organic results only. SERP_FEATURE: positions inside SERP features only.

Value/Type: string

change_types

Types of position changes to return. All if nothing is specified. A ranking is one keyword at one URL, in the regular results or in one SERP feature; a keyword whose ranking URL changed is LOST at the old URL and NEW at the new one. Supported values:

- NEW: The ranking exists in comparison_month but not in base_month. - LOST: The ranking exists in base_month but not in comparison_month. - IMPROVED: A ranking present in both months moved to a better position (a lower position number), in the regular results or in a SERP feature. - DECLINED: A ranking present in both months moved to a worse position (a higher position number), in the regular results or in a SERP feature. - UNCHANGED: The position is the same in both months; such a ranking is returned only when its traffic estimate changed.

Every returned change has one of these types, so requesting all five returns the same changes as omitting this parameter.

Value/Type: string[]

filter

Position changes filter string. For syntax, refer to Advanced filtering. intents, keyword_serp_features_new and keyword_serp_features_lost are not filterable. A money field is filtered by its numeric value alone, never by the pair: cpc > 2.50, and the currency is never part of a filter. Available fields: keyword, url, volume, position, position_difference, position_previous, traffic, traffic_previous, traffic_cost, traffic_cost_previous, traffic_cost_percent, traffic_difference, traffic_percent, competition_density, cpc, keyword_difficulty, results, is_keyword_branded, is_serp_feature, serp_feature, traffic_difference_abs, is_branded. The serp_feature field takes SerpFeature value names as quoted strings, never numeric IDs. The flags (is_keyword_branded, is_serp_feature, is_branded) take true or false, case-insensitive; 1 and 0 are accepted as well. Filter values use the same units as the response fields, without implicit scaling: cpc is in USD (cpc > 2.50 means $2.50) and competition_density is on 0 to 100. position, position_previous and position_difference compare ranked months only: a LOST change has no position, a NEW change no previous one, neither has a difference, and none matches such a comparison whatever the operator (position > 10 excludes LOST rows). Example: keyword = "seo" AND position > 10, serp_feature = "ADS_BOTTOM", cpc > 2.50 AND volume > 100, is_branded = true. Example: volume > 100

Value/Type: string

fields

Field names from the response entity to include in the response. All if nothing is specified. A money field such as cpc or a *_traffic_cost selects the whole pair (value and currency), not a bare number. Supported values: keyword, url, volume, position, position_difference, position_previous, traffic, traffic_previous, traffic_cost, traffic_cost_previous, traffic_cost_percent, traffic_difference, traffic_percent, competition_density, cpc, keyword_difficulty, keyword_serp_features_new, keyword_serp_features_lost, results, intents, is_keyword_branded, is_serp_feature, serp_feature, traffic_difference_abs, is_branded.

Value/Type: string[]

limit

Maximum number of position changes to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of position changes to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

order_by

Field name to sort by. Default: traffic_difference_abs. Money fields sort by their numeric value. Not sortable: the repeated fields (keyword_serp_features_new, keyword_serp_features_lost, intents), the flags (is_keyword_branded, is_serp_feature, is_branded) and serp_feature. Sorting by position, position_previous or position_difference puts the changes without that value (LOST, NEW) last in either direction. Supported values: keyword, url, volume, position, position_difference, position_previous, traffic, traffic_previous, traffic_cost, traffic_cost_previous, traffic_cost_percent, traffic_difference, traffic_percent, competition_density, cpc, keyword_difficulty, results, traffic_difference_abs.

Value/Type: string

direction

Sorting direction (ascending or descending). Default: DESC. Supported values: ASC, DESC. Example: DESC

Value/Type: string

Response Parameters

change_type

Type of ranking change. One of: NEW (exists in comparison month only), LOST (exists in base month only), IMPROVED (moved to better position), DECLINED (moved to worse position), or UNCHANGED (same position but traffic changed).

Value/Type: string

keyword

Keyword associated with the ranking change.

Value/Type: string

url

URL associated with the ranking change.

Value/Type: string

volume

Monthly search volume for the keyword.

Value/Type: integer

position

Current organic position in the comparison month. Absent for LOST changes (keyword does not rank in comparison month).

Value/Type: integer

position_previous

Organic position in the base month. Absent for NEW changes (keyword did not rank in base month).

Value/Type: integer

position_difference

Change in position (position_previous minus position). Positive when ranking improved. Absent for NEW or LOST changes.

Value/Type: integer

traffic

Current estimated traffic to this keyword’s ranking in the comparison month.

Value/Type: integer

traffic_previous

Estimated traffic to this keyword’s ranking in the base month.

Value/Type: integer

traffic_difference

Change in estimated traffic.

Value/Type: integer

traffic_difference_abs

Absolute value of traffic change.

Value/Type: integer

traffic_percent

Share of this keyword’s traffic in total domain traffic as a percentage (0–100).

Value/Type: number

traffic_cost

Current traffic cost in USD (comparison month).

traffic_cost

Value/Type: object

Value/Type: object

traffic_cost_previous

Previous traffic cost in USD (base month).

traffic_cost_previous

Value/Type: object

Value/Type: object

traffic_cost_percent

Share of this keyword’s cost in total domain traffic cost as a percentage (0–100).

Value/Type: number

competition_density

Competition level of advertisers bidding on the keyword in paid search (0–100, where 100 is most competitive).

Value/Type: number

cpc

Cost per click of the keyword in USD.

cpc

Value/Type: object

Value/Type: object

keyword_difficulty

Keyword difficulty score (0–100).

Value/Type: integer

results

Number of search results for the keyword.

Value/Type: integer

position_type

Position type: ORGANIC (regular organic results) or SERP_FEATURE (inside SERP feature block).

Value/Type: string

is_serp_feature

Whether the URL was obtained from a SERP feature block instead of regular organic results.

Value/Type: boolean

serp_feature

Type of SERP feature (for example, FEATURED_SNIPPET, ADS_BOTTOM, KNOWLEDGE_PANEL). Absent for regular organic results.

Value/Type: string

keyword_serp_features_new

List of new SERP features the keyword now appears in (for example, FEATURED_SNIPPET, KNOWLEDGE_PANEL). Empty if no new features in comparison month.

Value/Type: string[]

keyword_serp_features_lost

List of SERP features the keyword no longer appears in. Empty if no features were lost.

Value/Type: string[]

intents

Search intents associated with the keyword. Possible values: COMMERCIAL, INFORMATIONAL, NAVIGATIONAL, TRANSACTIONAL.

Value/Type: string[]

is_keyword_branded

Whether the keyword is branded for one of the domains on the SERP.

Value/Type: boolean

is_branded

Whether the keyword is branded for this domain specifically.

Value/Type: boolean

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/keywords/changes/monthly?url=example.com&scope=ROOT_DOMAIN&base_month=2024-11&comparison_month=2024-12&country=US&device_type=DESKTOP&position_type=ORGANIC&change_types=DECLINED,IMPROVED,LOST&filter=volume%20%3E%20100"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "url": "https://example.com",
      "scope": "ROOT_DOMAIN",
      "device_type": "DESKTOP",
      "country": "US",
      "limit": 10,
      "offset": 0,
      "effective_url": "https://example.com"
  },
  "data": [
      {
          "keyword": "best seo tips",
          "url": "https://example.com/blog/seo",
          "volume": 1250,
          "position": 5,
          "position_previous": 8,
          "position_difference": 3,
          "change_type": "IMPROVED",
          "traffic": 320,
          "traffic_previous": 180,
          "traffic_difference": 140,
          "traffic_difference_abs": 140,
          "traffic_percent": 2.8,
          "traffic_cost": {"value": 45.50, "currency": "USD"},
          "traffic_cost_previous": {"value": 28.75, "currency": "USD"},
          "traffic_cost_percent": 3.2,
          "competition_density": 68,
          "cpc": {"value": 2.85, "currency": "USD"},
          "keyword_difficulty": 72,
          "results": 892000000,
          "position_type": "ORGANIC",
          "is_serp_feature": false,
          "keyword_serp_features_new": [],
          "keyword_serp_features_lost": [],
          "intents": ["INFORMATIONAL"],
          "is_keyword_branded": false,
          "is_branded": false
      },
      {
          "keyword": "seo tutorial",
          "url": "https://example.com/guides/seo",
          "volume": 850,
          "position_previous": 12,
          "change_type": "LOST",
          "traffic": 0,
          "traffic_previous": 95,
          "traffic_difference": -95,
          "traffic_difference_abs": 95,
          "traffic_percent": 0,
          "traffic_cost": {"value": 0, "currency": "USD"},
          "traffic_cost_previous": {"value": 12.50, "currency": "USD"},
          "traffic_cost_percent": 0,
          "competition_density": 52,
          "cpc": {"value": 1.95, "currency": "USD"},
          "keyword_difficulty": 58,
          "results": 645000000,
          "position_type": "ORGANIC",
          "is_serp_feature": false,
          "keyword_serp_features_new": [],
          "keyword_serp_features_lost": [],
          "intents": ["INFORMATIONAL"],
          "is_keyword_branded": false,
          "is_branded": false
      },
      {
          "keyword": "search engine optimization",
          "url": "https://example.com/",
          "volume": 2100,
          "position": 3,
          "change_type": "NEW",
          "traffic": 510,
          "traffic_previous": 0,
          "traffic_difference": 510,
          "traffic_difference_abs": 510,
          "traffic_percent": 4.5,
          "traffic_cost": {"value": 78.30, "currency": "USD"},
          "traffic_cost_previous": {"value": 0, "currency": "USD"},
          "traffic_cost_percent": 5.5,
          "competition_density": 85,
          "cpc": {"value": 3.75, "currency": "USD"},
          "keyword_difficulty": 88,
          "results": 1250000000,
          "position_type": "ORGANIC",
          "is_serp_feature": false,
          "keyword_serp_features_new": ["FEATURED_SNIPPET"],
          "keyword_serp_features_lost": [],
          "intents": ["INFORMATIONAL"],
          "is_keyword_branded": false,
          "is_branded": false
      }
  ]
}

Jump to Get Monthly Position Changes TotalGet Monthly Position Changes Total

Price: 10 API units per request

Returns the total number of monthly position changes. base_month and comparison_month are months in YYYY-MM format, for example, 2026-07 and 2026-08; they need not be adjacent. base_month must be earlier than comparison_month and at most 24 months before the latest monthly snapshot of the selected database. Both months need a monthly snapshot; a month without one is rejected, never replaced by another month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/keywords/changes/monthly/total

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://example.com

Value/Type: string

scopeRequired

scope determines which part of the URL will be taken into account. Required. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

base_monthRequired

Earlier month of the comparison. Must be earlier than comparison_month. Format: ISO 8601 YYYY-MM (for example, 2024-01).

Value/Type: string

comparison_monthRequired

Later month of the comparison, compared against base_month. Format: ISO 8601 YYYY-MM (for example, 2024-12).

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case, for example, us. The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: us

Value/Type: string

device_typeRequired

Search database type. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has. Example: DESKTOP

Value/Type: string

position_type

Type of positions to return. If omitted, organic and SERP-feature positions are both returned. Supported values: ORGANIC, SERP_FEATURE. ORGANIC: positions in the regular organic results only. SERP_FEATURE: positions inside SERP features only.

Value/Type: string

change_types

Types of position changes to return. All if nothing is specified. A ranking is one keyword at one URL, in the regular results or in one SERP feature; a keyword whose ranking URL changed is LOST at the old URL and NEW at the new one. Supported values:

- NEW: The ranking exists in comparison_month but not in base_month. - LOST: The ranking exists in base_month but not in comparison_month. - IMPROVED: A ranking present in both months moved to a better position (a lower position number), in the regular results or in a SERP feature. - DECLINED: A ranking present in both months moved to a worse position (a higher position number), in the regular results or in a SERP feature. - UNCHANGED: The position is the same in both months; such a ranking is returned only when its traffic estimate changed.

Every returned change has one of these types, so requesting all five returns the same changes as omitting this parameter.

Value/Type: string[]

filter

Position changes filter string. For syntax, refer to Advanced filtering. intents, keyword_serp_features_new and keyword_serp_features_lost are not filterable. Money fields are filtered by their numeric value alone, never by currency: cpc > 2.50 means $2.50 USD. Available fields: keyword, url, volume, position, position_difference, position_previous, traffic, traffic_previous, traffic_cost, traffic_cost_previous, traffic_cost_percent, traffic_difference, traffic_percent, competition_density, cpc, keyword_difficulty, results, is_keyword_branded, is_serp_feature, serp_feature, traffic_difference_abs, is_branded. The serp_feature field takes SerpFeature value names as quoted strings. Boolean flags (is_keyword_branded, is_serp_feature, is_branded) accept true or false (case-insensitive), and also 1 or 0. Filter values use the same units as response fields. For ranked changes only: a LOST change has no position, a NEW change no previous position, neither has a difference, and position-based filters exclude unranked rows. Example: keyword = "seo" AND position > 10

Value/Type: string

Response Parameters

data

Response data containing the position changes total.

total

Value/Type: integer

Value/Type: object

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/keywords/changes/monthly/total?url=example.com&scope=ROOT_DOMAIN&base_month=2024-01&comparison_month=2024-12&country=us&device_type=DESKTOP&position_type=ORGANIC&change_types=DECLINED,IMPROVED,LOST&filter=keyword%20%3D%20%22seo%22%20AND%20position%20%3E%2010"
Response example
JSON
{
  "data": {
      "total": 15
  },
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "url": "https://example.com",
      "effective_url": "https://example.com",
      "scope": "ROOT_DOMAIN",
      "country": "us",
      "device_type": "DESKTOP",
      "position_type": "ORGANIC",
      "change_types": [
          "DECLINED",
          "IMPROVED",
          "LOST"
      ],
      "filter": "keyword = \"seo\" AND position > 10"
  }
}

Jump to Get Monthly Ranked PagesGet Monthly Ranked Pages

Price: 10 API units per line

Returns a list of monthly pages (URLs) on the domain that rank organically.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/pages/monthly

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: example.com

Value/Type: string

scopeRequired

Part of the URL to include in the analysis. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case. The United Kingdom is gb; uk is rejected. A country must have a database available for the selected device_type. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

filter

Pages filter string. For syntax, refer to Advanced filtering. If omitted, no filter is applied. Available fields: url, organic_positions, organic_traffic, adwords_positions, intent_breakdown.top_20.commercial.positions, intent_breakdown.top_20.informational.positions, intent_breakdown.top_20.navigational.positions, intent_breakdown.top_20.transactional.positions, intent_breakdown.top_20.unknown.positions, intent_breakdown.top_20.commercial.traffic, intent_breakdown.top_20.informational.traffic, intent_breakdown.top_20.navigational.traffic, intent_breakdown.top_20.transactional.traffic, intent_breakdown.top_20.unknown.traffic, serp_features_positions, serp_features_traffic, positions, traffic, traffic_percent. The url field accepts text operators CONTAINS, STARTS_WITH, ENDS_WITH (case-sensitive) and exact match operators =, !=, IN. All other fields accept numeric operators: =, !=, >, >=, <, <=, IN. Example: organic_traffic > 50

Value/Type: string

fields

Field names from the response to include. If omitted, all fields are returned. Supported values: url, organic_positions, organic_traffic, adwords_positions, intent_breakdown.top_20.commercial.positions, intent_breakdown.top_20.informational.positions, intent_breakdown.top_20.navigational.positions, intent_breakdown.top_20.transactional.positions, intent_breakdown.top_20.unknown.positions, intent_breakdown.top_20.commercial.traffic, intent_breakdown.top_20.informational.traffic, intent_breakdown.top_20.navigational.traffic, intent_breakdown.top_20.transactional.traffic, intent_breakdown.top_20.unknown.traffic, serp_features_positions, serp_features_traffic, positions, traffic, traffic_percent.

Value/Type: string[]

limit

Maximum number of pages to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of pages to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

order_by

Field name to sort by. Default: traffic. Supported values: url, organic_positions, organic_traffic, adwords_positions, intent_breakdown.top_20.commercial.positions, intent_breakdown.top_20.informational.positions, intent_breakdown.top_20.navigational.positions, intent_breakdown.top_20.transactional.positions, intent_breakdown.top_20.unknown.positions, intent_breakdown.top_20.commercial.traffic, intent_breakdown.top_20.informational.traffic, intent_breakdown.top_20.navigational.traffic, intent_breakdown.top_20.transactional.traffic, intent_breakdown.top_20.unknown.traffic, serp_features_positions, serp_features_traffic, positions, traffic, traffic_percent.

Value/Type: string

direction

Sorting direction. Default: DESC. Supported values: ASC, DESC. ASC: ascending, smallest value first. DESC: descending, largest value first. Example: DESC

Value/Type: string

Response Parameters

url

Ranking page URL.

Value/Type: string

organic_positions

Number of organic keyword positions.

Value/Type: integer

organic_traffic

Estimated organic traffic.

Value/Type: integer

adwords_positions

Number of paid (AdWords) keyword positions.

Value/Type: integer

serp_features_positions

Number of positions with SERP features.

Value/Type: integer

serp_features_traffic

Traffic from positions with SERP features.

Value/Type: integer

positions

Total number of positions (computed as organic_positions + serp_features_positions). Paid (AdWords) positions are not included.

Value/Type: integer

traffic

Total estimated traffic.

Value/Type: integer

traffic_percent

Share of this page’s traffic relative to the domain as a percentage (0–100).

Value/Type: number

intent_breakdown

Breakdown of keyword metrics by position range, split by search intent.

Value/Type: object

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/pages/monthly?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&filter=organic_traffic>50&fields=url,organic_positions,organic_traffic,traffic_percent&limit=10"
Response example
JSON
{
  "data": [
      {
          "url": "https://example.com/blog/seo-tips",
          "organic_positions": 284,
          "organic_traffic": 15230,
          "adwords_positions": 0,
          "serp_features_positions": 18,
          "serp_features_traffic": 2100,
          "positions": 302,
          "traffic": 17330,
          "traffic_percent": 12.5,
          "intent_breakdown": {
              "top_20": {
                  "commercial": {
                      "positions": 5,
                      "traffic": 3200
                  },
                  "informational": {
                      "positions": 12,
                      "traffic": 8500
                  },
                  "navigational": {
                      "positions": 2,
                      "traffic": 4200
                  },
                  "transactional": {
                      "positions": 1,
                      "traffic": 1400
                  },
                  "unknown": {
                      "positions": 0,
                      "traffic": 0
                  }
              }
          }
      },
      {
          "url": "https://example.com/services",
          "organic_positions": 156,
          "organic_traffic": 8920,
          "adwords_positions": 2,
          "serp_features_positions": 4,
          "serp_features_traffic": 680,
          "positions": 160,
          "traffic": 9600,
          "traffic_percent": 6.9,
          "intent_breakdown": {
              "top_20": {
                  "commercial": {
                      "positions": 8,
                      "traffic": 5100
                  },
                  "informational": {
                      "positions": 3,
                      "traffic": 2400
                  },
                  "navigational": {
                      "positions": 1,
                      "traffic": 1200
                  },
                  "transactional": {
                      "positions": 0,
                      "traffic": 0
                  },
                  "unknown": {
                      "positions": 0,
                      "traffic": 0
                  }
              }
          }
      }
  ],
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "month": "2024-12",
      "scope": "ROOT_DOMAIN",
      "url": "example.com",
      "effective_url": "https://example.com",
      "limit": 10,
      "offset": 0,
      "order_by": "traffic",
      "filter": "organic_traffic>50"
  }
}

Jump to Get Monthly Ranked Pages TotalGet Monthly Ranked Pages Total

Price: 10 API units per request

Returns the total number of monthly ranking pages for the domain matching the specified criteria.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/pages/monthly/total

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: example.com

Value/Type: string

scopeRequired

Part of the URL to include in the analysis. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case, for example, us. The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

filter

Pages filter string. For syntax, refer to Advanced filtering. If omitted, no filter is applied. Available fields: url, organic_positions, organic_traffic, adwords_positions, intent_breakdown.top_20.commercial.positions, intent_breakdown.top_20.informational.positions, intent_breakdown.top_20.navigational.positions, intent_breakdown.top_20.transactional.positions, intent_breakdown.top_20.unknown.positions, intent_breakdown.top_20.commercial.traffic, intent_breakdown.top_20.informational.traffic, intent_breakdown.top_20.navigational.traffic, intent_breakdown.top_20.transactional.traffic, intent_breakdown.top_20.unknown.traffic, serp_features_positions, serp_features_traffic, positions, traffic, traffic_percent. Text fields like url support CONTAINS, STARTS_WITH, and ENDS_WITH (case-sensitive); numeric fields support =, !=, &gt;, &gt;=, &lt;, &lt;=, and IN. Use uppercase for operators and AND/OR, and quote strings. Example: traffic &gt; 50

Value/Type: string

Response Parameters

data

Response payload containing the count of matching pages.

(data fields)

Value/Type: object

Value/Type: object

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/pages/monthly/total?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&filter=traffic%20%3E%2050"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true
  },
  "data": {
      "total": 42
  }
}

Jump to Get Monthly Ranked Pages ChangesGet Monthly Ranked Pages Changes

Price: 20 API units per line

Returns a list of monthly pages with ranking changes. base_month and comparison_month are months in YYYY-MM format, for example, 2026-07 and 2026-08; they need not be adjacent. base_month must be earlier than comparison_month and at most 24 months before the latest monthly snapshot of the selected database. Both months need a monthly snapshot; a month without one is rejected, never replaced by another month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/pages/changes/monthly

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://example.com

Value/Type: string

scopeRequired

Part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

base_monthRequired

Earlier month of the comparison. Must be earlier than comparison_month. Values for this month are returned in the *_previous fields. Format: ISO 8601 YYYY-MM (for example, 2024-01).

Value/Type: string

comparison_monthRequired

Later month of the comparison, compared against base_month. Values for this month are returned in the fields without the _previous suffix. Format: ISO 8601 YYYY-MM (for example, 2024-12).

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case (for example, us). The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has. Example: DESKTOP

Value/Type: string

fields

Field names from the response entity to include in the response. All if nothing is specified. The names are fields of the response items, described in the response schema. Supported values: url, organic_positions, organic_traffic, adwords_positions, intent_breakdown.top_20.commercial.positions, intent_breakdown.top_20.informational.positions, intent_breakdown.top_20.navigational.positions, intent_breakdown.top_20.transactional.positions, intent_breakdown.top_20.unknown.positions, intent_breakdown.top_20.commercial.traffic, intent_breakdown.top_20.informational.traffic, intent_breakdown.top_20.navigational.traffic, intent_breakdown.top_20.transactional.traffic, intent_breakdown.top_20.unknown.traffic, serp_features_positions, serp_features_traffic, positions, positions_previous, positions_difference, positions_difference_abs, traffic, traffic_percent, traffic_previous, traffic_difference, traffic_difference_abs.

Value/Type: string[]

filter

Page changes filter string. For syntax, refer to Advanced filtering. If omitted, no filter is applied. Available fields: url, organic_positions, organic_traffic, adwords_positions, intent_breakdown.top_20.commercial.positions, intent_breakdown.top_20.informational.positions, intent_breakdown.top_20.navigational.positions, intent_breakdown.top_20.transactional.positions, intent_breakdown.top_20.unknown.positions, intent_breakdown.top_20.commercial.traffic, intent_breakdown.top_20.informational.traffic, intent_breakdown.top_20.navigational.traffic, intent_breakdown.top_20.transactional.traffic, intent_breakdown.top_20.unknown.traffic, serp_features_positions, serp_features_traffic, positions, positions_previous, positions_difference, positions_difference_abs, traffic, traffic_percent, traffic_previous, traffic_difference, traffic_difference_abs. url is the full page URL exactly as the response url field returns it, matched as a whole by =, != and IN; every other field is a number: =, !=, &gt;, &gt;=, &lt;, &lt;=, IN. positions_difference and traffic_difference are the comparison_month value minus the base_month value, so a negative value is a decrease; the *_abs fields are their absolute values. Write operators, AND and OR in upper case and strings in double quotes, and use parentheses when mixing AND and OR. Example: traffic_percent &gt; 1

Value/Type: string

order_by

Field name to sort by. Default: traffic. Supported values: url, organic_positions, organic_traffic, adwords_positions, intent_breakdown.top_20.commercial.positions, intent_breakdown.top_20.informational.positions, intent_breakdown.top_20.navigational.positions, intent_breakdown.top_20.transactional.positions, intent_breakdown.top_20.unknown.positions, intent_breakdown.top_20.commercial.traffic, intent_breakdown.top_20.informational.traffic, intent_breakdown.top_20.navigational.traffic, intent_breakdown.top_20.transactional.traffic, intent_breakdown.top_20.unknown.traffic, serp_features_positions, serp_features_traffic, positions, positions_previous, positions_difference, positions_difference_abs, traffic, traffic_percent, traffic_previous, traffic_difference, traffic_difference_abs.

Value/Type: string

direction

Sorting direction. Default: DESC. Supported values: ASC, DESC. ASC: ascending, smallest value first. DESC: descending, largest value first. Example: DESC

Value/Type: string

limit

Maximum number of page changes to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of page changes to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

Response Parameters

url

Ranking page URL.

Value/Type: string

organic_positions

Current number of organic keyword positions.

Value/Type: integer

organic_traffic

Current estimated organic traffic.

Value/Type: integer

adwords_positions

Number of paid (AdWords) keyword positions.

Value/Type: integer

intent_breakdown

Breakdown of keyword metrics by position range (1–20), split by search intent.

intent_breakdown.top_20

Value/Type: object

Value/Type: object

positions

Current total number of positions (organic_positions + serp_features_positions). Note: paid (AdWords) positions are not included.

Value/Type: integer

positions_previous

Previous total number of positions (organic_positions + serp_features_positions). Note: paid (AdWords) positions are not included.

Value/Type: integer

positions_difference

Net change in positions (comparison_month minus base_month). Negative values indicate a decrease.

Value/Type: integer

positions_difference_abs

Absolute value of the position change.

Value/Type: integer

serp_features_positions

Number of positions with SERP features.

Value/Type: integer

serp_features_traffic

Traffic from positions with SERP features.

Value/Type: integer

traffic

Current estimated traffic.

Value/Type: integer

traffic_previous

Previous estimated traffic.

Value/Type: integer

traffic_difference

Net change in traffic (comparison_month minus base_month). Negative values indicate a decrease.

Value/Type: integer

traffic_difference_abs

Absolute value of the traffic change.

Value/Type: integer

traffic_percent

Share of domain’s traffic attributed to this page as a percentage. Range: 0 to 100.

Value/Type: number

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/pages/changes/monthly?url=example.com&scope=ROOT_DOMAIN&base_month=2024-06&comparison_month=2024-07&country=US&device_type=DESKTOP&fields=url,organic_positions,organic_traffic&filter=traffic_percent > 1&order_by=traffic"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "url": "example.com",
      "effective_url": "https://example.com",
      "scope": "ROOT_DOMAIN",
      "limit": 100,
      "offset": 0,
      "filter": "traffic_percent > 1",
      "order_by": "traffic"
  },
  "data": [
      {
          "url": "https://example.com/blog/seo-tips",
          "organic_positions": 145,
          "organic_traffic": 2340,
          "adwords_positions": 0,
          "positions": 156,
          "positions_previous": 148,
          "positions_difference": 8,
          "positions_difference_abs": 8,
          "traffic": 2450,
          "traffic_previous": 2100,
          "traffic_difference": 350,
          "traffic_difference_abs": 350,
          "traffic_percent": 5.2,
          "serp_features_positions": 11,
          "serp_features_traffic": 110,
          "intent_breakdown": {
              "top_20": {
                  "commercial": {"positions": 3, "traffic": 450},
                  "informational": {"positions": 12, "traffic": 1800},
                  "navigational": {"positions": 2, "traffic": 150},
                  "transactional": {"positions": 2, "traffic": 50},
                  "unknown": {"positions": 1, "traffic": 0}
              }
          }
      },
      {
          "url": "https://example.com/products/widget-pro",
          "organic_positions": 89,
          "organic_traffic": 1850,
          "adwords_positions": 5,
          "positions": 95,
          "positions_previous": 92,
          "positions_difference": 3,
          "positions_difference_abs": 3,
          "traffic": 1950,
          "traffic_previous": 1750,
          "traffic_difference": 200,
          "traffic_difference_abs": 200,
          "traffic_percent": 4.1,
          "serp_features_positions": 6,
          "serp_features_traffic": 100,
          "intent_breakdown": {
              "top_20": {
                  "commercial": {"positions": 8, "traffic": 950},
                  "informational": {"positions": 5, "traffic": 600},
                  "navigational": {"positions": 1, "traffic": 200},
                  "transactional": {"positions": 2, "traffic": 200},
                  "unknown": {"positions": 0, "traffic": 0}
              }
          }
      }
  ]
}

Jump to Get Monthly Ranked Pages Changes TotalGet Monthly Ranked Pages Changes Total

Price: 10 API units per request

Returns the total number of monthly page-level ranking changes. base_month and comparison_month are months in YYYY-MM format, for example, 2026-07 and 2026-08; they need not be adjacent. base_month must be earlier than comparison_month and at most 24 months before the latest monthly snapshot of the selected database. Both months need a monthly snapshot; a month without one is rejected, never replaced by another month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/pages/changes/monthly/total

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: example.com

Value/Type: string

scopeRequired

Which part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

base_monthRequired

Earlier month of the comparison. Must be earlier than comparison_month. Format: ISO 8601 date (YYYY-MM). Example: 2024-01

Value/Type: string

comparison_monthRequired

Later month of the comparison, compared against base_month. Format: ISO 8601 date (YYYY-MM). Example: 2024-12

Value/Type: string

countryRequired

Country code in ISO 3166-1 Alpha-2 format (any letter case, for example, us). The United Kingdom is gb; uk is rejected. A country without a database for the selected device_type is rejected. Retrieve supported country and device type pairs from the Get Supported Countries endpoint. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database; not available for all countries. Example: DESKTOP

Value/Type: string

filter

Page changes filter. For syntax, refer to Advanced filtering. If omitted, no filter is applied. Available fields: url, organic_positions, organic_traffic, adwords_positions, intent_breakdown.top_20.commercial.positions, intent_breakdown.top_20.informational.positions, intent_breakdown.top_20.navigational.positions, intent_breakdown.top_20.transactional.positions, intent_breakdown.top_20.unknown.positions, intent_breakdown.top_20.commercial.traffic, intent_breakdown.top_20.informational.traffic, intent_breakdown.top_20.navigational.traffic, intent_breakdown.top_20.transactional.traffic, intent_breakdown.top_20.unknown.traffic, serp_features_positions, serp_features_traffic, positions, positions_previous, positions_difference, positions_difference_abs, traffic, traffic_percent, traffic_previous, traffic_difference, traffic_difference_abs. url is the full page URL matched as a whole by =, !=, or IN; all other fields are numeric using =, !=, >, >=, <, <=, or IN. positions_difference and traffic_difference are comparison minus baseline (negative = decrease); *_abs fields are absolute values. Use uppercase operators and AND/OR; enclose strings in double quotes; use parentheses when mixing AND and OR. Example: positions_difference > 10 AND traffic_percent > 1

Value/Type: string

Response Parameters

total

Total number of page-level ranking changes matching the request.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/pages/changes/monthly/total?url=example.com&scope=ROOT_DOMAIN&base_month=2024-01&comparison_month=2024-12&country=US&device_type=DESKTOP&filter=positions_difference%20>%2010"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "url": "example.com",
      "effective_url": "example.com",
      "scope": "ROOT_DOMAIN",
      "country": "US",
      "device_type": "DESKTOP",
      "filter": "positions_difference > 10"
  },
  "data": {
      "total": 342
  }
}

Jump to Get Monthly CompetitorsGet Monthly Competitors

Price: 40 API units per line

Returns a list of monthly competing domains based on shared organic keywords.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/competitors/monthly

Query parameters

domainRequired

Root domain to query. The length must not exceed 2,000 characters. The report is domain-scoped: a URL or subdomain is reduced to its registered domain. Example: samplesite.com

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case. The United Kingdom is gb; uk is rejected. A country must have a database available for the selected device_type. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

fields

Field names from the response to include. If omitted, all fields are returned. A money field (traffic_cost or a *_traffic_cost) selects the whole pair (value and currency), not a bare number. Supported values: domain, competition_density, common_keywords, organic_positions, organic_traffic, organic_traffic_cost, adwords_positions, serp_features_positions, serp_features_traffic, serp_features_traffic_cost, positions, traffic, traffic_cost.

Value/Type: string[]

limit

Maximum number of competitors to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of competitors to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

order_by

Field name to sort by. Default: common_keywords. Money fields sort by their numeric value. Supported values: domain, competition_density, common_keywords, organic_positions, organic_traffic, organic_traffic_cost, adwords_positions, serp_features_positions, serp_features_traffic, serp_features_traffic_cost, positions, traffic, traffic_cost. Example: common_keywords

Value/Type: string

direction

Sorting direction. Default: DESC. Supported values: ASC, DESC. ASC: ascending, smallest value first. DESC: descending, largest value first. Example: DESC

Value/Type: string

Response Parameters

domain

Competitor domain name.

Value/Type: string

common_keywords

Number of common keywords with the target.

Value/Type: integer

competition_density

Keyword competition density score. Supported range: 0 to 100, with 100 being the most competitive.

Value/Type: number

organic_positions

Number of organic positions.

Value/Type: integer

organic_traffic

Estimated organic traffic.

Value/Type: integer

organic_traffic_cost

Value/Type: object

adwords_positions

Number of paid (Adwords) positions.

Value/Type: integer

serp_features_positions

Number of positions with SERP features.

Value/Type: integer

serp_features_traffic

Estimated traffic from SERP features.

Value/Type: integer

serp_features_traffic_cost

Value/Type: object

positions

Total number of positions.

Value/Type: integer

traffic

Total estimated traffic.

Value/Type: integer

traffic_cost

Value/Type: object

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/competitors/monthly?domain=samplesite.com&country=US&device_type=DESKTOP&month=2024-12&fields=domain,common_keywords,competition_density,organic_traffic&limit=10"
Response example
JSON
{
  "data": [
      {
          "domain": "competitor1.com",
          "common_keywords": 2847,
          "competition_density": 68.5,
          "organic_positions": 12543,
          "organic_traffic": 185000,
          "organic_traffic_cost": {
              "value": 42500.75,
              "currency": "USD"
          },
          "adwords_positions": 156,
          "serp_features_positions": 234,
          "serp_features_traffic": 28500,
          "serp_features_traffic_cost": {
              "value": 5200.50,
              "currency": "USD"
          },
          "positions": 12899,
          "traffic": 213500,
          "traffic_cost": {
              "value": 47700.25,
              "currency": "USD"
          }
      },
      {
          "domain": "competitor2.com",
          "common_keywords": 2156,
          "competition_density": 64.2,
          "organic_positions": 9876,
          "organic_traffic": 142000,
          "organic_traffic_cost": {
              "value": 31800.00,
              "currency": "USD"
          },
          "adwords_positions": 201,
          "serp_features_positions": 189,
          "serp_features_traffic": 21300,
          "serp_features_traffic_cost": {
              "value": 3900.75,
              "currency": "USD"
          },
          "positions": 10277,
          "traffic": 163300,
          "traffic_cost": {
              "value": 35700.75,
              "currency": "USD"
          }
      },
      {
          "domain": "competitor3.com",
          "common_keywords": 1843,
          "competition_density": 71.8,
          "organic_positions": 11234,
          "organic_traffic": 167500,
          "organic_traffic_cost": {
              "value": 38900.25,
              "currency": "USD"
          },
          "adwords_positions": 128,
          "serp_features_positions": 267,
          "serp_features_traffic": 31200,
          "serp_features_traffic_cost": {
              "value": 5850.00,
              "currency": "USD"
          },
          "positions": 11629,
          "traffic": 198700,
          "traffic_cost": {
              "value": 44750.25,
              "currency": "USD"
          }
      }
  ],
  "meta": {
      "country": "US",
      "device_type": "DESKTOP",
      "domain": "samplesite.com",
      "effective_url": "https://samplesite.com",
      "limit": 10,
      "month": "2024-12",
      "offset": 0,
      "order_by": "common_keywords",
      "direction": "DESC",
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true
  }
}

Jump to Get Monthly Competitors TotalGet Monthly Competitors Total

Price: 10 API units per request

Returns the total number of monthly competing domains based on shared organic keywords.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/competitors/monthly/total

Query parameters

domainRequired

Root domain to query, for example, semrush.com. Required. At most 2,000 characters. The report is domain-scoped: a URL or a subdomain is reduced to its registered domain. Example: samplesite.com

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. A month without a monthly snapshot is rejected. Example: 2024-12

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case, for example, us. The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE.

Value/Type: string

Response Parameters

total

Total number of matching competitors.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/competitors/monthly/total?domain=samplesite.com&country=US&device_type=DESKTOP&month=2024-12"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "domain": "samplesite.com",
      "effective_url": "https://samplesite.com",
      "month": "2024-12"
  },
  "data": {
      "total": 127
  }
}

Jump to Get Monthly SubdomainsGet Monthly Subdomains

Price: 10 API units per line

Returns a list of monthly subdomains.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/subdomains/monthly

Query parameters

domainRequired

Root domain to query (for example, semrush.com). The report is domain-scoped: URLs and subdomains are normalized to their registered domain. Maximum 2,000 characters. Example: samplesite.com

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM, for example, 2024-12). If omitted, the latest monthly snapshot for the selected country and device_type is returned. A month with no available snapshot is rejected; the endpoint never falls back to a different month.

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format (for example, us, any letter case). The United Kingdom is gb; uk is rejected. A country without a database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get available country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

fields

Field names from the response entity to include in the response. All if nothing is specified. The names are fields of the response items, described in the response schema. Supported values: subdomain, organic_positions, organic_traffic, organic_traffic_percent, serp_features_positions, serp_features_traffic, serp_features_traffic_percent, positions, traffic, traffic_percent.

Value/Type: string[]

limit

Maximum number of subdomains to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of subdomains to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

order_by

Field name to sort by. Default: traffic. Supported values: subdomain, organic_positions, organic_traffic, organic_traffic_percent, serp_features_positions, serp_features_traffic, serp_features_traffic_percent, positions, traffic, traffic_percent.

Value/Type: string

direction

Sorting direction. Default: DESC. Supported values: ASC, DESC. ASC: ascending, smallest value first. DESC: descending, largest value first. Example: DESC

Value/Type: string

Response Parameters

subdomain

Subdomain name.

Value/Type: string

organic_positions

Number of organic positions on the SERP.

Value/Type: integer

organic_traffic

Estimated organic traffic.

Value/Type: integer

organic_traffic_percent

Share of organic traffic as a percentage (0–100).

Value/Type: number

serp_features_positions

Number of SERP feature positions on the SERP.

Value/Type: integer

serp_features_traffic

Estimated traffic from SERP features.

Value/Type: integer

serp_features_traffic_percent

Share of SERP feature traffic as a percentage (0–100).

Value/Type: number

positions

Total number of keyword positions.

Value/Type: integer

traffic

Total estimated traffic.

Value/Type: integer

traffic_percent

Share of total traffic as a percentage (0–100).

Value/Type: number

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/subdomains/monthly?domain=samplesite.com&country=US&device_type=DESKTOP&month=2024-12&fields=subdomain,organic_positions,organic_traffic&limit=10"
Response example
JSON
{
  "data": [
      {
          "subdomain": "blog.samplesite.com",
          "organic_positions": 2847,
          "organic_traffic": 15420,
          "organic_traffic_percent": 42.5,
          "serp_features_positions": 312,
          "serp_features_traffic": 3210,
          "serp_features_traffic_percent": 8.9,
          "positions": 3159,
          "traffic": 18630,
          "traffic_percent": 51.4
      },
      {
          "subdomain": "help.samplesite.com",
          "organic_positions": 1654,
          "organic_traffic": 8920,
          "organic_traffic_percent": 24.6,
          "serp_features_positions": 201,
          "serp_features_traffic": 1850,
          "serp_features_traffic_percent": 5.1,
          "positions": 1855,
          "traffic": 10770,
          "traffic_percent": 29.7
      },
      {
          "subdomain": "api.samplesite.com",
          "organic_positions": 893,
          "organic_traffic": 5230,
          "organic_traffic_percent": 14.4,
          "serp_features_positions": 89,
          "serp_features_traffic": 620,
          "serp_features_traffic_percent": 1.7,
          "positions": 982,
          "traffic": 5850,
          "traffic_percent": 16.1
      }
  ],
  "meta": {
      "country": "US",
      "device_type": "DESKTOP",
      "domain": "samplesite.com",
      "effective_url": "https://samplesite.com",
      "limit": 10,
      "month": "2024-12",
      "offset": 0,
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true
  }
}

Jump to Get Monthly Subdomains TotalGet Monthly Subdomains Total

Price: 10 API units per request

Returns the total number of monthly subdomains with ranking keywords.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/subdomains/monthly/total

Query parameters

domainRequired

Root domain to query. At most 2,000 characters. URLs and subdomains are reduced to their registered domain. Example: example.com

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM), for example, 2024-08. If omitted, the latest monthly snapshot for the selected country and device_type is returned. Invalid months are rejected. Example: 2024-12

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, for example, us or US. The United Kingdom is gb; uk is rejected. Check the Get Supported Countries endpoint for supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Search database device type. Supported values: DESKTOP, MOBILE.

Value/Type: string

Response Parameters

total

Total number of subdomains with ranking keywords.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/subdomains/monthly/total?domain=example.com&country=US&device_type=DESKTOP&month=2024-12"
Response example
JSON
{
  "meta": {
      "country": "US",
      "device_type": "DESKTOP",
      "domain": "example.com",
      "effective_url": "https://example.com",
      "month": "2024-12",
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true
  },
  "data": {
      "total": 148
  }
}

Jump to Get Monthly Positions TrendGet Monthly Positions Trend

Price: 10 API units per line

Returns the monthly trend of the target’s organic rankings: counts by SERP position bucket, rankings inside SERP features, and the traffic and traffic-cost estimates behind them. date_from and date_to are months in YYYY-MM format, for example, 2026-03 and 2026-08 when 2026-08 is the latest monthly snapshot. date_from must be earlier than date_to (equal months are rejected) and at most 12 months before the latest monthly snapshot of the selected database. Both months need a monthly snapshot; a month without one is rejected, never replaced by another month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/rankings/trend/monthly

Query parameters

urlRequired

Target URL to query. Maximum 2,000 characters. Accepts URLs with or without the protocol (https://). Example: example.com

Value/Type: string

scopeRequired

Part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

date_fromRequired

Start date of the range. Format: ISO 8601 YYYY-MM. Example: 2024-01

Value/Type: string

date_toRequired

End date of the range. Format: ISO 8601 YYYY-MM. Example: 2024-12

Value/Type: string

countryRequired

Country code in ISO 3166-1 Alpha-2 format (case-insensitive). For example, US for the United States, GB for the United Kingdom. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: desktop search database. MOBILE: mobile search database; not available for all countries. Example: DESKTOP

Value/Type: string

filter

Filter string. For syntax, refer to Advanced filtering. Available fields: month, organic_positions, organic_positions_branded, organic_positions_1_3, organic_positions_4_10, organic_positions_11_20, organic_positions_21_30, organic_positions_31_40, organic_positions_41_50, organic_positions_51_60, organic_positions_61_70, organic_positions_71_80, organic_positions_81_90, organic_positions_91_inf, organic_traffic, organic_traffic_cost, serp_features_positions, serp_features_traffic, serp_features_traffic_cost, positions, traffic, traffic_cost, keyword_serp_features, position_serp_features. Money fields are filtered by numeric value alone (for example, traffic_cost &gt; 100). Example: organic_traffic &gt; 1000

Value/Type: string

fields

Metric names to include in the response. If omitted, all metrics are returned. Supported values: month, organic_positions, organic_positions_branded, organic_positions_1_3, organic_positions_4_10, organic_positions_11_20, organic_positions_21_30, organic_positions_31_40, organic_positions_41_50, organic_positions_51_60, organic_positions_61_70, organic_positions_71_80, organic_positions_81_90, organic_positions_91_inf, organic_traffic, organic_traffic_cost, serp_features_positions, serp_features_traffic, serp_features_traffic_cost, positions, traffic, traffic_cost, keyword_serp_features, position_serp_features.

Value/Type: string[]

Response Parameters

month

Month in ISO 8601 format (YYYY-MM).

Value/Type: string

organic_positions

Number of the target’s organic rankings across all SERP positions.

Value/Type: integer

organic_positions_branded

Number of organic rankings for branded keywords.

Value/Type: integer

organic_positions_1_3

Number of organic rankings at SERP positions 1 to 3.

Value/Type: integer

organic_positions_4_10

Number of organic rankings at SERP positions 4 to 10.

Value/Type: integer

organic_positions_11_20

Number of organic rankings at SERP positions 11 to 20.

Value/Type: integer

organic_positions_21_30

Number of organic rankings at SERP positions 21 to 30.

Value/Type: integer

organic_positions_31_40

Number of organic rankings at SERP positions 31 to 40.

Value/Type: integer

organic_positions_41_50

Number of organic rankings at SERP positions 41 to 50.

Value/Type: integer

organic_positions_51_60

Number of organic rankings at SERP positions 51 to 60.

Value/Type: integer

organic_positions_61_70

Number of organic rankings at SERP positions 61 to 70.

Value/Type: integer

organic_positions_71_80

Number of organic rankings at SERP positions 71 to 80.

Value/Type: integer

organic_positions_81_90

Number of organic rankings at SERP positions 81 to 90.

Value/Type: integer

organic_positions_91_inf

Number of organic rankings at SERP position 91 and below.

Value/Type: integer

organic_traffic

Estimated organic search traffic.

Value/Type: integer

organic_traffic_cost

Estimated cost of organic traffic in USD.

Value/Type: object

serp_features_positions

Number of rankings inside SERP features.

Value/Type: integer

serp_features_traffic

Estimated traffic from positions with SERP features.

Value/Type: integer

serp_features_traffic_cost

Estimated traffic cost from SERP feature positions in USD.

Value/Type: object

positions

Total number of rankings: organic_positions + serp_features_positions (paid positions are never included).

Value/Type: integer

traffic

Total estimated traffic.

Value/Type: integer

traffic_cost

Total estimated traffic cost in USD.

Value/Type: object

keyword_serp_features

Breakdown of SERP features at the keyword level.

Value/Type: array

position_serp_features

Breakdown of SERP features at the position level.

Value/Type: array

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/organic-search/rankings/trend/monthly?url=example.com&scope=ROOT_DOMAIN&date_from=2024-01&date_to=2024-03&country=US&device_type=DESKTOP&fields=month,organic_positions,organic_traffic,traffic_cost,serp_features_positions"
Response example
JSON
{
  "meta": {
      "country": "US",
      "date_from": "2024-01",
      "date_to": "2024-03",
      "device_type": "DESKTOP",
      "effective_url": "https://example.com",
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "scope": "ROOT_DOMAIN",
      "status_code": 200,
      "success": true,
      "url": "example.com"
  },
  "data": [
      {
          "month": "2024-01",
          "organic_positions": 8234,
          "organic_traffic": 25680,
          "traffic_cost": {
              "value": 1245.50,
              "currency": "USD"
          },
          "serp_features_positions": 127
      },
      {
          "month": "2024-02",
          "organic_positions": 8567,
          "organic_traffic": 27150,
          "traffic_cost": {
              "value": 1389.75,
              "currency": "USD"
          },
          "serp_features_positions": 142
      },
      {
          "month": "2024-03",
          "organic_positions": 8945,
          "organic_traffic": 29420,
          "traffic_cost": {
              "value": 1534.25,
              "currency": "USD"
          },
          "serp_features_positions": 156
      }
  ]
}

Jump to Get Monthly Serp ResultsGet Monthly Serp Results

Price: 10 API units per line

Returns the given keyword’s monthly SERP: one entry per SERP position, giving the domain and URL that rank there, that position’s estimated traffic, and any SERP features attached to it. Entries are ordered by position, ascending.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/keywords/organic-search/serp-results/monthly

Query parameters

keywordRequired

Keyword to retrieve SERP results for. Required.

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case (for example, us). The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

position_type

Types of positions to return. All if nothing is specified. Supported values: ORGANIC, SERP_FEATURE.

Value/Type: string

filter

SERP result filter string. For syntax, refer to Advanced filtering. Money fields are filtered by their numeric value alone, never by currency: traffic_cost &gt; 50.00. Available fields: position, domain, url, traffic, traffic_cost, keyword_serp_features, position_serp_features, serp_feature. SERP-feature fields (keyword_serp_features, position_serp_features, serp_feature) take feature names as quoted strings. Examples: domain = "example.com" AND position &gt; 1; keyword_serp_features HAS_ANY ("REVIEWS", "AI_OVERVIEW"). Example: traffic &gt; 100

Value/Type: string

fields

Field names from the response entity to include in the response. All if nothing is specified. Supported values: position, domain, url, traffic, traffic_cost, keyword_serp_features, position_serp_features, serp_feature.

Value/Type: string[]

limit

Maximum number of SERP results to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of SERP results to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

Response Parameters

position

Organic position in the SERP.

Value/Type: integer

domain

Domain that holds this position.

Value/Type: string

url

URL ranking for the keyword.

Value/Type: string

traffic

Estimated monthly traffic driven to the URL by the keyword.

Value/Type: integer

traffic_cost

Estimated monthly cost of the traffic, in USD. Always USD regardless of the requested country. Contains currency (ISO 4217 code, always “USD”) and value (the amount in decimal format).

Value/Type: object

keyword_serp_features

All SERP features present on this keyword’s SERP. Describes the SERP as a whole, so every entry in the response carries the same value. Examples: INSTANT_ANSWER, KNOWLEDGE_PANEL, REVIEWS, AI_OVERVIEW.

Value/Type: string[]

position_serp_features

SERP features attached to this particular position, such as review snippets or sitelinks rendered alongside this ranking result. Examples: REVIEWS, SITELINKS.

Value/Type: string[]

serp_feature

Set only when this position is itself a SERP feature block rather than a regular organic result, in which case it identifies which feature. Absent for regular organic results. Example: FEATURED_SNIPPET.

Value/Type: string

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/keywords/organic-search/serp-results/monthly?keyword=python+tutorial&country=US&device_type=DESKTOP&month=2024-12&position_type=ORGANIC&filter=traffic%20%3E%20100"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "keyword": "python tutorial",
      "month": "2024-12",
      "position_type": "ORGANIC",
      "limit": 10,
      "offset": 0
  },
  "data": [
      {
          "position": 1,
          "domain": "python.org",
          "url": "https://docs.python.org/3/tutorial/",
          "traffic": 15420,
          "traffic_cost": {
              "currency": "USD",
              "value": 125.50
          },
          "keyword_serp_features": ["FEATURED_SNIPPET"],
          "position_serp_features": []
      },
      {
          "position": 2,
          "domain": "w3schools.com",
          "url": "https://www.w3schools.com/python/",
          "traffic": 8930,
          "traffic_cost": {
              "currency": "USD",
              "value": 72.30
          },
          "keyword_serp_features": ["FEATURED_SNIPPET"],
          "position_serp_features": ["SITELINKS"]
      },
      {
          "position": 3,
          "domain": "real-python.com",
          "url": "https://realpython.com/learning-paths/python-basics/",
          "traffic": 6250,
          "traffic_cost": {
              "currency": "USD",
              "value": 51.80
          },
          "keyword_serp_features": ["FEATURED_SNIPPET"],
          "position_serp_features": []
      }
  ]
}

Jump to Get Monthly Gap KeywordsGet Monthly Gap Keywords

Price: 20 API units per line

Returns an array of keywords of the given intersection type (COMMON, MISSING, and so on) for the compared targets, with the metrics of each keyword and the ranking of every target for it. The result set is paginated with limit and offset.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/keywords/gap/monthly

Query parameters

channelRequired

Channel whose rankings are compared. Required. The channel is defined once and applies to the target and to the competitor alike. Supported values: ORGANIC, ADWORDS, PLA.

Value/Type: string

target_urlRequired

URL of the target to query: the site the report is built around. Required. The length of a target URL must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://samplesite.com

Value/Type: string

target_scopeRequired

Scope of the target, which determines which part of target_url will be taken into account. Required. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE.

Value/Type: string

competitor_urlRequired

URL of the competitor to compare the target against. Required. The length of a target URL must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://samplesite.com

Value/Type: string

competitor_scopeRequired

Scope of the competitor, which determines which part of competitor_url will be taken into account. Required. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE.

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is used. The same month applies to every target. Example: 2024-12

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case, for example, us. The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

intersection_type

Type of keyword intersection to return. Default: ALL. Applies on top of channel: the intersection is computed over the rankings that channel selects. Supported values: ALL, COMMON, MISSING, STRONG, UNIQUE, WEAK.

Value/Type: string

filter

Gap keywords filter string. For syntax, refer to Advanced filtering. A money field is filtered by its numeric value alone, never by the pair: cpc &gt; 2.50, and the currency is never part of a filter. Available fields: keyword, competition_density, cpc, keyword_difficulty, results, volume, target.position, target.url, competitor.position, competitor.url, intents, is_keyword_branded. The ranking of a single side is addressed with dot notation: target.* is the ranking of target_url, and competitor.* is the ranking of competitor_url. A keyword whose requested side has no ranking never passes a condition on that side, so target.position &gt; 10 also drops every MISSING keyword. A filter takes at most 4 conditions on target.*, at most 4 on competitor.*, and at most 38 on keyword-level fields. A condition is one comparison, such as target.position &gt; 10 or target.url CONTAINS "blog"; AND and NOT do not count. A filter exceeding these limits is refused with FILTER_TOO_COMPLEX. Example: volume &gt; 1000 AND keyword CONTAINS "buy"

Value/Type: string

fields

Field names from the response entity to include in the response. All if nothing is specified. target and competitor select the whole ranking object (position and URL); dot notation narrows the selection down to a single nested field, for example target.position. Supported values: keyword, competition_density, cpc, keyword_difficulty, results, volume, target, target.position, target.url, competitor, competitor.position, competitor.url, intents, is_keyword_branded.

Value/Type: string[]

limit

Maximum number of keywords to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of keywords to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

order_by

Field name to sort by. target.* refers to the ranking of target_url, and competitor.* refers to the ranking of competitor_url, so target.position sorts by the position of the target itself. Supported values: keyword, competition_density, cpc, keyword_difficulty, results, volume, target.position, target.url, competitor.position, competitor.url.

Value/Type: string

direction

Sorting direction (ascending or descending). Default: DESC. Supported values: ASC, DESC. Example: DESC

Value/Type: string

Response Parameters

keyword

Keyword text.

Value/Type: string

volume

Number of monthly searches for the keyword in the requested database (country and device type).

Value/Type: integer

competition_density

Competition density of the keyword in paid search. Supported range: 0 to 100. Higher values mean more advertisers compete for the keyword.

Value/Type: number

cpc

Value/Type: object

keyword_difficulty

Keyword difficulty score (0–100) estimating how hard it is to rank organically for the keyword. Higher values mean it is harder to rank.

Value/Type: integer

results

Approximate number of search results the search engine reports for the keyword.

Value/Type: integer

target

Ranking of the target (target_url from the request) for the keyword. Not returned when the target doesn’t rank for the keyword (case for every MISSING keyword and some ALL keywords).

Value/Type: object

competitor

Ranking of the competitor (competitor_url from the request) for the keyword. Not returned when the competitor doesn’t rank for the keyword (case for every UNIQUE keyword and some ALL keywords).

Value/Type: object

intents

Search intents associated with the keyword. Possible values: COMMERCIAL, INFORMATIONAL, NAVIGATIONAL, TRANSACTIONAL.

Value/Type: string[]

is_keyword_branded

Whether the keyword includes a brand name.

Value/Type: boolean

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/keywords/gap/monthly?channel=ORGANIC&target_url=https://example.com&target_scope=ROOT_DOMAIN&competitor_url=https://competitor.com&competitor_scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&intersection_type=ALL&filter=volume%20%3E%201000&fields=keyword,volume,keyword_difficulty,target,competitor&limit=10"
Response example
JSON
{
  "data": [
      {
          "keyword": "project management tools",
          "volume": 2850,
          "competition_density": 65,
          "cpc": {
              "value": 3.25,
              "currency": "USD"
          },
          "keyword_difficulty": 42,
          "results": 1240000000,
          "target": {
              "position": 5,
              "url": "https://example.com/project-management"
          },
          "competitor": {
              "position": 3,
              "url": "https://competitor.com/tools/project-management"
          },
          "intents": ["COMMERCIAL", "INFORMATIONAL"],
          "is_keyword_branded": false
      },
      {
          "keyword": "team collaboration software",
          "volume": 1920,
          "competition_density": 58,
          "cpc": {
              "value": 2.85,
              "currency": "USD"
          },
          "keyword_difficulty": 38,
          "results": 890000000,
          "target": {
              "position": 8,
              "url": "https://example.com/collaboration"
          },
          "competitor": {
              "position": 2,
              "url": "https://competitor.com/solutions/collaboration"
          },
          "intents": ["COMMERCIAL"],
          "is_keyword_branded": false
      },
      {
          "keyword": "workflow automation platform",
          "volume": 1450,
          "competition_density": 71,
          "cpc": {
              "value": 4.10,
              "currency": "USD"
          },
          "keyword_difficulty": 51,
          "results": 520000000,
          "intents": ["COMMERCIAL", "INFORMATIONAL", "TRANSACTIONAL"],
          "is_keyword_branded": false
      }
  ],
  "meta": {
      "channel": "ORGANIC",
      "competitor_scope": "ROOT_DOMAIN",
      "competitor_url": "https://competitor.com",
      "country": "US",
      "device_type": "DESKTOP",
      "filter": "volume &gt; 1000",
      "intersection_type": "ALL",
      "limit": 10,
      "month": "2024-12",
      "offset": 0,
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "target_scope": "ROOT_DOMAIN",
      "target_url": "https://example.com"
  }
}

Jump to Get Monthly Gap Keywords CountsGet Monthly Gap Keywords Counts

Price: 20 API units per line

Returns counters for each intersection type for each target (for example, how many keywords are shared or missing for each target domain). The counters are returned in the order the targets were passed in the request.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/keywords/gap/monthly/counts

Query parameters

channelRequired

Channel whose rankings are compared. Required. The channel is defined once and applies to the target and to the competitor alike. Supported values: ORGANIC, ADWORDS, PLA.

Value/Type: string

target_urlRequired

URL of the target to query: the site the report is built around. Required. The length of a target URL must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://samplesite.com

Value/Type: string

target_scopeRequired

Scope of the target, which determines which part of target_url will be taken into account. Required. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE.

Value/Type: string

competitor_urlRequired

URL of the competitor to compare the target against. Required. The length of a target URL must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://samplesite.com

Value/Type: string

competitor_scopeRequired

Scope of the competitor, which determines which part of competitor_url will be taken into account. Required. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE.

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case, for example, us. The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

filter

Gap keywords filter string. For syntax, refer to Advanced filtering. A money field is filtered by its numeric value alone, never by the pair: cpc &gt; 2.50, and the currency is never part of a filter. Available fields: keyword, competition_density, cpc, keyword_difficulty, results, volume, target.position, target.url, competitor.position, competitor.url, intents, is_keyword_branded. The ranking of a single side is addressed with dot notation: target.* refers to the ranking of target_url, competitor.* refers to the ranking of competitor_url. A keyword whose requested side has no ranking never passes a condition on that side, so target.position &gt; 10 also drops every MISSING keyword. A filter takes at most 4 conditions on target.*, at most 4 on competitor.* and at most 38 on keyword-level fields. A condition is one comparison, such as target.position &gt; 10 or target.url CONTAINS "blog"; AND and NOT do not count. A filter over a limit is refused with FILTER_TOO_COMPLEX. Example: volume &gt; 1000 AND keyword CONTAINS "buy"

Value/Type: string

Response Parameters

all

Number of keywords at least one of the compared sites ranks for (common + unique + missing). The same value for both target and competitor.

Value/Type: integer

common

Number of keywords both compared sites rank for.

Value/Type: integer

unique

Number of keywords only this site ranks for.

Value/Type: integer

missing

Number of keywords the other site ranks for but this one doesn’t.

Value/Type: integer

strong

Number of keywords this site ranks higher for than the other one.

Value/Type: integer

weak

Number of keywords this site ranks lower for than the other one.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/keywords/gap/monthly/counts?channel=ORGANIC&target_url=example.com&target_scope=ROOT_DOMAIN&competitor_url=competitor.com&competitor_scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&filter=volume%20%3E%201000"
Response example
JSON
{
  "data": [
      {
          "all": 45230,
          "common": 32150,
          "unique": 8940,
          "missing": 4140,
          "strong": 15680,
          "weak": 16470
      },
      {
          "all": 45230,
          "common": 32150,
          "unique": 4140,
          "missing": 8940,
          "strong": 16470,
          "weak": 15680
      }
  ],
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "channel": "ORGANIC",
      "target_url": "example.com",
      "target_scope": "ROOT_DOMAIN",
      "competitor_url": "competitor.com",
      "competitor_scope": "ROOT_DOMAIN",
      "country": "US",
      "device_type": "DESKTOP",
      "month": "2024-12",
      "filter": "volume &gt; 1000"
  }
}

Jump to Get Monthly Gap OverlapsGet Monthly Gap Overlaps

Price: 20 API units per line

Returns common keywords count for every combination of targets: the data an intersection diagram of the compared targets is built from.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/keywords/gap/overlaps/monthly

Query parameters

channelRequired

Channel whose rankings are compared. Required. The channel is defined once and applies to the target and to the competitor alike. Supported values: ORGANIC, ADWORDS, PLA.

Value/Type: string

target_urlRequired

URL of the target to query: the site the report is built around. Required. The length of a target URL must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://samplesite.com

Value/Type: string

target_scopeRequired

Scope of the target, which determines which part of target_url will be taken into account. Required. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE.

Value/Type: string

competitor_urlRequired

URL of the competitor to compare the target against. Required. The length of a target URL must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://samplesite.com

Value/Type: string

competitor_scopeRequired

Scope of the competitor, which determines which part of competitor_url will be taken into account. Required. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE.

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is used.

Value/Type: string

countryRequired

Country code in ISO 3166-1 Alpha-2 format (case-insensitive). For example, US for the United States, GB for the United Kingdom. A country that has no database for the selected device_type is rejected. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: desktop search database. MOBILE: mobile search database; not available for all countries.

Value/Type: string

filter

Gap keywords filter string. For syntax, refer to Advanced filtering. A money field is filtered by its numeric value alone, never by the pair: cpc &gt; 2.50, and the currency is never part of a filter. Available fields: keyword, competition_density, cpc, keyword_difficulty, results, volume, target.position, target.url, competitor.position, competitor.url, intents, is_keyword_branded. The ranking of a single side is addressed with dot notation: target.* is the ranking of target_url, and competitor.* is the ranking of competitor_url. A keyword whose requested side has no ranking never passes a condition on that side, so target.position &gt; 10 also drops every MISSING keyword. A filter takes at most 4 conditions on target.*, at most 4 on competitor.*, and at most 38 on keyword-level fields. A condition is one comparison, such as target.position &gt; 10 or target.url CONTAINS "blog"; AND and NOT do not count. A filter over a limit is refused with FILTER_TOO_COMPLEX. Example: volume &gt; 1000 AND keyword CONTAINS "buy"

Value/Type: string

Response Parameters

common_keywords

Number of keywords that every target listed in target_indexes ranks for.

Value/Type: integer

target_indexes

List of target indexes (positions in the request: target_url first, then competitor_url) that share common keywords.

Value/Type: integer[]

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/keywords/gap/overlaps/monthly?channel=ORGANIC&target_url=example.com&target_scope=ROOT_DOMAIN&competitor_url=competitor.com&competitor_scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&filter=volume > 1000"
Response example
JSON
{
  "meta": {
      "channel": "ORGANIC",
      "competitor_scope": "ROOT_DOMAIN",
      "competitor_url": "competitor.com",
      "country": "US",
      "device_type": "DESKTOP",
      "filter": "volume > 1000",
      "month": "2024-12",
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "target_scope": "ROOT_DOMAIN",
      "target_url": "example.com"
  },
  "data": [
      {
          "target_indexes": [0, 1],
          "common_keywords": 245
      },
      {
          "target_indexes": [0],
          "common_keywords": 128
      },
      {
          "target_indexes": [1],
          "common_keywords": 87
      }
  ]
}

Jump to Get Monthly Paid Search AdvertisementsGet Monthly Paid Search Advertisements

Price: 20 API units per line

Returns the advertisements the target ran in paid search in the requested month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/advertisements/monthly

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://example.com

Value/Type: string

scopeRequired

Determines which part of the URL will be analyzed. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is used. Example: 2024-12

Value/Type: string

countryRequired

Country database code in ISO 3166-1 Alpha-2 format, in any letter case (for example, us). The United Kingdom is gb; uk is rejected. A country lacking a database for the selected device_type is rejected. Check the Get Supported Countries endpoint to get available country and device type combinations. Example: US

Value/Type: string

device_typeRequired

Search database device type. DESKTOP uses the country’s desktop search database; MOBILE uses the mobile search database (not available in every country). Supported values: DESKTOP, MOBILE. Example: DESKTOP

Value/Type: string

filter

Filter expression. For syntax, refer to Advanced filtering. Available fields: url, url_visible, title, description, ad_id, keyword, positions, crawled_time. ad_id is a string: quote it exactly as returned in the response, and use only the =, !=, and IN operators with it. Example: url = "example.com" AND positions > 100

Value/Type: string

fields

Field names from the response entity to include in the response. All if nothing is specified. Supported values: url, url_visible, title, description, ad_id, keyword, positions, crawled_time.

Value/Type: string[]

limit

Maximum number of copies to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of copies to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

direction

Sorting direction. Applies only to the positions column. Default: DESC. Supported values: ASC, DESC. Example: DESC

Value/Type: string

Response Parameters

url

Final URL of the ad. Example: https://example.com/products

Value/Type: string

url_visible

Display (visible) URL shown in the ad. Example: example.com/products

Value/Type: string

title

Title of the ad. Example: Premium Products | Best Deals

Value/Type: string

description

Description text of the ad. Example: Shop our exclusive collection with free shipping on orders over $50.

Value/Type: string

ad_id

Unique ad identifier. Example: 123456789

Value/Type: string

keyword

Keyword that triggered the ad. Example: premium products

Value/Type: string

positions

Number of keyword positions this ad appeared in. Example: 5

Value/Type: integer

crawled_time

Timestamp of the most recent crawl in which the ad was seen, in ISO 8601 format (YYYY-MM-DDThh:mm:ssZ). May predate the requested month. Example: 2024-12-15T10:30:00Z

Value/Type: string

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/advertisements/monthly?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&filter=positions%20%3E%205&fields=url,url_visible,title"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "effective_url": "https://example.com",
      "filter": "positions > 5",
      "limit": 100,
      "month": "2024-12",
      "offset": 0,
      "scope": "ROOT_DOMAIN",
      "url": "https://example.com"
  },
  "data": [
      {
          "url": "https://example.com/products",
          "url_visible": "example.com/products",
          "title": "Premium Products | Best Deals",
          "description": "Shop our exclusive collection with free shipping on orders over $50.",
          "ad_id": "123456789",
          "keyword": "premium products",
          "positions": 8,
          "crawled_time": "2024-12-15T10:30:00Z"
      },
      {
          "url": "https://example.com/sale",
          "url_visible": "example.com/sale",
          "title": "Year-End Sale - Up to 70% Off",
          "description": "Limited time offer on selected items. Free delivery worldwide.",
          "ad_id": "987654321",
          "keyword": "sale products",
          "positions": 6,
          "crawled_time": "2024-12-16T14:22:00Z"
      }
  ]
}

Jump to Get Monthly Paid Search Advertisements TotalGet Monthly Paid Search Advertisements Total

Price: 10 API units per request

Returns the total number of distinct paid search advertisements for the target domain in the requested month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/advertisements/monthly/total

Query parameters

urlRequired

Target domain or URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: example.com

Value/Type: string

scopeRequired

Which part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is used. Example: 2024-12

Value/Type: string

countryRequired

Country code in ISO 3166-1 Alpha-2 format, case-insensitive (for example, us or US). The United Kingdom is gb; uk is not accepted. Supported country and device type combinations vary. Check the Get Supported Countries endpoint for valid pairs. Example: US

Value/Type: string

device_typeRequired

Search database type. Supported values: DESKTOP, MOBILE. DESKTOP for desktop searches, or MOBILE for mobile searches. Not all countries have data for both device types.

Value/Type: string

filter

Filter expression. For syntax, refer to Advanced filtering. Available fields: url, url_visible, title, description, ad_id, keyword, positions, crawled_time. ad_id is a string: quote it exactly as returned in the response, and use only the =, !=, and IN operators with it. Example: positions > 100

Value/Type: string

Response Parameters

total

Total number of distinct paid search advertisements found.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/advertisements/monthly/total?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&filter=positions > 100"
Response example
JSON
{
  "data": {
      "total": 342
  },
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "effective_url": "example.com",
      "url": "example.com",
      "scope": "ROOT_DOMAIN",
      "month": "2024-12",
      "filter": "positions > 100"
  }
}

Jump to Get Monthly Paid Search KeywordsGet Monthly Paid Search Keywords

Price: 20 API units per line

Returns the keywords the target advertised on in paid search in the requested month, with the position of each ad. This is the monthly snapshot; for what changed since the month before, use the Get Monthly Paid Search Keywords Changes endpoint.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/keywords/monthly

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: example.com

Value/Type: string

scopeRequired

Which part of the URL to query: the root domain, a subdomain, a specific folder, or a single page.

Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

countryRequired

Country code in ISO 3166-1 Alpha-2 format (case-insensitive). The United Kingdom is gb; uk is rejected. Not all countries have databases for all device types. Use the Get Supported Countries endpoint to verify country and device type availability. Example: US

Value/Type: string

device_typeRequired

Search database device type. Supported values: DESKTOP, MOBILE. DESKTOP: desktop search results. MOBILE: mobile search results (not available in all countries). Example: DESKTOP

Value/Type: string

filter

Filter expression. For syntax, refer to Advanced filtering. Money fields (cpc, traffic_cost) are filtered by numeric value alone; currency is not part of the filter. Available fields: keyword, position, position_difference, position_previous, block, volume, cpc, traffic, traffic_percent, traffic_cost, traffic_cost_percent, competition_density, results, keyword_difficulty, title, description, url, url_visible, crawled_time, ad_id, traffic_difference, traffic_difference_abs. String fields like ad_id must be quoted exactly as they appear in the response. Example: cpc > 2.50 AND volume > 100

Value/Type: string

fields

Field names to include in the response; omit to return all fields. Money fields like cpc or traffic_cost include both value and currency.

Supported values: keyword, position, position_difference, position_previous, block, volume, cpc, traffic, traffic_percent, traffic_cost, traffic_cost_percent, competition_density, results, trends, keyword_difficulty, title, description, url, url_visible, crawled_time, ad_id, traffic_difference, traffic_difference_abs. Example: keyword,position,volume,cpc

Value/Type: string[]

limit

Maximum number of results to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of positions to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

order_by

Field name to sort by. Default: volume. Money fields sort by their numeric value. When sorting by position_previous, new keywords (value 0) sort last regardless of direction.

Supported values: keyword, position, position_difference, position_previous, block, volume, cpc, traffic, traffic_percent, traffic_cost, traffic_cost_percent, competition_density, results, keyword_difficulty, title, description, url, url_visible, crawled_time, traffic_difference, traffic_difference_abs. Example: volume

Value/Type: string

direction

Sort direction: ascending or descending. Default: DESC.

Supported values: ASC, DESC. Example: DESC

Value/Type: string

Response Parameters

keyword

Keyword that triggered the ad.

Value/Type: string

position

Current ad position in paid results.

Value/Type: integer

position_previous

Ad position in the previous month. Value 0 indicates a new ad (not advertised previously).

Value/Type: integer

position_difference

Change in position: position_previous minus position. Positive values indicate the ad moved up. When position_previous is 0, this is the negative of the current position.

Value/Type: integer

volume

Monthly search volume for the keyword.

Value/Type: integer

block

Ad placement block.

Possible values: TOP, BOTTOM, MIDDLE.

Value/Type: string

cpc

Position cost per click in USD.

cpc

Value/Type: object

Value/Type: object

traffic

Estimated traffic from this keyword.

Value/Type: integer

traffic_percent

Share of keyword traffic in total domain traffic as a percentage (0–100).

Value/Type: number

traffic_cost

Estimated traffic cost in USD.

traffic_cost

Value/Type: object

Value/Type: object

traffic_cost_percent

Share of keyword cost in total domain traffic cost as a percentage (0–100).

Value/Type: number

competition_density

Paid competition intensity (0–100).

Value/Type: number

results

Number of search results for the keyword.

Value/Type: integer

keyword_difficulty

Keyword difficulty score.

Value/Type: integer

title

Title text of the ad.

Value/Type: string

description

Description text of the ad.

Value/Type: string

url

Final URL (landing page) of the ad.

Value/Type: string

url_visible

Display URL shown in the ad.

Value/Type: string

crawled_time

Timestamp of the most recent crawl in which the ad was seen, in ISO 8601 format (YYYY-MM-DDThh:mm:ssZ).

Value/Type: string

ad_id

Unique ad identifier.

Value/Type: string

traffic_difference

Net change in traffic since the previous month.

Value/Type: integer

traffic_difference_abs

Absolute value of traffic change.

Value/Type: integer

trends

Monthly trend data for the keyword as relative index values on a 0–100 scale (for example, 12 months of history).

Value/Type: array

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/keywords/monthly?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&filter=cpc > 2.50 AND volume > 100&fields=keyword,position,volume,cpc,traffic"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "url": "example.com",
      "scope": "ROOT_DOMAIN",
      "month": "2024-12",
      "filter": "cpc > 2.50 AND volume > 100",
      "limit": 10,
      "offset": 0
  },
  "data": [
      {
          "keyword": "coffee shop",
          "position": 3,
          "position_previous": 4,
          "position_difference": 1,
          "volume": 5400,
          "block": "TOP",
          "cpc": {
              "value": 3.25,
              "currency": "USD"
          },
          "traffic": 2150,
          "traffic_percent": 12.5,
          "traffic_cost": {
              "value": 6987.50,
              "currency": "USD"
          },
          "traffic_cost_percent": 15.2
      },
      {
          "keyword": "best coffee beans",
          "position": 5,
          "position_previous": 0,
          "position_difference": -5,
          "volume": 1200,
          "block": "TOP",
          "cpc": {
              "value": 2.80,
              "currency": "USD"
          },
          "traffic": 480,
          "traffic_percent": 2.8,
          "traffic_cost": {
              "value": 1344.00,
              "currency": "USD"
          },
          "traffic_cost_percent": 2.9
      }
  ]
}

Jump to Get Monthly Paid Search Keywords TotalGet Monthly Paid Search Keywords Total

Price: 10 API units per request

Returns the number of paid keywords matching the same target, month and filter as the Get Monthly Paid Search Keywords endpoint.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/keywords/monthly/total

Query parameters

urlRequired

Target URL to query. The URL must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://samplesite.com

Value/Type: string

scopeRequired

Which part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case (for example, us). The United Kingdom is gb; uk is rejected. Not all countries have databases for all device types. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Search database device type. Supported values: DESKTOP, MOBILE. DESKTOP is available in all countries; MOBILE is available in select countries only.

Value/Type: string

filter

Keywords filter string. For syntax, refer to Advanced filtering. Money fields are filtered by numeric value alone (for example, cpc &gt; 2.50); currency is not part of the filter. ad_id is a string: quote it exactly as returned in the response, and use only the =, !=, and IN operators with it. Available fields: keyword, position, position_difference, position_previous, block, volume, cpc, traffic, traffic_percent, traffic_cost, traffic_cost_percent, competition_density, results, keyword_difficulty, title, description, url, url_visible, crawled_time, ad_id, traffic_difference, traffic_difference_abs. Example: url = "example.com" AND keyword = "example"

Value/Type: string

Response Parameters

data

Total count of paid keywords matching the query.

data

Value/Type: object

Value/Type: object

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/keywords/monthly/total?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&filter=url%20%3D%20%22example.com%22"
Response example
JSON
{
  "data": {
      "total": 1523
  },
  "meta": {
      "country": "US",
      "device_type": "DESKTOP",
      "effective_url": "https://example.com",
      "filter": "url = \"example.com\"",
      "month": "2024-12",
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "scope": "ROOT_DOMAIN",
      "status_code": 200,
      "success": true,
      "url": "https://example.com"
  }
}

Jump to Get Monthly Paid Search Keywords ChangesGet Monthly Paid Search Keywords Changes

Price: 40 API units per line

Returns how the target’s paid keyword positions changed between the requested month and the month before it: keywords gained, lost, improved, and declined. Narrow the result with change_types; for the plain monthly snapshot use the Get Monthly Paid Search Keywords endpoint.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/keywords/changes/monthly

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://samplesite.com

Value/Type: string

scopeRequired

Which part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Changes are always computed against the month immediately before it. Example: 2024-12

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case (for example, us). The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Search database device type. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country supports. Example: DESKTOP

Value/Type: string

change_types

Position change types to include. Default: NEW, LOST, IMPROVED, DECLINED. Add UNCHANGED to also get keywords advertised at the same position in both months. Note: for LOST keywords (no longer advertised), position and position_difference are empty. Supported values: DECLINED, IMPROVED, LOST, NEW, UNCHANGED. Example: IMPROVED,DECLINED

Value/Type: string[]

filter

Filter string. For syntax, refer to Advanced filtering. Money fields are filtered by numeric value only (for example, cpc > 2.50); currency is never part of the filter. ad_id is a string: quote it exactly as returned in the response, and use only the =, !=, and IN operators with it. The change_type field accepts quoted value names like "NEW", never numeric IDs. Available fields: keyword, change_type, position, position_difference, position_previous, block, volume, cpc, traffic, traffic_percent, traffic_cost, traffic_cost_percent, traffic_difference, traffic_difference_abs, competition_density, results, keyword_difficulty, title, description, url, url_visible, ad_id, crawled_time. Example: change_type = "IMPROVED" AND volume > 100

Value/Type: string

fields

Response fields to include. All fields are returned if not specified. Money fields like cpc or traffic_cost return the entire value-currency pair, not a bare number. Supported values: keyword, change_type, position, position_difference, position_previous, block, volume, cpc, traffic, traffic_percent, traffic_cost, traffic_cost_percent, traffic_difference, traffic_difference_abs, competition_density, results, trends, keyword_difficulty, title, description, url, url_visible, ad_id, crawled_time. Example: keyword,position,volume,cpc,traffic

Value/Type: string[]

limit

Maximum number of position changes to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000. Example: 100

Value/Type: integer

offset

Number of position changes to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000. Example: 0

Value/Type: integer

order_by

Field to sort by. Default: position_difference. Money fields sort by numeric value. Rows without the sorted value (LOST keywords when sorting by position, NEW keywords when sorting by position_previous) sort last. Supported values: keyword, position, position_difference, position_previous, block, volume, cpc, traffic, traffic_percent, traffic_cost, traffic_cost_percent, traffic_difference, traffic_difference_abs, competition_density, results, keyword_difficulty, title, description, url, url_visible, crawled_time. Example: position_difference

Value/Type: string

direction

Sorting direction. Default: DESC. Supported values: ASC, DESC. Example: DESC

Value/Type: string

Response Parameters

data

Array of keyword position changes.

Value/Type: array

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/keywords/changes/monthly?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&change_types=IMPROVED,DECLINED&filter=change_type%20%3D%20%22IMPROVED%22%20AND%20volume%20%3E%20100&limit=10&offset=0&order_by=position_difference&direction=DESC"
Response example
JSON
{
  "data": [
      {
          "keyword": "marketing automation software",
          "change_type": "IMPROVED",
          "position": 3,
          "position_difference": 2,
          "position_previous": 5,
          "block": "TOP",
          "volume": 450,
          "cpc": {
              "value": 12.50,
              "currency": "USD"
          },
          "traffic": 890,
          "traffic_percent": 2.3,
          "traffic_cost": {
              "value": 11125.00,
              "currency": "USD"
          },
          "traffic_cost_percent": 3.1,
          "traffic_difference": 120,
          "traffic_difference_abs": 120,
          "competition_density": 85,
          "results": 1250000,
          "keyword_difficulty": 72,
          "title": "Marketing Automation Platform | Company",
          "description": "Streamline your marketing with our automation tools",
          "url": "https://example.com/marketing-automation",
          "url_visible": "example.com/marketing-automation",
          "ad_id": "1234567890",
          "crawled_time": "2024-12-15T09:30:00Z",
          "trends": [45, 48, 52, 55, 58, 62, 65, 68, 70, 72, 74, 75]
      },
      {
          "keyword": "best marketing tools",
          "change_type": "DECLINED",
          "position": 7,
          "position_difference": -2,
          "position_previous": 5,
          "block": "TOP",
          "volume": 320,
          "cpc": {
              "value": 8.75,
              "currency": "USD"
          },
          "traffic": 520,
          "traffic_percent": 1.8,
          "traffic_cost": {
              "value": 4550.00,
              "currency": "USD"
          },
          "traffic_cost_percent": 1.3,
          "traffic_difference": -85,
          "traffic_difference_abs": 85,
          "competition_density": 92,
          "results": 2100000,
          "keyword_difficulty": 68,
          "title": "Marketing Tools Review | Company",
          "description": "Compare the top marketing tools for your business",
          "url": "https://example.com/marketing-tools",
          "url_visible": "example.com/marketing-tools",
          "ad_id": "0987654321",
          "crawled_time": "2024-12-14T14:15:00Z",
          "trends": [38, 40, 42, 44, 45, 46, 45, 44, 43, 42, 41, 40]
      }
  ],
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "url": "example.com",
      "effective_url": "https://example.com",
      "scope": "ROOT_DOMAIN",
      "country": "US",
      "device_type": "DESKTOP",
      "month": "2024-12",
      "change_types": ["IMPROVED", "DECLINED"],
      "filter": "change_type = \"IMPROVED\" AND volume > 100",
      "limit": 10,
      "offset": 0,
      "order_by": "position_difference"
  }
}

Jump to Get Monthly Paid Search Keywords Changes TotalGet Monthly Paid Search Keywords Changes Total

Price: 10 API units per request

Returns the total number of paid keyword changes matching the same target, month, change_types, and filter as the Get Monthly Paid Search Keywords Changes endpoint.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/keywords/changes/monthly/total

Query parameters

urlRequired

Target URL to query. The length of the target URL must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://example.com

Value/Type: string

scopeRequired

Which part of the target URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Changes are always computed against the month immediately before it. Example: 2024-12

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case (for example, us). The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE.

Value/Type: string

change_types

Types of position changes to return. Default: NEW, LOST, IMPROVED, DECLINED, that is, every keyword whose paid position actually changed. Add UNCHANGED to also get keywords that were advertised at the same position in both months. Supported values: DECLINED, IMPROVED, LOST, NEW, UNCHANGED.

Value/Type: string[]

filter

Position changes filter string. For syntax, refer to Advanced filtering. A money field is filtered by its numeric value alone, never by the pair: cpc &gt; 2.50, and the currency is never part of a filter. Available fields: keyword, change_type, position, position_difference, position_previous, block, volume, cpc, traffic, traffic_percent, traffic_cost, traffic_cost_percent, traffic_difference, traffic_difference_abs, competition_density, results, keyword_difficulty, title, description, url, url_visible, ad_id, crawled_time. ad_id is a string: quote it exactly as returned in the response, and use only the =, !=, and IN operators with it. The change_type field accepts Position.ChangeType value names as quoted strings, never numeric IDs. Example: change_type = "NEW" AND volume &gt; 1000

Value/Type: string

Response Parameters

total

Total number of matching position changes.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/keywords/changes/monthly/total?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&change_types=DECLINED,IMPROVED,LOST&filter=change_type = \"NEW\" AND volume > 1000"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "month": "2024-12",
      "change_types": ["DECLINED", "IMPROVED", "LOST"],
      "filter": "change_type = \"NEW\" AND volume > 1000"
  },
  "data": {
      "total": 427
  }
}

Jump to Get Monthly Paid Search PagesGet Monthly Paid Search Pages

Price: 20 API units per line

Returns the pages the target advertised in paid search in the requested month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/pages/monthly

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: example.com

Value/Type: string

scopeRequired

Which part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is used. Example: 2024-12

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, case-insensitive (for example, us or US). The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Check the Get Supported Countries endpoint to get supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

filter

Pages filter string. For syntax, refer to Advanced filtering. Available fields: url, positions, traffic, traffic_percent. Example: positions &gt; 100

Value/Type: string

fields

Field names from the response entity to include in the response. All if nothing is specified. Supported values: url, positions, traffic, traffic_percent.

Value/Type: string[]

limit

Maximum number of pages to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of pages to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

order_by

Field name to sort by. Default: traffic. Supported values: url, positions, traffic, traffic_percent.

Value/Type: string

direction

Sorting direction (ascending or descending). Default: DESC. Supported values: ASC, DESC. Example: DESC

Value/Type: string

Response Parameters

url

Ranking page URL.

Value/Type: string

positions

Total number of keyword positions for this page.

Value/Type: integer

traffic

Estimated traffic for the page.

Value/Type: integer

traffic_percent

Share of this page’s traffic relative to the domain as a percentage (0–100).

Value/Type: number

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/pages/monthly?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&filter=positions%20%3E%20100&fields=url,positions,traffic,traffic_percent&limit=10"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "effective_url": "https://example.com",
      "filter": "positions > 100",
      "limit": 10,
      "month": "2024-12",
      "offset": 0,
      "order_by": "traffic",
      "scope": "ROOT_DOMAIN",
      "url": "example.com"
  },
  "data": [
      {
          "url": "https://example.com/products",
          "positions": 245,
          "traffic": 3500,
          "traffic_percent": 42.3
      },
      {
          "url": "https://example.com/blog",
          "positions": 168,
          "traffic": 2100,
          "traffic_percent": 25.4
      },
      {
          "url": "https://example.com/solutions",
          "positions": 112,
          "traffic": 1850,
          "traffic_percent": 22.4
      }
  ]
}

Jump to Get Monthly Paid Search Pages TotalGet Monthly Paid Search Pages Total

Price: 10 API units per request

Returns the total number of pages the target advertised in a specified month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/pages/monthly/total

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://example.com

Value/Type: string

scopeRequired

Determines which part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is used. Example: 2024-12

Value/Type: string

countryRequired

Country code in ISO 3166-1 Alpha-2 format (case-insensitive). The United Kingdom is gb; uk is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: desktop search database for the country. MOBILE: mobile search database, not available for all countries. Example: DESKTOP

Value/Type: string

filter

Pages filter string. For syntax, refer to Advanced filtering. Available fields: url, positions, traffic, traffic_percent. Example: positions &gt; 10

Value/Type: string

Response Parameters

total

Total number of matching pages.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/pages/monthly/total?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&filter=positions > 10"
Response example
JSON
{
  "data": {
      "total": 42
  },
  "meta": {
      "country": "US",
      "device_type": "DESKTOP",
      "effective_url": "https://example.com",
      "filter": "positions > 10",
      "month": "2024-12",
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "scope": "ROOT_DOMAIN",
      "status_code": 200,
      "success": true,
      "url": "https://example.com"
  }
}

Jump to Get Monthly Paid Search CompetitorsGet Monthly Paid Search Competitors

Price: 80 API units per line

Returns domains competing with the target for the same paid keywords in the requested month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/competitors/monthly

Query parameters

urlRequired

Target URL to query. Maximum length: 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://example.com

Value/Type: string

scopeRequired

Which part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is used. Example: 2024-12

Value/Type: string

countryRequired

Country code in ISO 3166-1 Alpha-2 format (case-insensitive). The United Kingdom is gb; uk is rejected. Not all countries have databases for all device types. Use the Get Supported Countries endpoint to get available country and device type combinations. Example: US

Value/Type: string

device_typeRequired

Search database type. Supported values: DESKTOP, MOBILE. DESKTOP for desktop search, MOBILE for mobile search (not available for all countries). Example: DESKTOP

Value/Type: string

fields

Field names from the response entity to include in the response. All if nothing is specified. A money field such as cpc or a *_traffic_cost selects the whole pair (value and currency), not a bare number. Supported values: domain, competition_density, common_keywords, adwords_positions, adwords_traffic, adwords_traffic_cost, organic_positions.

Value/Type: string[]

limit

Maximum number of competitors to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000. Example: 10

Value/Type: integer

offset

Number of competitors to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000. Example: 0

Value/Type: integer

order_by

Field to sort by. Default: common_keywords. Money fields sort by their numeric value. Supported values: domain, competition_density, common_keywords, adwords_positions, adwords_traffic, adwords_traffic_cost, organic_positions. Example: common_keywords

Value/Type: string

direction

Sort order. Default: DESC. Supported values: ASC, DESC. Example: DESC

Value/Type: string

Response Parameters

domain

Competitor’s domain name. Example: competitor1.com

Value/Type: string

competition_density

Overall competition intensity in paid search (0–100). Example: 75.5

Value/Type: number

common_keywords

Number of shared keywords between the target and this competitor. Example: 342

Value/Type: integer

adwords_positions

Number of paid search (AdWords) positions held. Example: 28

Value/Type: integer

adwords_traffic

Estimated traffic from paid search. Example: 15000

Value/Type: integer

adwords_traffic_cost

Estimated cost of paid search traffic (in USD).

Value/Type: object

organic_positions

Number of organic positions held by the competitor. Example: 18

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/competitors/monthly?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&fields=domain,competition_density,common_keywords,adwords_positions,adwords_traffic&limit=10"
Response example
JSON
{
  "data": [
      {
          "domain": "competitor1.com",
          "competition_density": 75.5,
          "common_keywords": 342,
          "adwords_positions": 28,
          "adwords_traffic": 15000,
          "adwords_traffic_cost": {
              "value": 5250.75,
              "currency": "USD"
          },
          "organic_positions": 18
      },
      {
          "domain": "competitor2.com",
          "competition_density": 62.3,
          "common_keywords": 287,
          "adwords_positions": 15,
          "adwords_traffic": 8900,
          "adwords_traffic_cost": {
              "value": 3120.45,
              "currency": "USD"
          },
          "organic_positions": 25
      },
      {
          "domain": "competitor3.com",
          "competition_density": 58.1,
          "common_keywords": 201,
          "adwords_positions": 22,
          "adwords_traffic": 12400,
          "adwords_traffic_cost": {
              "value": 4680.30,
              "currency": "USD"
          },
          "organic_positions": 12
      }
  ],
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "effective_url": "https://example.com",
      "scope": "ROOT_DOMAIN",
      "url": "https://example.com",
      "month": "2024-12",
      "limit": 10,
      "offset": 0
  }
}

Jump to Get Monthly Paid Search Competitors TotalGet Monthly Paid Search Competitors Total

Price: 10 API units per request

Returns the total number of paid search competitors for a specified domain or subdomain in a given month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/competitors/monthly/total

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://example.com

Value/Type: string

scopeRequired

The URL level to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is used. Example: 2024-12

Value/Type: string

countryRequired

Country code in ISO 3166-1 Alpha-2 format (case-insensitive). The United Kingdom is gb; uk is rejected. Not all countries support all device types. Use the Get Supported Countries endpoint to check available country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Search database type. Supported values: DESKTOP, MOBILE. Note that not all countries have a mobile database.

Value/Type: string

Response Parameters

data

total

Total number of paid search competitors found for the specified domain and month.

Value/Type: integer

Value/Type: object

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/competitors/monthly/total?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12"
Response example
JSON
{
  "data": {
      "total": 1234
  },
  "meta": {
      "country": "US",
      "device_type": "DESKTOP",
      "effective_url": "https://example.com",
      "month": "2024-12",
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "scope": "ROOT_DOMAIN",
      "status_code": 200,
      "success": true,
      "url": "https://example.com"
  }
}

Jump to Get Monthly Paid Search SubdomainsGet Monthly Paid Search Subdomains

Price: 20 API units per line

Returns the target’s subdomains that ran ads in paid search in the requested month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/subdomains/monthly

Query parameters

domainRequired

Root domain to query. The report is domain-scoped: a URL or a subdomain is reduced to its registered domain. Example: example.com

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case, for example, us. The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

fields

Field names from the response entity to include in the response. All if nothing is specified. Supported values: subdomain, positions, traffic, traffic_percent.

Value/Type: string[]

limit

Maximum number of subdomains to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of subdomains to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

order_by

Field name to sort by. Default: traffic. Supported values: subdomain, positions, traffic, traffic_percent.

Value/Type: string

direction

Sorting direction (ascending or descending). Default: DESC. Supported values: ASC, DESC. Example: DESC

Value/Type: string

Response Parameters

subdomain

Subdomain name.

Value/Type: string

positions

Number of adwords positions on the SERP.

Value/Type: integer

traffic

Number of adwords traffic.

Value/Type: integer

traffic_percent

Share of total traffic as a percentage. Supported range: 0 to 100.

Value/Type: number

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/subdomains/monthly?domain=example.com&country=US&device_type=DESKTOP&month=2024-12&fields=subdomain,positions,traffic&limit=10"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "domain": "example.com",
      "effective_url": "https://example.com",
      "month": "2024-12",
      "limit": 10,
      "offset": 0
  },
  "data": [
      {
          "subdomain": "shop.example.com",
          "positions": 12,
          "traffic": 1250,
          "traffic_percent": 35.2
      },
      {
          "subdomain": "blog.example.com",
          "positions": 8,
          "traffic": 890,
          "traffic_percent": 25.1
      },
      {
          "subdomain": "support.example.com",
          "positions": 5,
          "traffic": 635,
          "traffic_percent": 17.9
      }
  ]
}

Jump to Get Monthly Paid Search Subdomains TotalGet Monthly Paid Search Subdomains Total

Price: 10 API units per request

Returns the number of the target’s subdomains that ran ads in the requested month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/subdomains/monthly/total

Query parameters

domainRequired

Root domain to query. The report is domain-scoped: a URL or a subdomain is reduced to its registered domain. Example: example.com

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case, for example, us. The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE.

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

Response Parameters

total

Total number of subdomains running ads in the specified month.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/subdomains/monthly/total?domain=example.com&country=US&device_type=DESKTOP&month=2024-12"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "domain": "example.com",
      "effective_url": "https://example.com",
      "month": "2024-12"
  },
  "data": {
      "total": 247
  }
}

Jump to Get Paid Search CoverageGet Paid Search Coverage

Price: 20 API units per line

Returns a target’s paid search advertising history over a 12-month period, with one entry per keyword showing the ad text, display URLs, and the best ad position reached each month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/coverage/12-month

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://example.com

Value/Type: string

scopeRequired

Part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format (case-insensitive). The United Kingdom is gb; uk is rejected. Not all countries have databases for all device types. Verify country-device availability using the Get Supported Countries endpoint. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database (not available for all countries).

Value/Type: string

filter

Coverage filter. For syntax, refer to Advanced filtering. Money fields are filtered by numeric value only (for example, cpc &gt; 2.50); currency is never part of the filter. Available fields: keyword, coverage_12m, volume, cpc, traffic, url, url_visible, title. Example: traffic &gt; 100 AND coverage_12m &gt; 50

Value/Type: string

fields

Field names from the response to include. Defaults to all fields. best_positions includes the complete list of per-month best positions. Money fields like cpc include both value and currency. Supported values: keyword, coverage_12m, volume, cpc, traffic, url, url_visible, title, best_positions.

Value/Type: string[]

limit

Maximum number of ads to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of ads to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

direction

Sorting direction for coverage_12m. Default: DESC. Supported values: ASC, DESC. Example: DESC

Value/Type: string

Response Parameters

keyword

Keyword that triggered the historical ad.

Value/Type: string

coverage_12m

Share of months the ad was shown over the year (0–100).

Value/Type: number

volume

Monthly search volume for the keyword.

Value/Type: integer

cpc

Estimated cost per click in USD. Contains value (number) and currency (string).

Value/Type: object

traffic

Estimated paid traffic from the keyword.

Value/Type: integer

url

Final URL of the ad.

Value/Type: string

url_visible

Display (visible) URL shown in the ad.

Value/Type: string

title

Ad title shown in the search result.

Value/Type: string

best_positions

List of best ad positions for the keyword throughout the year. Each entry contains month (ISO 8601 format, YYYY-MM) and position (integer).

Value/Type: array

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/coverage/12-month?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&filter=traffic%20%3E%20100&fields=keyword,coverage_12m,volume,cpc&limit=10"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "effective_url": "https://example.com",
      "url": "https://example.com",
      "scope": "ROOT_DOMAIN",
      "limit": 10,
      "offset": 0
  },
  "data": [
      {
          "keyword": "project management software",
          "coverage_12m": 85,
          "volume": 18100,
          "cpc": {
              "value": 12.50,
              "currency": "USD"
          },
          "traffic": 1523,
          "url": "https://example.com/products",
          "url_visible": "example.com › products",
          "title": "Project Management Tools",
          "best_positions": [
              {
                  "month": "2024-01",
                  "position": 2
              },
              {
                  "month": "2024-02",
                  "position": 1
              }
          ]
      },
      {
          "keyword": "collaboration platform",
          "coverage_12m": 72,
          "volume": 9200,
          "cpc": {
              "value": 8.75,
              "currency": "USD"
          },
          "traffic": 612,
          "url": "https://example.com/features",
          "url_visible": "example.com › features",
          "title": "Collaboration Features",
          "best_positions": [
              {
                  "month": "2024-01",
                  "position": 3
              },
              {
                  "month": "2024-02",
                  "position": 2
              }
          ]
      }
  ]
}

Jump to Get Paid Search Coverage TotalGet Paid Search Coverage Total

Price: 10 API units per request

Returns the number of keywords in the target’s advertising history matching the request.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/coverage/12-month/total

Query parameters

urlRequired

Target URL to query. Must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://example.com

Value/Type: string

scopeRequired

Part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

countryRequired

Country code in ISO 3166-1 Alpha-2 format (any letter case). The United Kingdom is gb; uk is rejected. A country must have a database for the selected device_type. Use the Get Supported Countries endpoint to get available country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. DESKTOP covers the country’s desktop search database; MOBILE covers mobile search, which not all countries support. Supported values: DESKTOP, MOBILE.

Value/Type: string

filter

Coverage filter string. For syntax, refer to Advanced filtering. Money fields are filtered by numeric value only (currency is not part of the filter). Available fields: keyword, coverage_12m, volume, cpc, traffic, url, url_visible, title. Example: traffic &gt; 100 AND coverage_12m &gt; 50

Value/Type: string

Response Parameters

total

Total number of matching keywords in the advertising history.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/coverage/12-month/total?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&filter=traffic > 100 AND coverage_12m > 50"
Response example
JSON
{
  "data": {
      "total": 1250
  },
  "meta": {
      "country": "US",
      "device_type": "DESKTOP",
      "effective_url": "https://example.com",
      "filter": "traffic > 100 AND coverage_12m > 50",
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "scope": "ROOT_DOMAIN",
      "status_code": 200,
      "success": true,
      "url": "https://example.com"
  }
}

Jump to Get Monthly Paid Search Rankings TrendGet Monthly Paid Search Rankings Trend

Price: 20 API units per line

Returns the monthly number of paid positions, broken down by SERP position bucket, plus the traffic and traffic cost behind them, over the requested date range.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/rankings/trend/monthly

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://samplesite.com

Value/Type: string

scopeRequired

Which part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

date_fromRequired

Start date of the range in ISO 8601 format (YYYY-MM). Example: 2024-01

Value/Type: string

date_toRequired

End date of the range in ISO 8601 format (YYYY-MM). Example: 2024-12

Value/Type: string

countryRequired

Country code in ISO 3166-1 Alpha-2 format, in any letter case (for example, us). The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: us

Value/Type: string

device_typeRequired

Search database to query. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

filter

Rankings filter string. For syntax, refer to Advanced filtering. A money field is filtered by its numeric value alone, never by the pair: cpc &gt; 2.50, and the currency is never part of a filter. Available fields: keyword, block, volume, cpc, traffic, traffic_percent, traffic_cost, traffic_cost_percent, competition_density, results, keyword_difficulty, title, description, url, url_visible, crawled_time, ad_id, traffic_difference, traffic_difference_abs. ad_id is a string: quote it exactly as returned in the response, and use only the =, !=, and IN operators with it. Example: traffic &gt; 100

Value/Type: string

fields

Field names from the response entity to include in the response. All if nothing is specified. A money field such as cpc or a *_traffic_cost selects the whole pair (value and currency), not a bare number. Supported values: month, positions, positions_1_3, positions_4_10, positions_11_inf, traffic, traffic_cost, positions_new, positions_lost, positions_improved, positions_declined.

Value/Type: string[]

Response Parameters

data

List of rankings trend data points. Each object represents a month.

Value/Type: array of objects

data[*]

Monthly paid search rankings trend data point.

Value/Type: object

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/paid-search/rankings/trend/monthly?url=example.com&scope=ROOT_DOMAIN&date_from=2024-01&date_to=2024-12&country=us&device_type=DESKTOP&filter=traffic > 100&fields=month,positions,positions_1_3"
Response example
JSON
{
  "data": [
      {
          "month": "2024-01",
          "positions": 45,
          "positions_1_3": 12,
          "positions_4_10": 18,
          "positions_11_inf": 15,
          "positions_new": 3,
          "positions_lost": 2,
          "positions_improved": 5,
          "positions_declined": 1,
          "traffic": 2450,
          "traffic_cost": {
              "value": 1275.50,
              "currency": "USD"
          }
      },
      {
          "month": "2024-02",
          "positions": 48,
          "positions_1_3": 14,
          "positions_4_10": 19,
          "positions_11_inf": 15,
          "positions_new": 2,
          "positions_lost": 1,
          "positions_improved": 4,
          "positions_declined": 2,
          "traffic": 2680,
          "traffic_cost": {
              "value": 1398.75,
              "currency": "USD"
          }
      }
  ],
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "us",
      "device_type": "DESKTOP",
      "scope": "ROOT_DOMAIN",
      "url": "example.com",
      "effective_url": "https://example.com",
      "date_from": "2024-01",
      "date_to": "2024-12",
      "filter": "traffic > 100"
  }
}

Jump to Get Monthly AdvertisementsGet Monthly Advertisements

Price: 20 API units per line

Returns the list of paid (AdWords) advertisements displayed for the given keyword in the selected month, including their domains, URLs, creatives and placement blocks.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/keywords/advertisements/monthly

Query parameters

keywordRequired

Keyword to retrieve advertisements for. Required.

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case, for example, us. The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

fields

Field names from the response entity to include in the response. All if nothing is specified. Supported values: domain, url, url_visible, block, title, description, crawled_time, positions.

Value/Type: string[]

limit

Maximum number of advertisements to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of advertisements to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

Response Parameters

domain

Domain the advertisement leads to.

Value/Type: string

url

Final landing URL of the advertisement: the full address the click resolves to, including scheme, path and any tracking parameters.

Value/Type: string

url_visible

Display URL rendered in the advertisement creative: the shortened, advertiser-configured text shown beneath the title, usually the bare domain or the domain plus a vanity path, and without a scheme.

Value/Type: string

block

Placement block of the advertisement in the SERP. Possible values: TOP, BOTTOM, MIDDLE.

Value/Type: string

title

Title of the advertisement.

Value/Type: string

description

Description of the advertisement.

Value/Type: string

crawled_time

Timestamp of the most recent crawl in which the advertisement was seen, in ISO 8601 format (YYYY-MM-DDThh:mm:ssZ). Each item aggregates every occurrence of the same advertisement, so this is the last observation, not the first one or the crawl time of an individual SERP record. It may predate the requested month.

Value/Type: string

positions

Number of positions the advertisement appeared in.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/keywords/advertisements/monthly?keyword=example&country=US&device_type=DESKTOP&month=2024-12&fields=domain,url,url_visible&limit=10"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true
  },
  "data": [
      {
          "domain": "example.com",
          "url": "https://www.example.com/products/item123?utm_campaign=sem",
          "url_visible": "www.example.com/products",
          "block": "TOP",
          "title": "Premium Product Offer",
          "description": "High-quality items at competitive prices. Shop now and save.",
          "crawled_time": "2024-12-15T14:32:00Z",
          "positions": 5
      },
      {
          "domain": "competitor.com",
          "url": "https://www.competitor.com/deals?source=google_ads",
          "url_visible": "www.competitor.com/deals",
          "block": "TOP",
          "title": "Shop Best Deals Today",
          "description": "Exclusive discounts on top brands. Limited time only.",
          "crawled_time": "2024-12-14T10:15:00Z",
          "positions": 3
      },
      {
          "domain": "shop.example.com",
          "url": "https://shop.example.com/sale?promo=holiday2024",
          "url_visible": "shop.example.com/sale",
          "block": "MIDDLE",
          "title": "Holiday Sale Event",
          "description": "Get up to 50% off selected items. Free shipping included.",
          "crawled_time": "2024-12-13T09:45:00Z",
          "positions": 2
      }
  ]
}

Jump to Get Monthly Advertisements TotalGet Monthly Advertisements Total

Price: 10 API units per request

Returns the total number of paid advertisements displayed for the given keyword in the selected month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/keywords/advertisements/monthly/total

Query parameters

keywordRequired

Keyword to retrieve advertisements for. Example: insurance

Value/Type: string

countryRequired

Country code in ISO 3166-1 Alpha-2 format (case-insensitive). The United Kingdom is gb; uk is rejected. Not all countries support all device types. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. Example: DESKTOP

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

Response Parameters

data

total

Value/Type: integer

Value/Type: object

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/keywords/advertisements/monthly/total?keyword=insurance&country=US&device_type=DESKTOP&month=2024-12"
Response example
JSON
{
  "meta": {
      "country": "US",
      "device_type": "DESKTOP",
      "keyword": "insurance",
      "month": "2024-12",
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true
  },
  "data": {
      "total": 245
  }
}

Jump to Get Monthly AdvertisersGet Monthly Advertisers

Price: 80 API units per line

Returns the domains that advertised on the given keyword in the selected month, with the best advertisement position each of them held on that keyword and the creative shown at it. Advertisers are ordered by their total monthly advertising traffic across all keywords in the database, descending.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/keywords/advertisers/monthly

Query parameters

keywordRequired

Keyword to retrieve the advertisers for. Required.

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case (for example, us). The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

fields

Field names from the response entity to include in the response. All if nothing is specified. Supported values: domain, traffic, traffic_cost, positions, position, title, description, url, url_visible.

Value/Type: string[]

limit

Maximum number of advertisers to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of advertisers to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

Response Parameters

domain

Domain that advertised on the keyword.

Value/Type: string

position

Best advertisement position the advertiser held on the requested keyword during the month. “Best” means the highest-ranking (numerically lowest) position out of every position the advertiser held on this keyword that month. Ties are resolved in favour of the most recently crawled position.

Value/Type: integer

positions

Number of paid advertisement positions the domain held across all of its keywords in the requested month. Not restricted to the requested keyword. For this keyword, refer to position for this keyword.

Value/Type: integer

traffic

Estimated paid traffic the domain received across all of its keywords in the requested month. Not restricted to the requested keyword.

Value/Type: integer

traffic_cost

Estimated cost of that paid traffic, in USD, on the same scope as traffic. Always USD regardless of the requested country.

traffic_cost

Value/Type: object

Value/Type: object

title

Title of the advertisement shown at position.

Value/Type: string

description

Description of the advertisement shown at position.

Value/Type: string

url

Final landing URL of the advertisement shown at position, including scheme, path and any tracking parameters.

Value/Type: string

url_visible

Display URL rendered in the advertisement’s creative: the shortened, advertiser-configured text, usually the bare domain or the domain plus a vanity path, without a scheme.

Value/Type: string

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/keywords/advertisers/monthly?keyword=seo+tools&country=US&device_type=DESKTOP&month=2024-12&fields=domain,traffic,traffic_cost,position&limit=10"
Response example
JSON
{
  "data": [
      {
          "domain": "ahrefs.com",
          "position": 2,
          "positions": 1250,
          "traffic": 45230,
          "traffic_cost": {
              "value": 125750.50,
              "currency": "USD"
          },
          "title": "SEO Tools & Software",
          "description": "Rank higher on Google with Ahrefs SEO tools.",
          "url": "https://ahrefs.com/?utm_source=google",
          "url_visible": "ahrefs.com"
      },
      {
          "domain": "semrush.com",
          "position": 1,
          "positions": 2150,
          "traffic": 87650,
          "traffic_cost": {
              "value": 245320.75,
              "currency": "USD"
          },
          "title": "SEO & SEM Software for Marketing",
          "description": "Grow your online visibility with Semrush tools.",
          "url": "https://semrush.com/?utm_source=gads",
          "url_visible": "semrush.com"
      }
  ],
  "meta": {
      "country": "US",
      "device_type": "DESKTOP",
      "keyword": "seo tools",
      "month": "2024-12",
      "limit": 10,
      "offset": 0,
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true
  }
}

Jump to Get Monthly Advertisers TotalGet Monthly Advertisers Total

Price: 10 API units per request

Returns the total number of domains that advertised on the given keyword in the selected month. Counts exactly the advertisers the Get Monthly Advertisers endpoint paginates over for the same month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/keywords/advertisers/monthly/total

Query parameters

keywordRequired

Keyword to retrieve the advertisers for.

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case, for example, us. The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE.

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

Response Parameters

total

Total number of domains that advertised on the keyword.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/keywords/advertisers/monthly/total?keyword=iphone&country=US&device_type=DESKTOP&month=2024-12"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "keyword": "iphone",
      "month": "2024-12"
  },
  "data": {
      "total": 487
  }
}

Jump to Get Monthly Shopping AdvertisementsGet Monthly Shopping Advertisements

Price: 20 API units per line

Returns a list of distinct shopping advertisements appearing for the target in monthly snapshots.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/shopping-advertisements/monthly

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://example.com

Value/Type: string

scopeRequired

Defines which part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned.

Value/Type: string

countryRequired

Country database code in ISO 3166-1 Alpha-2 format, in any letter case (for example, us). The United Kingdom is gb; uk is rejected. Not all countries have databases for every device_type. Check the Get Supported Countries endpoint to find available country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. DESKTOP queries the country’s desktop search database. MOBILE queries the mobile search database (not available for all countries). Supported values: DESKTOP, MOBILE.

Value/Type: string

filter

Filter expression. For syntax, refer to Advanced filtering. Available fields: url, title, positions, price, shop_name, uniq_hash. Filter values use the same units as response fields. The price field filters by numeric value in the country’s currency (for example, price = 12.99). uniq_hash is a string: quote it exactly as returned in the response, and use only the =, !=, and IN operators with it. The url and title conditions cannot be combined with other fields using OR, nor negated together with them. Use AND between the two groups; OR and NOT are supported within either group. Example: url CONTAINS "apple" AND positions &gt; 3. Example: price &gt; 50 AND shop_name = "Amazon"

Value/Type: string

fields

Field names to include in the response. If omitted, all fields are returned. The price field selects the complete object (value and currency), not a bare number. Supported values: url, image, title, positions, price, shop_name, uniq_hash.

Value/Type: string[]

limit

Maximum number of advertisements to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of advertisements to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

order_by

Field name to sort by. Default: positions. Supported values: positions.

Value/Type: string

direction

Sorting direction: ascending or descending. Default: DESC. Supported values: ASC, DESC. Example: DESC

Value/Type: string

Response Parameters

data

Array of shopping advertisements.

Value/Type: object[]

data[*].url

Landing page URL of the product ad.

Value/Type: string

data[*].image

Product image URL shown in the PLA.

Value/Type: string

data[*].title

Product title displayed in the PLA.

Value/Type: string

data[*].positions

Number of keyword positions this advertisement appears in.

Value/Type: integer

data[*].price

Product price as shown in the ad, with its currency.

Value/Type: object

data[*].shop_name

Name of the advertiser or shop.

Value/Type: string

data[*].uniq_hash

Unique advertisement identifier.

Value/Type: string

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/shopping-advertisements/monthly?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&filter=price%20%3E%2050&fields=url,title,positions,price,shop_name"
Response example
JSON
{
  "data": [
      {
          "url": "https://example.com/product/wireless-headphones",
          "title": "Premium Wireless Headphones - High Quality Sound",
          "positions": 15,
          "price": {
              "value": 79.99,
              "currency": "USD"
          },
          "shop_name": "Amazon"
      },
      {
          "url": "https://example.com/product/usb-cable",
          "title": "Fast Charging USB-C Cable 6ft",
          "positions": 8,
          "price": {
              "value": 12.99,
              "currency": "USD"
          },
          "shop_name": "Best Buy"
      }
  ],
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "effective_url": "https://example.com",
      "url": "https://example.com",
      "scope": "ROOT_DOMAIN",
      "month": "2024-12",
      "limit": 100,
      "offset": 0,
      "filter": "price > 50"
  }
}

Jump to Get Monthly Shopping Advertisements TotalGet Monthly Shopping Advertisements Total

Price: 10 API units per request

Returns the total number of distinct shopping advertisements displayed for the given URL in the selected month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/shopping-advertisements/monthly/total

Query parameters

urlRequired

Target URL to query. The length of the URL must not exceed 2,000 characters. Accepts URLs with or without the protocol (https:// or http://). Example: https://example.com

Value/Type: string

scopeRequired

Which part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

countryRequired

Country code in ISO 3166-1 Alpha-2 format (case-insensitive). For example, US for the United States, GB for the United Kingdom. The specified country must have a database for the selected device_type. Use the Get Supported Countries endpoint to verify available country and device type combinations. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: desktop search database. MOBILE: mobile search database; not available for all countries.

Value/Type: string

filter

Filter string. For syntax, refer to Advanced filtering. Available fields: url, title, positions, price, shop_name, uniq_hash. Filter values use the same units as the response fields, without implicit scaling: price filters by the numeric price value in the country’s currency. uniq_hash is a string: quote it exactly as returned in the response, and use only the =, !=, and IN operators with it. The url and title conditions cannot be combined with other fields using OR, nor negated together with them. Use AND between groups (for example, url CONTAINS "seo" AND positions = 3); OR and NOT inside either group are supported (for example, NOT (url CONTAINS "seo" OR title CONTAINS "seo") AND positions = 3). Example: price = 12.99 AND positions = 3

Value/Type: string

Response Parameters

total

Total number of distinct shopping advertisements found.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/shopping-advertisements/monthly/total?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&filter=price = 12.99"
Response example
JSON
{
  "data": {
      "total": 45
  },
  "meta": {
      "country": "US",
      "device_type": "DESKTOP",
      "effective_url": "https://example.com",
      "filter": "price = 12.99",
      "month": "2024-12",
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "scope": "ROOT_DOMAIN",
      "status_code": 200,
      "success": true,
      "url": "example.com"
  }
}

Jump to Get Monthly Shopping Advertisements CompetitorsGet Monthly Shopping Advertisements Competitors

Price: 80 API units per line

Returns competing domains ranked by shared PLA (Product Listing Ads) keywords.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/shopping-advertisements/competitors/monthly

Query parameters

domainRequired

Root domain to query, for example, example.com. Required. The report is domain-scoped: a URL or a subdomain is reduced to its registered domain. Example: samplesite.com

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case (for example, us). The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

fields

Field names from the response entity to include in the response. All if nothing is specified. Supported values: domain, pla_positions, adwords_positions, adwords_traffic, adwords_traffic_cost, common_keywords, competition_density, organic_positions.

Value/Type: string[]

limit

Maximum number of PLA competitors to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of PLA competitors to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

order_by

Field name to sort by. Supported values: domain, pla_positions, adwords_positions, adwords_traffic, adwords_traffic_cost, common_keywords, competition_density, organic_positions. Example: competition_density

Value/Type: string

direction

Sorting direction (ascending or descending). Default: DESC. Supported values: ASC, DESC. Example: DESC

Value/Type: string

Response Parameters

domain

Competitor’s domain name.

Value/Type: string

pla_positions

Number of PLA positions held by the competitor.

Value/Type: integer

adwords_positions

Number of paid search (AdWords) positions.

Value/Type: integer

adwords_traffic

Estimated traffic from AdWords.

Value/Type: integer

adwords_traffic_cost

Estimated cost of AdWords traffic in USD.

adwords_traffic_cost

Value/Type: object

Value/Type: object

common_keywords

Number of keywords shared with the target in PLA campaigns.

Value/Type: integer

competition_density

Keyword competition density score in PLA. Range: 0 to 100, with 100 being the most competitive.

Value/Type: number

organic_positions

Number of organic positions for the competitor.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/shopping-advertisements/competitors/monthly?domain=example.com&country=US&device_type=DESKTOP&month=2024-12&fields=domain,pla_positions,adwords_positions,adwords_traffic&limit=10"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "domain": "example.com",
      "country": "US",
      "device_type": "DESKTOP",
      "month": "2024-12",
      "limit": 10,
      "offset": 0,
      "effective_url": "https://example.com",
      "total": 2
  },
  "data": [
      {
          "domain": "competitor1.com",
          "pla_positions": 42,
          "adwords_positions": 38,
          "adwords_traffic": 1250,
          "adwords_traffic_cost": {
              "value": 3500.75,
              "currency": "USD"
          },
          "common_keywords": 85,
          "competition_density": 72.5,
          "organic_positions": 156
      },
      {
          "domain": "competitor2.com",
          "pla_positions": 35,
          "adwords_positions": 32,
          "adwords_traffic": 890,
          "adwords_traffic_cost": {
              "value": 2145.50,
              "currency": "USD"
          },
          "common_keywords": 62,
          "competition_density": 58.3,
          "organic_positions": 201
      }
  ]
}

Jump to Get Monthly Shopping Advertisements Competitors TotalGet Monthly Shopping Advertisements Competitors Total

Price: 10 API units per request

Returns the total number of identified PLA competitors.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/shopping-advertisements/competitors/monthly/total

Query parameters

domainRequired

Root domain to query, for example, example.com. The report is domain-scoped: a URL or a subdomain is reduced to its registered domain. Example: samplesite.com

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case, for example, us. The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE.

Value/Type: string

Response Parameters

total

Total number of identified PLA competitors.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/shopping-advertisements/competitors/monthly/total?domain=samplesite.com&country=US&device_type=DESKTOP&month=2024-12"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "domain": "samplesite.com",
      "effective_url": "https://samplesite.com",
      "month": "2024-12"
  },
  "data": {
      "total": 89
  }
}

Jump to Get Monthly Shopping Advertisements PositionsGet Monthly Shopping Advertisements Positions

Price: 20 API units per line

Returns a list of PLA keywords and positions the target domain appears for in Google Shopping results.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/shopping-advertisements/keywords/monthly

Query parameters

urlRequired

Target URL to query. Required. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: example.com

Value/Type: string

scopeRequired

Which part of the URL to analyze. Required. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case, for example, us. The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

filter

Positions filter string. For syntax, refer to Advanced filtering. A money field is filtered by its numeric value alone, never by the pair: cpc > 2.50, and the currency is never part of a filter. Available fields: keyword, url, position, position_difference, position_previous, volume, cpc, keyword_difficulty, competition_density, price, results, shop_name, title, uniq_hash. Filter values use the same units as the response fields, without implicit scaling: cpc is in USD (cpc > 2.50 means $2.50), competition_density is on 0 to 100, and price filters by the numeric price value in the country’s currency (price > 12.99). uniq_hash is a string: quote it exactly as returned in the response, and use only the =, !=, and IN operators with it. Example: keyword = "seo" AND position > 10

Value/Type: string

fields

Field names from the response entity to include in the response. All if nothing is specified. A money field, price or cpc, selects the whole pair (value and currency), not a bare number. Supported values: keyword, url, position, position_difference, position_previous, volume, cpc, keyword_difficulty, competition_density, image, price, results, shop_name, title, trends, uniq_hash.

Value/Type: string[]

limit

Maximum number of PLA positions to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of PLA positions to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

order_by

Field name to sort by. Money fields sort by their numeric value. Default: volume. Advertisements without a previous position sort last in either direction when sorting by position_previous or position_difference. Supported values: keyword, url, position, position_difference, position_previous, volume, cpc, keyword_difficulty, competition_density, price, results, shop_name, title.

Value/Type: string

direction

Sorting direction (ascending or descending). Default: DESC. Supported values: ASC, DESC. Example: DESC

Value/Type: string

Response Parameters

keyword

Keyword that triggered the PLA ad.

Value/Type: string

url

Landing page URL of the ad.

Value/Type: string

position

Current PLA position in the SERP.

Value/Type: integer

position_difference

Change in position: position_previous minus position, positive when the position improved. Absent when there is no previous position.

Value/Type: integer

position_previous

Previous PLA position. Absent when the advertisement had no position in the previous month.

Value/Type: integer

volume

Monthly search volume for the keyword.

Value/Type: integer

cpc

Cost per click of the keyword, in USD (for example 2.50 for $2.50).

Value/Type: object

keyword_difficulty

Keyword difficulty score (0–100).

Value/Type: integer

competition_density

Competition level of advertisers bidding on the keyword in paid search (0 to 100, with 100 being the most competitive).

Value/Type: number

image

Product image URL used in the ad.

Value/Type: string

price

Product price as shown in the ad, with its currency.

Value/Type: object

results

Number of total results for the keyword.

Value/Type: integer

shop_name

Advertiser or shop name.

Value/Type: string

title

Product title displayed in the PLA.

Value/Type: string

trends

Monthly search volume trend data for the keyword (typically 12 months). Each value is a relative index on a 0 to 100 scale.

Value/Type: integer[]

uniq_hash

Unique PLA identifier.

Value/Type: string

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/shopping-advertisements/keywords/monthly?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&filter=keyword%20=%20%22seo%22%20AND%20position%20%3E%2010&fields=keyword,url,position,volume,cpc&limit=10"
Response example
JSON
{
  "meta": {
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true,
      "country": "US",
      "device_type": "DESKTOP",
      "effective_url": "example.com",
      "url": "example.com",
      "scope": "ROOT_DOMAIN",
      "month": "2024-12",
      "limit": 10,
      "offset": 0
  },
  "data": [
      {
          "keyword": "seo services",
          "url": "https://www.example.com/seo-services",
          "position": 5,
          "volume": 12500,
          "cpc": {
              "value": 15.75,
              "currency": "USD"
          },
          "keyword_difficulty": 62,
          "competition_density": 78,
          "shop_name": "Example Shop",
          "title": "Professional SEO Services",
          "results": 2850000000,
          "price": {
              "value": 99.99,
              "currency": "USD"
          },
          "image": "https://example.com/images/seo-service.jpg",
          "trends": [45, 48, 52, 55, 58, 62, 65, 68, 70, 72, 75, 78],
          "uniq_hash": "abc123def456ghi789jk"
      },
      {
          "keyword": "search engine optimization",
          "url": "https://www.example.com/seo",
          "position": 8,
          "volume": 9800,
          "cpc": {
              "value": 12.50,
              "currency": "USD"
          },
          "keyword_difficulty": 55,
          "competition_density": 72,
          "shop_name": "Example Shop",
          "title": "SEO Solutions & Strategies",
          "results": 1950000000,
          "price": {
              "value": 149.99,
              "currency": "USD"
          },
          "image": "https://example.com/images/seo-solutions.jpg",
          "trends": [52, 55, 58, 60, 62, 65, 68, 70, 72, 74, 76, 78],
          "uniq_hash": "xyz789abc123def456ghi"
      }
  ]
}

Jump to Get Monthly Shopping Advertisements Positions TotalGet Monthly Shopping Advertisements Positions Total

Price: 10 API units per request

Returns the total number of the target’s PLA positions (keyword and advertisement pairs); lost positions, which the list omits, are counted.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/shopping-advertisements/keywords/monthly/total

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://example.com

Value/Type: string

scopeRequired

Part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case (for example, us). The United Kingdom is gb; uk is rejected. A country without a database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database (not available for all countries).

Value/Type: string

filter

Filter string. For syntax, refer to Advanced filtering. Money fields are filtered by numeric value alone, with currency never part of the filter expression: cpc &gt; 2.50 means USD $2.50. Available fields: keyword, url, position, position_difference, position_previous, volume, cpc, keyword_difficulty, competition_density, price, results, shop_name, title, uniq_hash. Filter values use the same units as the response fields: cpc is in USD, competition_density is 0–100, and price is in the country’s currency. uniq_hash is a string: quote it exactly as returned in the response, and use only the =, !=, and IN operators with it. Example: position &gt; 10 AND cpc &gt; 2.50

Value/Type: string

Response Parameters

total

Total number of matching shopping advertisement positions (keyword and advertisement pairs).

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/shopping-advertisements/keywords/monthly/total?url=example.com&scope=ROOT_DOMAIN&country=US&device_type=DESKTOP&month=2024-12&filter=position%20%3E%2010%20AND%20cpc%20%3E%202.50"
Response example
JSON
{
  "data": {
      "total": 1247
  },
  "meta": {
      "country": "US",
      "device_type": "DESKTOP",
      "effective_url": "https://example.com",
      "filter": "position > 10 AND cpc > 2.50",
      "month": "2024-12",
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "scope": "ROOT_DOMAIN",
      "status_code": 200,
      "success": true,
      "url": "https://example.com"
  }
}

Jump to Get Monthly Shopping Advertisements Overview TrendGet Monthly Shopping Advertisements Overview Trend

Price: 20 API units per line

Returns the monthly numbers of the target’s PLA positions and distinct ads over time.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/shopping-advertisements/overview/trend/monthly

Query parameters

urlRequired

Target URL to query. The length must not exceed 2,000 characters. Accepts URLs with or without the protocol (https://). Example: https://example.com

Value/Type: string

scopeRequired

Part of the URL to analyze. Supported values: ROOT_DOMAIN, SUBDOMAIN, SUBFOLDER, PAGE. Example: ROOT_DOMAIN

Value/Type: string

date_fromRequired

Start date of the range in ISO 8601 format (YYYY-MM). Example: 2024-01

Value/Type: string

date_toRequired

End date of the range in ISO 8601 format (YYYY-MM). Example: 2024-12

Value/Type: string

countryRequired

Country code in ISO 3166-1 Alpha-2 format (any letter case), such as us. The United Kingdom is gb; uk is rejected. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE.

Value/Type: string

filter

Filter expression. For syntax, refer to Advanced filtering. A money field is filtered by its numeric value alone: cpc &gt; 2.50, and the currency is never part of a filter. Available fields: keyword, url, position, position_difference, position_previous, volume, cpc, keyword_difficulty, competition_density, price, results, shop_name, title, uniq_hash. Filter values use the same units as the response fields: cpc is in USD, competition_density is on 0 to 100, and price is the numeric price value in the country’s currency. uniq_hash is a string: quote it exactly as returned in the response, and use only the =, !=, and IN operators with it. Example: position &gt; 5

Value/Type: string

fields

Field names from the response to include. All if nothing is specified. Supported values: month, positions, ads.

Value/Type: string[]

Response Parameters

data

Array of monthly overview trend points.

data[*]

Value/Type:

Value/Type: object[]

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/shopping-advertisements/overview/trend/monthly?url=example.com&scope=ROOT_DOMAIN&date_from=2024-01&date_to=2024-12&country=US&device_type=DESKTOP&filter=position%20%3E%205&fields=month,positions,ads"
Response example
JSON
{
  "meta": {
      "country": "US",
      "date_from": "2024-01",
      "date_to": "2024-12",
      "device_type": "DESKTOP",
      "effective_url": "https://example.com",
      "filter": "position > 5",
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "scope": "ROOT_DOMAIN",
      "status_code": 200,
      "success": true,
      "url": "https://example.com"
  },
  "data": [
      {
          "month": "2024-01",
          "positions": 45,
          "ads": 28
      },
      {
          "month": "2024-02",
          "positions": 52,
          "ads": 31
      },
      {
          "month": "2024-03",
          "positions": 48,
          "ads": 29
      }
  ]
}

Jump to Get Monthly Shopping Advertisements by KeywordGet Monthly Shopping Advertisements by Keyword

Price: 20 API units per line

Returns the list of shopping advertisements displayed for the given keyword in the selected month, including product titles, prices and shops. These are the ads previously known in the industry as product listing ads (PLA).

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/keywords/shopping-advertisements/monthly

Query parameters

keywordRequired

Keyword to retrieve shopping advertisements for. Required.

Value/Type: string

countryRequired

Country code in ISO 3166-1 Alpha-2 format (case-insensitive). For example, US for the United States, GB for the United Kingdom. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: desktop search database. MOBILE: mobile search database; not available for all countries.

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

fields

Field names from the response entity to include in the response. All if nothing is specified. A money field such as price, cpc or a *_traffic_cost selects the whole pair (value and currency), not a bare number. Supported values: domain, url, price, title, shop_name, image, crawled_time, positions.

Value/Type: string[]

limit

Maximum number of shopping advertisements to return. Default: 100. Maximum: 5,000. A value of 0 is rejected. The sum of limit and offset must not exceed 500,000.

Value/Type: integer

offset

Number of shopping advertisements to skip before returning results. Default: 0. The sum of limit and offset must not exceed 500,000; with the default limit of 100, the largest offset is 499,900.

Value/Type: integer

order_by

Field name to sort by. Money fields sort by their numeric value. Default: positions. Supported values: domain, url, price, title, shop_name, crawled_time, positions.

Value/Type: string

direction

Sorting direction. Default: DESC. Supported values: ASC, DESC. Example: DESC

Value/Type: string

Response Parameters

domain

Domain the advertisement leads to.

Value/Type: string

url

Landing page URL of the product advertisement.

Value/Type: string

price

Product price as shown in the advertisement, with its currency.

Value/Type: object

title

Product title.

Value/Type: string

shop_name

Name of the advertiser or shop.

Value/Type: string

image

Product image URL.

Value/Type: string

crawled_time

Timestamp of the most recent crawl in which the advertisement was seen, in ISO 8601 format (YYYY-MM-DDThh:mm:ssZ). This is the last observation of the advertisement, not the first, and may predate the requested month.

Value/Type: string

positions

Number of positions the advertisement appeared in.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/keywords/shopping-advertisements/monthly?keyword=running+shoes&country=US&device_type=DESKTOP&month=2024-12&fields=domain,url,price,title&limit=10"
Response example
JSON
{
  "meta": {
      "country": "US",
      "device_type": "DESKTOP",
      "keyword": "running shoes",
      "limit": 10,
      "month": "2024-12",
      "offset": 0,
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true
  },
  "data": [
      {
          "domain": "amazon.com",
          "url": "https://amazon.com/s?k=running+shoes",
          "price": {
              "value": 89.99,
              "currency": "USD"
          },
          "title": "Nike Men's Revolution Running Shoe",
          "shop_name": "Amazon",
          "image": "https://images.amazon.com/running-shoe.jpg",
          "crawled_time": "2024-12-15T10:30:00Z",
          "positions": 3
      },
      {
          "domain": "nike.com",
          "url": "https://nike.com/running-shoes",
          "price": {
              "value": 120.00,
              "currency": "USD"
          },
          "title": "Nike Air Zoom Pegasus",
          "shop_name": "Nike",
          "image": "https://images.nike.com/pegasus.jpg",
          "crawled_time": "2024-12-14T14:20:00Z",
          "positions": 2
      },
      {
          "domain": "adidas.com",
          "url": "https://adidas.com/ultraboost-shoes",
          "price": {
              "value": 180.00,
              "currency": "USD"
          },
          "title": "Adidas Ultraboost Running Shoe",
          "shop_name": "Adidas",
          "image": "https://images.adidas.com/ultraboost.jpg",
          "crawled_time": "2024-12-13T09:15:00Z",
          "positions": 1
      }
  ]
}

Jump to Get Monthly Shopping Advertisements by Keyword TotalGet Monthly Shopping Advertisements by Keyword Total

Price: 10 API units per request

Returns the total number of shopping advertisements displayed for the given keyword in the selected month.

Jump to EndpointEndpoint

GEThttps://api.semrush.com/apis/v4/domain-analytics/v1/keywords/shopping-advertisements/monthly/total

Query parameters

keywordRequired

Keyword to retrieve shopping advertisements for.

Value/Type: string

countryRequired

Country (database) code in ISO 3166-1 Alpha-2 format, in any letter case (for example, us). The United Kingdom is gb; uk is rejected. A country that has no database for the selected device_type is rejected. Use the Get Supported Countries endpoint to get the supported country and device type pairs. Example: US

Value/Type: string

device_typeRequired

Device type of the search database. Supported values: DESKTOP, MOBILE. DESKTOP: the country’s desktop search database. MOBILE: the country’s mobile search database, which not every country has.

Value/Type: string

month

Month in ISO 8601 format (YYYY-MM). If omitted, the latest monthly snapshot for the selected country and device_type is returned. Example: 2024-12

Value/Type: string

Response Parameters

total

Total number of shopping advertisements displayed for the keyword in the selected month.

Value/Type: integer

meta

Response metadata.

Value/Type: object

Request example
curl -H 'Authorization: Apikey YOUR_API_KEY' "https://api.semrush.com/apis/v4/domain-analytics/v1/keywords/shopping-advertisements/monthly/total?keyword=laptop&country=US&device_type=DESKTOP&month=2024-12"
Response example
JSON
{
  "data": {
      "total": 145
  },
  "meta": {
      "country": "US",
      "device_type": "DESKTOP",
      "keyword": "laptop",
      "month": "2024-12",
      "request_id": "4fb1773ec2a8d61a0407f464599f897c",
      "status_code": 200,
      "success": true
  }
}

Last updated: November 13, 2026

Was this page helpful?