Get Audit Competitor Benchmark Route
Benchmark this brand’s audited position against the competitors IT named.
R17 of the audits UX plan — the differentiator a generic auditor cannot copy, because it holds no competitor set for you. Pure read of already-persisted competitor acquisition output: no provider spend, no refresh triggered.
Gated on the acquisition surface that WRITES the rows being read — the competitor-dashboard master plus the module sub-flag for the basis this audit type uses. With acquisition dark, the tables are not being populated and the only honest answer is that the capability is unavailable (404), not an empty cohort that reads like the user has no competitors.
An unsupported audit type (Website — no competitor is ever fetched or
scored, so nothing shares its measurement basis) returns 200 with
available=False and a reason. That is a real answer about the data, not
a missing endpoint.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Query Parameters
50Response
Successful Response
The audited brand's standing against the competitors IT named (R17).
available=False is a first-class, renderable answer — reason names
which one so the report can offer the matching next step instead of a
blank panel. It is NEVER an error: a brand with no competitors yet, or a
Website audit (which has no same-basis competitor measure at all), is a
normal state.
These are MEASURED dimensions on an identical basis for both sides, not
audit scores — no competitor is ever audited, so no competitor has a
dimension score to average. See
services/audit_competitor_benchmark.py for why.
N-of-M acquisition coverage for one module's cohort (the ★S0/★C0 strip).
measured counts cohort domains that produced a stored metric row.
missing are targets that never did — their fetch or persist failed, or
they have not been acquired yet. For Content, fetch_failed is a typed
subset of missing, not an additional shortfall, so clients must
de-duplicate rather than sum those lengths. A competitor with a failed
acquisition must render as a failure chip, never as a measured zero.
★S9 — the cohort ranks, you don't.
Rows come from DataForSEO's own server-side exclusion query
(domain_intersection with intersections: false), so a keyword the
brand ranks for at position 240 is not reported as a gap. semantics
names that contract; an empty string means the stored snapshot predates it.
★S10 — shared keywords where a competitor MATERIALLY outranks the brand.
The thresholds are the free SEO audit's, imported rather than copied, so BI and the audit can never disagree on what "materially outranks" means.
★S3 — keywords the WHOLE measured cohort ranks for: the must-haves.
★S6 — what KIND of page wins in this niche (classified ranking URLs).
★S5 — classified intent mix over the stored cohort keyword samples.
keywords_unclassified is a separate denominator: missing labels are
not folded into a bucket and domains whose classification call failed are
named under domains_not_measured rather than represented as zeros.