Product
Publishers
Advertisers
Networks
Help
Pause animations

Offer API

Every offer your account can run, in one call.

One request returns each offer, pay per install (CPI) or per action (CPA), with your payout, every step and a tracking link. You choose the order.

  • GET /publisher/offers
  • x-api-key header
  • JSON, no SDK
curl -G "$AFFILIATEOS_API/publisher/offers" \
  -d platform=iOS -d country=US \
  -H "x-api-key: $AFFILIATEOS_KEY"
200 OK Response, trimmed

              {
              
            
              "data": { "offers": [{
              
            
              "id": "aff_3b9e41c07d2a",
              
            
              "name": "Harbor Blocks",
              
            
              "effectivePayoutUsd": 4.2,
              
            
              "isPaidOnInstall": true,
              
            
              "trackingUrl": "/click?off_id=…&sub_id={SUB_ID}",
              
            
              "goals": [
              
            
              { "name": "Install and open",
              
            
              "effectivePayoutUsd": 4.2, "userRewardUsd": 1.5 },
              
            
              … 10 more goals
              
            
              { "name": "Reach level 40",
              
            
              "effectivePayoutUsd": 0, "userRewardUsd": 2.4 }
              
            
              ]
              
            
              }]}
              
            
              }
              
            

Your card, from that row

Harbor Blocks

Tidewater Games · iPhone

$4.20at install

The install pays you. Every step rewards the player.

  1. effectivePayoutUsd Your payout, in US dollars.
  2. isPaidOnInstall True when the install itself pays you.
  3. trackingUrl Put your user's ID where it says {SUB_ID}.
  4. goals All 12 steps on one row, each with the player's reward.

01Worked example

Four listings of one game, one row.

The same game often arrives several times, under different names and prices. You get it once, with every step.

  1. 01 Arrive

    Four listings arrive

    Harbor Blocks for iPhone comes in four times, under four names, at four install prices.

    Incoming listings · iPhone
    • Harbor Blocks - iOS aff_91c0d7e2b4f1 $3.10 at install
    • HARBOR BLOCKS (US) aff_3b9e41c07d2a $4.20 at install
    • Harbor Blocks iOS Multi 30 Days aff_5e72a1c9d0b8 $3.60 at install
    • Harbor Blocks: Puzzle Tiles aff_c4d81f3a6e20 $2.85 at install
  2. 02 Match

    Matched by store ID

    We match listings on the app's store ID, or on the name once tags like “- iOS” are stripped. Send one country and copies for other countries merge too.

    Matched by store ID
    • Harbor Blocks - iOS aff_91c0d7e2b4f1 store ID 6450218840 $3.10 at install
    • HARBOR BLOCKS (US) aff_3b9e41c07d2a store ID 6450218840 $4.20 at install
    • Harbor Blocks iOS Multi 30 Days aff_5e72a1c9d0b8 store ID 6450218840 $3.60 at install
    • Harbor Blocks: Puzzle Tiles aff_c4d81f3a6e20 store ID 6450218840 $2.85 at install

    Same appiPhonePaid at install

  3. 03 Keep

    One copy per pay type stays

    Three copies drop out. We keep the copy with the highest install payout and the best copy paid per step, if there is one: at most two rows per game and platform.

    One per game, platform and pay type
    • Harbor Blocks - iOS aff_91c0d7e2b4f1 store ID 6450218840 $3.10 at install
    • HARBOR BLOCKS (US) aff_3b9e41c07d2a store ID 6450218840 $4.20 at install Kept
    • Harbor Blocks iOS Multi 30 Days aff_5e72a1c9d0b8 store ID 6450218840 $3.60 at install
    • Harbor Blocks: Puzzle Tiles aff_c4d81f3a6e20 store ID 6450218840 $2.85 at install

    If one copy pays at install and another per step, both stay.

  4. 04 Render

    One row, every step

    The row you get carries all 12 steps, each with its payout and the player's reward. You draw the card and choose where it goes.

    Your row
    Harbor Blocks aff_3b9e41c07d2aiPhone · 12 steps $4.20 to you, at install
    1. 01 Install and open $4.20 to you$1.50 player reward
    2. 02 Reach level 5 $0.30 player reward
    3. 03 Reach level 10 $0.40 player reward
    4. 04 Reach level 15 $0.50 player reward
    5. +8 … 8 more, up to level 40 player rewards

    Only the install pays you. Every step carries the player's reward.

Step 1 of 4

02Filters

Filter it to one player's phone.

