Developers

Honest MRR metrics API

Every report in the dashboard is also available as JSON, so you can put your MRR in a spreadsheet, a board deck or your own tooling — and two CSV endpoints let a script feed in revenue and ad spend that no API exposes. The machine-readable description is at /openapi.json (OpenAPI 3.1, with an example response for every report), and /.well-known/api-catalog lists it for tools that look there.

Authentication

Create an API key in the app under Settings → API & sharing. It is shown once and stored only as a hash, so copy it then. Send it on every request:

curl https://honestmrr.com/api/v1/mrr \
  -H "Authorization: Bearer hm_live_…"

Keys are read-only unless you tick “Allow imports (write)” when you create one — the import endpoints refuse read-only keys with a 403. A key belongs to one organization and reads only that organization's data; revoke it from the same page and it stops working at once. A request without a valid key gets a 401 that links back to this page.

Reports

GET /api/v1/<report> returns { "report", "generatedAt", "data" }. Money is in your reporting currency's minor units (cents for USD) unless a field says otherwise, computed with the same rules as the dashboard — they are written out on how we calculate MRR.

  • /api/v1/overview — Headline numbers: MRR, 30-day movements, customers, churn and growth.
  • /api/v1/mrr — The MRR series with each month's new, expansion, contraction, churn and reactivation.
  • /api/v1/churn — Logo churn, gross and net revenue churn, month by month.
  • /api/v1/revenue — Realized revenue — cash collected, net of refunds — month by month.
  • /api/v1/acquisition — Ad spend, new customers, CAC, payback and LTV:CAC (LTV fields are null below Pro).

Imports

For revenue and ad spend without an API, post the platform's CSV export as multipart/form-data with a write-scope key. Files are at most 8 MB; re-importing the same file adds nothing twice.

curl -X POST https://honestmrr.com/api/v1/import/revenue \
  -H "Authorization: Bearer hm_live_…" \
  -F source=youtube -F [email protected]

/api/v1/import/revenue takes source: amazon_associates, youtube, tiktok_creator, instagram_creator, facebook_creator, onlyfans. Imported revenue is realized revenue on its own line — it never enters MRR.

/api/v1/import/ad-spend takes platform: google_ads, facebook_ads, instagram_ads, tiktok_ads, microsoft_ads. Spend feeds CAC and payback.

Limits and errors

Each key may make 60 requests a minute, and each IP address 240; past either, the response is a 429 whose Retry-After header gives the seconds until the one-minute window resets.

These errors come back as JSON, { "error": "…" }: 400 for an import that isn't multipart/form-data or is missing a field, 401 for a missing or revoked key, 403 for a read-only key on an import, 404 for an unknown report, 413 for a file over 8 MB, 422 for a file that couldn't be read as that source's CSV, 429 for the rate limit, and 500 if an import fails on our side — retrying the same file is safe, because imports are idempotent.

Questions

Missing a report you need? Email us and a person answers.