Product
Publishers
Advertisers
Networks
Help
Pause animations
Browse help topics
How-to PublisherNetwork

Pull conversions instead (Reporting API)

Updated

View as Markdown

Call GET /publisher/conversions with your publisher API key. It returns the conversions on your account in the window you ask for (the last 90 days if you send no dates), newest first, under the same action_id your postbacks carry, so you can reconcile against what your server received or catch up after downtime.

See also: Signed postbacks

On this page

Postbacks stay the realtime path: a pull only shows what happened before you called. Use it next to postbacks, not as the only way you credit users, unless a few minutes’ delay is fine for you.

Before you start

  • A publisher API key. An owner or admin creates it under My Profile, then API Keys, with Generate Key. It starts with pk_ and is shown once.
  • Networks: network keys read offers only, so there is no pull endpoint for them today. Use postbacks, and Download CSV under Reporting, then Offer Performance.

Steps

  1. Call GET /publisher/conversions

    Send the key in the x-api-key header. from and to are ISO-8601 timestamps; a date alone, such as 2026-10-29, means midnight UTC at the start of that day. Leave both out and you get the last 90 days.

    Shell
    curl -G "https://affiliateos.xyz/publisher/conversions" \
      -d from=2026-10-29T00:00:00Z \
      -d to=2026-10-30T00:00:00Z \
      -d limit=500 -d page=1 \
      -H "x-api-key: $PEBBLE_PUBLISHER_KEY"

    Example response, one row, for Pebble Rewards:

    JSON
    {
      "data": [
        {
          "actionId": "act_5Kq2Wc",
          "offerId": "aff_7c2e91b04d3a",
          "offerName": "Harbor Blocks",
          "conversionName": "Install",
          "subId": "u_48213",
          "status": "completed",
          "partnerPayoutUsd": 4.2,
          "userPayoutUsd": 1.5,
          "reversalReason": null,
          "country": "US",
          "createdAt": { "_seconds": 1793300980, "_nanoseconds": 0 },
          "clicktimestamp": "2026-10-29T19:06:00Z",
          "reversedAt": null
        }
      ],
      "pagination": { "page": 1, "limit": 500, "total": 1 }
    }

    partnerPayoutUsd is what we pay you for the step. userPayoutUsd is the player’s reward. Add offerId to the query to read one offer.

  2. Page through the window

    limit takes 1 to 500 (50 if you leave it out) and page starts at 1. Keep asking for the next page until page times limit reaches pagination.total.

  3. Match each row on actionId and status

    actionId is the same value as the postback’s action_id. Store rows under actionId and status together, as you do for postbacks:

    • completed: the conversion. Credit it if your server never got its postback.
    • reversed: taken back. reversalReason says why when we have a reason, and reversedAt says when the reversal came in. createdAt stays the time of the conversion.
    • rejected: a user our traffic checks blocked. It pays $0 and sends no postback. Held or rejected traffic explains it.

    On the Hosted Offerwall, subId is the uid you opened the wall with. For conversions first sent before 10 September 2026, the postback’s action_id can be longer than the report’s actionId: match those on the end of the ID.

  4. Check it worked

    Send your own test user through one offer, wait for the postback, then pull the same hour. The row shows your test user’s subId, and its actionId equals the action_id your server logged.

Other reads with the same key

EndpointWhat it returns
GET /publisher/performance/dailyConversions and payout per UTC day. from and to are dates (2026-10-01); the last 90 days by default. status=all also counts reversed rows as conversions; the money is the same.
GET /publisher/dashboard-reportThe dashboard’s numbers, grouped by day, week, month, quarter, year, offer, platform or country with groupBy, between startDate and endDate.
GET /publisher/statsLifetime clicks, conversions, events and earnings for each offer.
GET /publisher/traffic-qualityUsers whose conversions are rejected right now, with the reason and when it expires.

Payout in every report is net of reversals, and every reversal is dated on its conversion’s day. Why our numbers and yours differ covers what that does to a closed week.

What changes when you pull instead of receiving postbacks

  • Nothing is pushed. You see a conversion on your next call, not when it happens.
  • No signature to check. Your key proves who you are. Keep it on your server.
  • No secret needed to pull. Without a postback secret, we send no postbacks, but every conversion still counts and still shows here.
  • Some conversions wait. A conversion waiting for our review doesn’t appear until it’s approved.
API key. A secret that identifies your account to our API. Publisher keys start with pk_, network and advertiser keys with ak_. Each is shown once.What is an API key?
Reversal. A conversion taken back after it was reported, by the advertiser or after our traffic checks. We take back its payout and send the publisher a reversal postback.What is a reversal?
Postback secret. A key starting with ps_ that signs every postback we send you, so your server can check it came from us. Shown once.What is a postback secret?

Support

Still stuck? Write to us.

One address for every question: hello@affiliateos.ai. Put the details from this list in your first message so we can find the click or conversion without asking you for them again.

Put these in your message

  1. 01The email you sign in with
  2. 02Your role: publisher, advertiser or network
  3. 03The offer ID
  4. 04The click ID or action_id
  5. 05The time it happened, with your time zone
  6. 06What you expected to happen

Looking for a reward in an app? Ask that app's support. It credits your reward, so only it can see your balance.

Search help