Send the player's platform, country, US state and OS version, and the list holds only offers that phone can run. Try it on 24 example offers.

Platform
Segment
install: paid at install. popular: earned across AffiliateOS in the last 30 days. An offer must match every segment you tick.
GET /publisher/offers?platform=iOS&country=US

14 of 24 example offers match

  • Harbor Blocks iOS · US, GB, CA +4 install popular $4.20 at install
  • Lantern Run iOS · US, DE, GB +4 install popular $3.10 at install
  • Copper Kitchen iOS · US, CA, BR +1 install $3.80 at install
  • Kettle Kingdom iOS · US, GB, DE +7 install $1.75 at install
  • Moss & Match iOS · US install $2.10 at install

The first 5 are shown. Your app decides the order.

03Availability

Full offers leave the list.

When an offer runs out of cap or budget, the list stops returning it, so nobody taps into a dead end. Cards you saved earlier need a check: send their IDs to the availability call and drop any that come back unavailable.

  • Batch1 to 100 offer IDs per call.
  • How oftenRecheck a card on screen at most once a minute.
  • Already started An offer a player started stays fetchable by ID, so their progress keeps working.
  • Offer alerts Get an email when an offer you run changes its payout or stops running. Each team member sets up their own.
Cards cached in your app
Lantern Run aff_7c21e0b94f3a Available Full
Harbor Blocks aff_3b9e41c07d2a Available

Checked at 2:06 PM. Next check in a minute or more.

Request
curl -G $AFFILIATEOS_API/publisher/offers/availability \
  -d ids=aff_7c21e0b94f3a,aff_3b9e41c07d2a \
  -H "x-api-key: $AFFILIATEOS_KEY"
Response
{
  "status": "success",
  "data": {
    "offers": [
      { "id": "aff_7c21e0b94f3a", "available": false,
        "cap": 0, "capResetsAt": "2026-10-30T04:00:00.000Z" },
      { "id": "aff_3b9e41c07d2a", "available": true,
        "cap": null, "capResetsAt": null }
    ],
    "checkedAt": "2026-10-29T19:06:00.000Z"
  }
}

04Top Offers Feed

Or let us rank it.

Add segment=top to the same call. You get our team's picks plus the offers that converted most in the last 30 days, already in the order to show them.

?segment=top
  1. 01 Kelp Garden $5.10per install
  2. 02 Harbor Blocks $4.20per install
  3. 03 Copper Kitchen $3.80per install

05API keys

Rotate keys without downtime.

Keep up to five keys live. Each one is shown once, when you create it, and new keys don't expire. Owners and admins make them under My Profile → API Keys.

API Keys

My Profile · 3 of 5 keys

New key. Copy it now; it won't be shown again.

pk_••••••••••••••••••••••••3e7d
  • Production server, new pk_…3e7d Just now
  • Production server pk_…a91f
  • Staging pk_…07c2 Sep 14
Illustration of the API Keys card: three keys, one just created and shown once.
  1. 01

    Create the new key

    Name it after where it runs, and copy it then. It won't be shown again.

  2. 02

    Deploy it and check

    Ship it to your servers and confirm a call returns offers.

  3. 03

    Revoke the old key

    It stops working at once, except that the offer list and availability calls may accept it for up to 30 seconds.

06Docs

Docs your coding assistant can read.

The developer docs are public, and so is a Markdown file of the publisher API for your coding assistant, checked against the API on .

Copies the publisher API reference as Markdown, ready to paste into a chat. Or open publisher.md.

Questions

What developers ask first.

Anything else is in the Offer API docs.

Do you tell me where an offer came from?

No. You get our offer ID (aff_…), the brand and the app's store ID. Upstream source fields are left out, and source filters return a 400.

How many offers will I get?

The catalog holds 10,000+ offers: direct offers plus AffiliateOS marketplace offers. Your list holds the ones your account can run, for the platform and country you ask about.

How often does the list change?

Through the day, as offers start, pause and fill up. If you cache cards, check them with the availability call, at most once a minute.

How do game offers pay?

Games paid per install pay you once, at install. Later steps pay you nothing; each still sends you a postback with the player's reward for you to credit. Offers paid per step list what each step pays you. On an account paid per step, the install pays you $0 and the offer lists what each later step pays you.

Is the response paged?

Only if you ask. Send page or per_page and pages hold 50 offers by default, 200 at most. Send neither and you get the whole list in one response.

Do I need an SDK?

No. HTTPS and an API key. The docs have the API host and samples in curl, Node and Python.

Request access, then make the first call.

Publisher sign-up is by request. We reply by email.