Offers API. Your design, our offers.

Get the offers for each user as JSON, with images, steps, and rewards already in your currency, and show them in your own cards, next to your own content. Rewards arrive by postback, the same as with the offerwall.

  • JSONREST over HTTPS
  • 600Requests per minute
  • OpenAPISpec included
Offers APIREST, JSON
Terminal
curl -G "https://api.moonetix.com/v1/offers" \
  -d user_id=user_1234 -d country=US -d device=android \
  -H "Authorization: Bearer $MOONETIX_API_KEY"

Go live in three steps.

Copy the code, replace the placeholders with the values from your dashboard under Apps, your app, Integration, and test before you launch.

  1. Request the offers for one user

    Call the API from your server with your app’s API key, the user ID, the country the user is in, and their device or user agent. The list leaves out offers the user already completed or cannot do again yet.

    Terminal
    curl -G "https://api.moonetix.com/v1/offers" \
      -d user_id=user_1234 -d country=US -d device=android \
      -H "Authorization: Bearer $MOONETIX_API_KEY"
  2. Show them in your own design

    Each offer comes with its title, image, steps, and the reward in your currency. Render them however you like, and send the user to the offer’s start_url when they pick one. The offer page opens on Moonetix and takes them to the advertiser from there.

    JSON
    {
      "ok": true,
      "currency": "Coins",
      "offers": [
        {
          "id": 58,
          "title": "Nova Quest: reach level 10",
          "reward": 975,
          "payout_usd": 1.5,
          "start_url": "https://wall.moonetix.com/..."
        }
      ]
    }
  3. Credit rewards with the postback

    Every reward reaches your server as a signed postback. Check the hash, add the reward once per transaction ID, and take it back if a later postback reverses it. Failed postbacks are retried up to 5 times.

    Postback macros and retries

    Dashboard, Postback tab
    https://yoursite.com/postback?user={user_id}&tx={transaction_id}&status={status}&reward={reward}&hash={hash}
GET /v1/offers
{
  "title": "Nova Quest: reach level 10",
  "goals": [
    { "name": "Create an account", "reward": 325 },
    { "name": "Reach level 10", "reward": 650 }
  ],
  "reward": 975,
  "start_url": "https://wall.moonetix.com/..."
}
Your design
Nova QuestReach level 10
  1. Create an account+325
  2. Reach level 10+650
Total975 CoinsStart offer

From JSON to your design

Each offer arrives ready to render, with its steps and rewards already in your currency.

What the API gives you

  • Offers per user

    Offers are matched to the country and device you send, and the ones a user already finished are left out.

  • Rewards in your currency

    Every reward is already calculated with your conversion rate, user split, rounding, and any running bonus.

  • Steps and images

    Multi-step offers list every step with its own reward, so you can show exactly what pays.

  • Sub IDs

    Send up to five of your own values. They are added to every start_url and come back in the postback.

  • Hidden offers stay hidden

    Offers you hide on the Offers page are left out of the API too, so it matches your offerwall.

  • OpenAPI spec

    A machine-readable openapi.json describes every field, ready for code generators and AI coding agents.

Test it, then launch.

Everything you need to check before real users see your offerwall, with the tools built into your dashboard.

  1. Open as a test user

    In Integration status on the Integration tab, open your offerwall as the user owner-test. Test visits are not counted as users.

  2. Call the API with curl

    Request the list for a test user ID and a country where offers run, and open one start_url in a browser.

  3. Send a test postback

    Choose the user, status, and payout, and see exactly what your server answered, with the response code and time. Test transaction IDs start with test_.

  4. Test from a normal connection

    VPNs, proxies, Tor, and cloud networks are blocked, so test on home Wi-Fi or mobile data, in a country where offers run.

Launch checklist

0 of 10 ready

Common errors, fixed fast.

What you might see while you integrate the Offers API, what causes it, and the fix.

  • 400 invalid_country

    A parameter is missing or wrong: invalid_user_id, invalid_country, or invalid_device.

    FixFix the parameter named in the error code.

  • 401 invalid_api_key

    The key is missing, wrong, or was replaced.

    FixSend it in the Authorization header as Bearer, and copy it again from the Integration tab.

  • 403 app_not_live

    The app is paused, or your account is not approved or active.

    FixCheck your notifications. With user_blocked, do not show that user offers.

  • 429 rate_limited

    More than 600 requests in a minute for this app.

    FixWait for the Retry-After seconds, and cache each user’s list for 1 to 5 minutes.

  • Empty offers list

    This is a normal answer: nothing is available for that user right now.

    FixShow a friendly empty state, and check the country and device you send.

  • VPN detected on start_url

    The user is on a VPN, a proxy, or a cloud network when the offer page opens.

    FixAsk the user to turn it off. API requests from your server are not checked.

  • Postback log shows 403 or 404

    Your script rejected the postback, or the URL is wrong.

    FixOpen the URL from the log in a browser and check your hash code.

  • Postback log shows a timeout

    Your script takes longer than 6 seconds to answer.

    FixAnswer with 200 first, and run slow work in the background.

  • Postback log shows 301 or 302

    Your URL redirects, for example from http to https.

    FixUse the final URL. Postbacks do not follow redirects.

At a glance

Endpoint
GET https://api.moonetix.com/v1/offers
Authentication
Bearer API key, one per app, server side only
Required parameters
user_id, country, and device or ua
Rate limit
Up to 600 requests per minute for each app
Format
JSON, with an OpenAPI description
Price
Free for approved publishers

Other integrations

Offers API questions

What developers ask before they add the Offers API.

Stuck on something? Contact us

When should I use the Offers API instead of the offerwall?

Use the offerwall link to go live fastest. Use the Offers API when you want offers inside your own site or app, in your own design, for example next to offers from other sources or in your own reward store.

Can I call the Offers API from a browser or a mobile app?

No. Call it from your server only, because the request carries your API key. If the key ever leaks, create a new one in the Integration tab and the old one stops working right away.

Which country should I send?

The country the user is really in, as a two-letter code such as US. Offers and rewards depend on it, and the country and device are checked again when the user starts an offer.

Are rewards different from the offerwall?

No. The API returns the same offers as your offerwall, with the same rewards, and every completed step reaches your server through the same signed postback.

Is there a rate limit?

Yes, up to 600 requests per minute for each app. Cache the list for a short time per user if you show it often.

Does the same key work for anything else?

Yes. The API key of an app also works for the Reporting API and for mobile SDK sessions.

Turn your traffic into earnings.

Create a free publisher account and earn from every offer your users complete on your website, app, game, or community.

Worldwide targeting