Quickstart
From no token to real numbers, in four steps.
Generate a token
In the app, open Settings → AOV MCP and find the Public API access card. Select Generate token.
The full token is shown once. Copy it now — the app keeps only a fingerprint of it and cannot show it again.
⚠️
If you lose it, you rotate rather than recover. Rotating issues a new token and stops the old one immediately, so anything already using it must be updated.
Put it somewhere safe
export AOV_TOKEN="aov_pat_your_token_here"Use a real secret store in production. The token grants read access to your store's data for as long as it lives, and it does not expire on its own.
Make a call
curl -H "Authorization: Bearer $AOV_TOKEN" \
https://aov-post-purchase.firebaseapp.com/public-api/v1/data/offersRead the envelope, not the status code alone
Every reply carries success. Branch on it first, then use data:
{ "success": true, "data": { "total": 12, "currency": "USD", "...": "..." } }A few real calls
Last month's revenue:
curl -H "Authorization: Bearer $AOV_TOKEN" \
"https://aov-post-purchase.firebaseapp.com/public-api/v1/data/analytics/summary?start=2026-07-01&end=2026-07-31"Your five best-earning offers this month:
curl -H "Authorization: Bearer $AOV_TOKEN" \
"https://aov-post-purchase.firebaseapp.com/public-api/v1/data/analytics/top?start=2026-08-01&end=2026-08-26&limit=5"One offer, then what it sells:
curl -H "Authorization: Bearer $AOV_TOKEN" \
https://aov-post-purchase.firebaseapp.com/public-api/v1/data/offer/$OFFER_ID
curl -H "Authorization: Bearer $AOV_TOKEN" \
https://aov-post-purchase.firebaseapp.com/public-api/v1/data/offer/$OFFER_ID/stagesWhich placements have nothing running:
curl -H "Authorization: Bearer $AOV_TOKEN" \
https://aov-post-purchase.firebaseapp.com/public-api/v1/data/analytics/coveragePaging through every offer
/data/offers returns 20 per page. Raise page while hasMore is true:
const all = [];
for (let page = 1; ; page++) {
const {offers, hasMore} = await read('/data/offers', {page});
all.push(...offers);
if (!hasMore) break;
}Do not re-sort or re-filter between pages — the order is decided server-side, and changing it mid-walk produces duplicates and gaps.
What to handle
| Status | When | What to do |
|---|---|---|
401 | Token missing, invalid, or revoked | Stop and re-issue. Retrying will not help |
422 | A parameter is invalid, e.g. a range over 90 days | Fix the request |
429 | Over 60 requests per minute | Wait for Retry-After, then retry |
503 | Your token could not be checked (transient) | Wait for Retry-After, then retry. Do not rotate the token |
500 | Something failed on our side | Retry with backoff |
Details: Errors · Rate limits