aov-post-purchase-upsell
🔌 Store API
Quickstart

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/offers

Read 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/stages

Which placements have nothing running:

curl -H "Authorization: Bearer $AOV_TOKEN" \
  https://aov-post-purchase.firebaseapp.com/public-api/v1/data/analytics/coverage

Paging 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

StatusWhenWhat to do
401Token missing, invalid, or revokedStop and re-issue. Retrying will not help
422A parameter is invalid, e.g. a range over 90 daysFix the request
429Over 60 requests per minuteWait for Retry-After, then retry
503Your token could not be checked (transient)Wait for Retry-After, then retry. Do not rotate the token
500Something failed on our sideRetry with backoff

Details: Errors · Rate limits

Related

Product
Install AppWebsiteAvada Apps
Resources
DocumentationFAQPrivacy Policy
Company
Avada GroupContact
© 2026 Avada Group. All rights reserved.