Skip to main content
GET
Get Competitor Seo Domain Detail

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Path Parameters

brand_id
string<uuid>
required

Query Parameters

competitor
string
required

competitor domain

Minimum string length: 1

Response

Successful Response

One domain's whole organic-search record, for a caller that knows only the domain.

Organic visibility is a property of a DOMAIN, so this response is keyed by the requested domain rather than by the reading brand's competitor roster: a domain the platform has measured for anyone reports real numbers here. basis says whose acquisition paid for them and therefore what is in the payload:

  • this_workspace — the reading brand's own captures. The keyword_gap* family is populated, because "ranks where the brand is absent" is measured against THIS brand's own website.
  • platform — measured by another workspace. Only domain-intrinsic facts are carried; gap_keywords / shared_keywords / keyword_gap_count stay empty and gap_available is False, because a foreign workspace's gap is measured against ITS website and is not this reader's to see.
  • unmeasured — nobody has measured this domain. metric is null and every collection is empty. Render that as "not measured", never as zero (ADR 0026): every numeric here is nullable and null means NOT MEASURED.
competitor_domain
string
required
basis
enum<string>
required
Available options:
this_workspace,
platform,
unmeasured
market
SeoMarketDescriptor · object
required

WHICH market an organic-search series describes.

Organic rank, traffic and keyword counts are measured per (location_code, language_code): the same domain measured in the US and in the UK produces two unrelated numbers. Every SEO reader here is scoped to exactly one market (see get_traffic_series / get_historical_traffic_series / get_domain_seo_measurement), and a brand can change its market at any time from the market modal — so a series that does not NAME its market silently changes basis under the reader, who has no way to tell that the axis moved.

Carried alongside basis and for the same reason: state what was measured rather than render a plausible number. basis names WHOSE acquisition paid; this names WHAT MARKET it bought.

country_code / country_name are null for a location_code outside brand_market_service.MARKET_COUNTRIES — a market can be persisted (or configured as the fallback default) without appearing in the picker's catalogue. label is always populated and always renderable: it degrades to the bare code rather than to an empty string, because the whole point of this object is that the reader is never left guessing.

authority_metrics_enabled
boolean
default:false
metric
CompetitorSeoMetricRow · object | null

One competitor's organic row.

Every numeric here is nullable and null means NOT MEASURED, never zero. A DataForSEO read that failed persists NULL so the UI renders its NOT_MEASURED em-dash instead of an authoritative-looking 0.

organic_keyword_count / keyword_gap_count are DOMAIN-WIDE populations. keyword_sample_size / keyword_gap_sample_size are how many rows the Keywords and Gap panels actually hold — so the UI can label them "top N of M" rather than presenting a capped API page as the count.

keywords
SeoKeywordRow · object[]
traffic_series
CompetitorSeoTrafficSeries · object | null
gap_available
boolean
default:false
shared_keywords
Shared Keywords · object[]
gap_keywords
Gap Keywords · object[]
keyword_gap_sample_size
integer | null
gap_semantics
string
default:""
capture_count
integer
default:0