Skip to content

Domain.benchmark

Measure a domain beside its rivals, one row each: authority, estimated traffic, ranking terms, referring domains and monthly search ad budget.

Price
0.75¢ a domain
Success rate
100% of 12,396 calls
Freshness
Fresh for 30 days
Emits
Domain.benchmarked
Capability
Market data
POST https://api.sb/{your-domain}/domains/benchmark

Options and prices

You getInput that selects itPriceSuccess rate
Authority, page authority and spam score{"measures":["authority"]}About 0.3¢ a domain100% of 12,396 calls
Estimated traffic and ranking terms{"measures":["traffic","keywords"]}About 0.1¢ a domain99.2% of 25,412 calls
Referring domains and backlink totals{"measures":["links"]}About 0.25¢ a domain100% of 10,952 calls
Monthly search ad budget{"measures":["adBudget"]}About 0.1¢ a domain99.2% of 25,412 calls

Inputs

NameTypeDefaultMeaning
hostnameHostnameRequiredThe domain to measure: yours or a rival’s.
competitorsHostname[]the top 3 from Domain.findCompetitors``Up to 999 domains measured beside it, one row each.
measures('authority' | 'traffic' | 'keywords' | 'links' | 'adBudget')[]all fiveWhat to measure. Each measure is its own job with its own price.
localestringyour home MarketThe market and language, such as en-US.
maxAgestring'30d'A stored reading younger than this returns at $0 instead of reading again.
maxCostnumber0.50The most this call may spend, in USD. Over it, the call is refused before it spends, or stops early with what it has.

Outputs

FieldTypeUnitWhat null means
rowsDomain[]None.Never null: one row per hostname, hostname first.
rows[].hostnameHostnameNone.Never null.
rows[].authoritynumber | null0 to 100, one scale across sourcesUnknown: too new or too small to score.
rows[].pageAuthoritynumber | null0 to 100, the home pageUnknown.
rows[].spamScorenumber | null0 to 100Unknown.
rows[].trafficnumber | nullorganic visits a month, estimatedToo little search traffic to estimate. Never zero visits.
rows[].keywordsnumber | nullterms ranking in the top 100Unknown.
rows[].referringDomainsnumber | nulldomains linking to itUnknown.
rows[].backlinksnumber | nulllinksUnknown.
rows[].adBudgetnumber | nullUSD a month on search ads, estimatedUnknown. 0 means no search ads were seen.
rows[]ObservedNone.Each row also carries observedAt, method and locale.
costCostUSDNever null. In try mode usd is 0 and maxUsd is what the call would have cost.

Read the result

FieldValueWhat it meansWhat to do
referringDomainsYours, against 10, 25 and 50The targets for week 4, week 12 and month 6. They raise your difficulty ceiling from about 10 to about 20, then about 35.Read it weekly; under 10 at week 4, put the founder’s minutes into listings and the link gap, not new pages. (our planning number, tied to the referring-domain scale)
referringDomainsA rival’s, far above yoursThe terms they rank for are mostly above your ceiling for now.Target terms at or under your ceiling, and run Domain.findLinks with gap to find where their links came from. (the winnability rule in the search playbook)
trafficnull for your domainToo little search traffic to estimate yet: unknown, not zero.Read your own clicks from Search Console instead; it is free and exact. (the contract every data call keeps)
adBudgetOver $0 for a rivalThey pay for search clicks, so some terms convert for them.List the terms with Keyword.find in rival-paid mode, then weigh each against your break-even. (the paid search playbook)
authorityMoves you cannot explainAuthority is a model of links, recomputed monthly, and two sources disagree.Steer by referring domains to your target pages; report authority, never chase it. (our planning number)

Effects

Action class

None: no approval rule names it, so it runs within its seat’s Permissions and Limits

Modes
  • try: Runs the read and returns real rows; nothing is saved and nothing is billed.
  • send: Returns a pending Action at once; its Event carries the rows when the read finishes.
  • do: Waits for the read and returns the rows, billed per result.
Idempotency

The same Idempotency-Key with the same input replays the first answer at $0; with other input it returns 409.

Saved or shared

Records each competitor as an observed relationship, never as a Domain you hold. Readings are shared across startups for 30 days.

Emits

Domain.benchmarked with { rows, hostname, competitors }

Performed by

Analyst

Price

About 0.75¢ a domain. Free: a reading younger than maxAge. maxCost defaults to 50¢. Your domain and 3 rivals, every month for 6 months: 24 × 0.75¢ a domain is about 18¢.

Reliability

The first route succeeds 100% of 12,396 calls. If it fails, a second route answers at 100% of 1,948 calls, and you pay for one.

Freshness

A reading younger than 30 days returns at $0. Readings are shared across startups for the same subject and locale.

Batch and pages

Up to 1,000 domains a call. It answers in one response.

Rate

The shared rate rules: 10 calls a second per key, and an array input counts as one call.

Refuses when

This call has no refusals of its own. Every data call can also meet the shared data-call refusals: filter-unsupported, input-missing, limit-exceeded, max-cost, rate-limited, sources-busy, venue-unsupported.

When it waits

Returns in one response; nothing waits.

Example

Text
How does leaseline.app compare with rentrival.example on authority,
traffic and links? Spend up to 5¢.

To retry, send the same Idempotency-Key: the retry returns the first answer for $0. A new key reads again.

Test values, and watching it

A sk_test_ key answers these the same way every time, at $0 (every test value).

Test valueAlways returnsWhat it is for
maxCost: 0.0001Refuses with max-costAny priced call with a maxCost of 0.0001 is refused before it spends: the price is above the cap.
rate-limited.testRefuses with rate-limitedAny call naming this hostname answers 429 with Retry-After, so your retry logic runs.
sources-busy.testRefuses with sources-busyAny call naming this hostname answers 503 as if every route were busy, and nothing is spent.

Watch it on a schedule: a Monitor runs this call and records an Event only when the reading changes.

TypeScript
await $.Monitor.create({
  verb: 'Domain.benchmark',
  input: { hostname: 'leaseline.app', measures: ['links'] },
  change: 'link-gained',
  every: '1w',
})

Used by