Skip to main content

Benchmarks

GET https://searchlight.digital/api/<organization>/benchmarks

Returns anonymized industry benchmarks for a calendar month: the industry figure for each metric you request, plus the range accounts fall into. Request your own numbers from events and compare against them.

This endpoint never returns your own data, and never identifies another account.

Query Parameters

ParameterRequiredDescription
fieldsrequiredComma-separated list of benchmark metrics and optional dimensions. Must include at least one metric. Example: fields=bookRate,matchRate,roasClosed
monthrequiredCalendar month in YYYY-MM format. The current month returns month to date; future months are rejected
accountoptionalA single account key your credentials can access. Benchmark figures are the same regardless
accountsoptionalComma-separated list of account keys, same behavior as account

The four supported dimensions can also be used as filters to narrow the benchmark, for example normalizedBusinessUnit=HVAC, including the filter operators. No other field can filter this endpoint.

interval is not supported. Request one month per call.

Supported metrics

Benchmarks cover the rate, cost-per and ROAS metrics, which compare meaningfully between accounts of different sizes. Totals such as spend and customers are not benchmarked.

Metric
bookRatematchRate
payingCustomerRatecustomerCancelRate
avgTicketavgCostPerLead
avgCostPerPayingCustomeravgCostPerBookedCustomer
roasPotentialroasClosed

See the metrics reference for each definition. Requesting any other metric returns a 400 naming the supported list.

Supported dimensions

Dimension
attributionCategoryattributionChannel
customerStatusnormalizedBusinessUnit

Including a dimension in fields returns a separate set of benchmark rows for each of its values. See the dimensions reference for the values each one takes.

Response

A JSON array (gzip-compressed, see responses). Each row carries a series naming what it represents, the number of accounts behind it, and every metric you requested:

[
{ "series": "benchmark", "cohortAccounts": 1009, "bookRate": 0.4100, "matchRate": 0.3794, "roasClosed": 13.45 },
{ "series": "p10", "cohortAccounts": 1009, "bookRate": 0.2083, "matchRate": 0.2031, "roasClosed": 4.21 },
{ "series": "p25", "cohortAccounts": 1009, "bookRate": 0.2969, "matchRate": 0.2804, "roasClosed": 8.30 },
{ "series": "p50", "cohortAccounts": 1009, "bookRate": 0.3909, "matchRate": 0.3631, "roasClosed": 14.02 },
{ "series": "p75", "cohortAccounts": 1009, "bookRate": 0.4689, "matchRate": 0.4415, "roasClosed": 24.39 },
{ "series": "p90", "cohortAccounts": 1009, "bookRate": 0.5409, "matchRate": 0.5138, "roasClosed": 37.94 }
]
seriesMeaning
benchmarkThe industry figure. Weighted by volume, so larger accounts influence it more. It is not the average or the median account
p10p90Percentiles across accounts. p90 means 90% of accounts scored at or below this figure
cohortAccountsHow many accounts the row is based on

Read the percentiles in the direction that suits the metric: for bookRate or roasClosed, higher is better, so p90 marks the strong performers; for avgCostPerPayingCustomer or customerCancelRate, lower is better, so p10 does.

When dimensions are requested, every row also carries the dimension values, and each value gets its own cohortAccounts:

[
{ "series": "benchmark", "cohortAccounts": 274, "normalizedBusinessUnit": "Electrical", "bookRate": 0.9267 },
{ "series": "p50", "cohortAccounts": 274, "normalizedBusinessUnit": "Electrical", "bookRate": 0.9429 }
]

Anonymity

Accounts are never named or identified. Low-volume activity and small samples are withheld, so a narrow request can return less than you expect: a segment with too few accounts behind it is omitted, and a request that narrows too far returns an empty array [] with status 200. Broaden it for a larger sample.

Availability

The first request for a month may return 503 while its benchmark data is prepared:

{ "error": "Benchmark data for this period is still being gathered. Try again in a few minutes." }

Retry and it will complete. There is nothing to fix in the request.

Errors

StatusCause
400Missing, invalid, or future month, missing fields, fields with no metric, a metric that can't be benchmarked, an unsupported dimension or filter, or interval passed
401Missing, incorrect, or revoked API key
404Unknown or inaccessible organization
429Hourly request limit reached. Retry later
502An upstream data service failed or returned an unreadable response
503Benchmark data for the month is still being prepared. Retry shortly