API v1 · Updated March 2026

Benchmark Data API

Pull Benchmarketing's benchmark dataset into your warehouse, BI tool, or product. Stable metric definitions, additive-only changes, JSON or CSV.

Authentication

Create a key in Settings → API Access (any workspace, free tier included) and pass it as a bearer token. Keys can be revoked at any time; the endpoint is rate-limited to 120 requests/minute.

curl -H "Authorization: Bearer bmk_live_..." \ "https://www.benchmarketing.org/api/v1-benchmarks?metric=cpc&platform=google_ads&industry=ecommerce" # CSV export curl -H "Authorization: Bearer bmk_live_..." \ "https://www.benchmarketing.org/api/v1-benchmarks?metric=cpa&format=csv" -o benchmarks.csv

Query parameters: metric, platform, industry, geographyId, period, limit (max 2000), format=csv. All optional; omit to page through everything.

Quickstart in your stack

The endpoint is plain REST, so any HTTP client works. No SDK to install — these call the exact same URL documented above.

Python

import requests r = requests.get( "https://www.benchmarketing.org/api/v1-benchmarks", params={"metric": "cpa", "platform": "google_ads", "industry": "ecommerce"}, headers={"Authorization": "Bearer bmk_live_..."}, ) data = r.json()

Node.js

const res = await fetch( "https://www.benchmarketing.org/api/v1-benchmarks" + "?metric=cpa&platform=google_ads&industry=ecommerce", { headers: { Authorization: "Bearer bmk_live_..." } } ); const data = await res.json();

For spreadsheets or BI tools without a code step, use the format=csv query parameter and import the URL directly into Google Sheets (IMPORTDATA) or a Looker Studio file-based connector.

Response fields (stable contract)

metric_idStable metric identifier (see the definitions table below). Never renamed.
platform_idChannel platform, e.g. google_ads, meta_ads, linkedin_ads, tiktok_ads. Null = cross-platform.
channel_family_idChannel family grouping, e.g. paid-search, paid-social, email-marketing.
industry_idIndustry slug, e.g. ecommerce, saas, healthcare. Null = cross-industry.
business_model_idBusiness model slug (b2b, b2c-ecommerce, …). Null = all models.
device_typedesktop | mobile | tablet. Null = all devices.
geography_level / geography_idGeographic scope (country, us-dma) and identifier. Null = global.
period_granularityAggregation window of the row. Default all-time.
median_value / average_valueCentral values for the cell.
p25_value / p75_valuePercentile band bounds — read them with the Benchmarketing 4-Band Method.
unitDisplay unit: %, $, x, or empty for counts.
sample_sizeReserved. Currently null on every row — not yet recorded upstream.
confidence_levelProvenance of the value. "medium": a published or curated figure, named in data_source. "low": a Benchmarketing estimate, for direction rather than precision. On geographic rows: the market’s coverage level (high, medium or low).
data_sourceNamed source the row traces to.

Versioning promise: fields are never renamed or removed within v1; new fields and new metric/platform identifiers may be added. Breaking changes would ship as /api/v2 with a deprecation window.

Stable metric definitions

Every metric_id the API can return, with its formula and unit. These identifiers are permanent.

metric_idNameFormulaUnit
roasReturn on Ad Spend (ROAS)Revenue ÷ Ad Spendmultiplier
poasProfit on Ad Spend (POAS)Gross Profit ÷ Ad Spendmultiplier
merMarketing Efficiency Ratio (MER)Total Revenue ÷ Total Marketing Spendmultiplier
cpcCost Per Click (CPC)Total Ad Spend ÷ Total Clicksusd
cpmCost Per Thousand Impressions (CPM)(Total Ad Spend ÷ Total Impressions) × 1,000usd-per-thousand
cpaCost Per Acquisition (CPA)Total Ad Spend ÷ Total Conversionsusd
cplCost Per Lead (CPL)Total Ad Spend ÷ Total Leadsusd
cpvCost Per View (CPV)Total Ad Spend ÷ Total Video Viewsusd
cacCustomer Acquisition Cost (CAC)(Total Sales + Marketing Spend) ÷ New Customers Acquiredusd
ctrClick-Through Rate (CTR)Clicks ÷ Impressions × 100percentage
organic-ctrOrganic Search CTR (Organic CTR)Organic Clicks ÷ Organic Impressions × 100percentage
impression-shareImpression Share (IS)Impressions Received ÷ Total Eligible Impressions × 100percentage
cvrConversion Rate (CVR)Conversions ÷ Clicks (or Sessions) × 100percentage
lp-cvrLanding Page Conversion Rate (LP CVR)Landing Page Conversions ÷ Landing Page Sessions × 100percentage
email-cvrEmail Conversion Rate (Email CVR)Email Conversions ÷ Emails Delivered × 100percentage
email-open-rateEmail Open Rate (Open Rate)Unique Opens ÷ Emails Delivered × 100percentage
email-ctrEmail Click-Through Rate (Email CTR)Unique Clicks ÷ Emails Delivered × 100percentage
bounce-rateBounce Rate (Bounce)Single-page Sessions ÷ Total Sessions × 100percentage
engagement-rateSocial Engagement Rate (Eng. Rate)Total Interactions ÷ Reach (or Followers) × 100percentage
vtrVideo Through Rate (VTR)Complete Views ÷ Total Video Impressions × 100percentage
ltvCustomer Lifetime Value (LTV)Avg. Order Value × Purchase Frequency × Customer Lifespanusd
churn-rateCustomer Churn Rate (Churn)Customers Lost in Period ÷ Customers at Start of Period × 100percentage
email-list-growthEmail List Growth Rate (List Growth)(New Subscribers − Unsubscribes − Spam/Bounce) ÷ Total List Size × 100percentage
reach-rateOrganic Reach Rate (Reach Rate)Post Reach ÷ Total Followers × 100percentage
quality-scoreQuality Score (QS)Composite of: Expected CTR + Ad Relevance + Landing Page Experienceinteger
mql-to-sqlMQL to SQL Rate (MQL→SQL)SQLs Created ÷ MQLs Submitted × 100percentage
sql-to-closeSQL to Close Rate (Win Rate)Closed Won Deals ÷ SQLs Created × 100percentage

Data freshness & provenance

Every value change to the underlying dataset is recorded on the public benchmark change log — what moved, when, and why. Every row carries a named data_source you can trace it back to. confidence_level says whether a value is a published figure or our estimate; sample_size is reserved and not yet recorded, so do not weight by it. Methodology: how we source and read benchmark data.