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
| Parameter | Required | Description |
|---|---|---|
fields | required | Comma-separated list of benchmark metrics and optional dimensions. Must include at least one metric. Example: fields=bookRate,matchRate,roasClosed |
month | required | Calendar month in YYYY-MM format. The current month returns month to date; future months are rejected |
account | optional | A single account key your credentials can access. Benchmark figures are the same regardless |
accounts | optional | Comma-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 | |
|---|---|
bookRate | matchRate |
payingCustomerRate | customerCancelRate |
avgTicket | avgCostPerLead |
avgCostPerPayingCustomer | avgCostPerBookedCustomer |
roasPotential | roasClosed |
See the metrics reference for each definition. Requesting any other metric returns a 400 naming the supported list.
Supported dimensions
| Dimension | |
|---|---|
attributionCategory | attributionChannel |
customerStatus | normalizedBusinessUnit |
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 }
]
series | Meaning |
|---|---|
benchmark | The industry figure. Weighted by volume, so larger accounts influence it more. It is not the average or the median account |
p10 … p90 | Percentiles across accounts. p90 means 90% of accounts scored at or below this figure |
cohortAccounts | How 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
| Status | Cause |
|---|---|
400 | Missing, 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 |
401 | Missing, incorrect, or revoked API key |
404 | Unknown or inaccessible organization |
429 | Hourly request limit reached. Retry later |
502 | An upstream data service failed or returned an unreadable response |
503 | Benchmark data for the month is still being prepared. Retry shortly |