Apps
Monetize your app with an offerwall SDK.
Let free users earn the credits, points or premium time your app already sells by completing offers. A native SDK opens the wall, your server holds the key, and signed postbacks credit every reward.
- 3,000+offers to choose from
- Single-usetokens, no key in the app
- 5 SDKsAndroid, iOS and plugins
How do you monetize an app with an offerwall?
You add an offerwall screen where signed-in users complete offers from advertisers, such as trying another app or finishing a survey, and earn your app’s own currency: AI credits, premium days, hints or points. You are paid per completed offer, and a signed postback tells your server when to credit the user. It works best in apps that already have something to earn and users who will not pay. Building a game instead? See offerwalls for games.
How it works for Apps.
From the first click to the reward in your currency, in five steps.
User taps Earn credits
A signed-in user opens your Earn screen, for example from an out-of-credits prompt, and your app asks your server for a session.
Your server gets a token
Your server calls POST /v1/session with your API key and that user's ID. The token works once, for 10 minutes.
The wall opens natively
The SDK opens the wall in a native screen with your currency name, icon and colors. Offers match the user's country and device.
User completes an offer
The user finishes an offer, such as reaching a goal in another app. The advertiser confirms it, sometimes days later.
Your server adds credits
A signed postback reaches your server, which adds the credits. If an offer is reversed, a second postback tells you to take them back.
Why Apps owners add Moonetix.
One pay-per-result affiliate network, built around your currency and your users.
Pays in your own currency
Set the name, icon and rate: AI credits, premium days, hints or points. Users earn what your app already sells, not cash.
No secret ships in the app
Only the App ID lives in your build. Your server keeps the API key and asks for a single-use token each time a user opens the wall.
Native SDK screens
The Android and iOS SDKs, plus the Flutter and React Native packages, open the wall natively with your colors and tell your app when it closes.
Credits only from your server
Every credit and every reversal arrives as a signed server-to-server postback, so a modified app cannot add credits on its own.
Earns from users who never pay
Free users who will not subscribe can fund their own usage with offers. See how to monetize free users.
Reports by offer and sub ID
See clicks, conversions and reversals by country, offer and sub ID, plus a traffic quality report and a Reporting API.
One token, one native screen.
No API key ships in your app. Your server asks Moonetix for a single-use session token, and the SDK opens the offerwall with it.
- User taps EarnSigned in to your app
- Your serverPOST /v1/session with your API key
- Session tokenWorks once, for 10 minutes
- Native screenThe SDK opens the offerwall
<?php
// POST /api/moonetix/session: a fresh token for the signed-in user
$user = current_user();
if (!$user) {
http_response_code(401);
exit;
}
$key = getenv('MOONETIX_API_KEY');
$ch = curl_init('https://api.moonetix.com/v1/session');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['user_id' => (string)$user->id]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $key],
]);
$data = json_decode((string)curl_exec($ch), true);
$code = (int)curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
header('Content-Type: application/json');
if ($code === 201 && !empty($data['token'])) {
echo json_encode(['token' => $data['token']]);
exit;
}
http_response_code($code === 403 ? 403 : 503);
echo json_encode(['error' => 'offerwall_unavailable']);// POST /api/moonetix/session: a fresh token for the signed-in user
app.post('/api/moonetix/session', requireLogin, async (req, res) => {
const r = await fetch('https://api.moonetix.com/v1/session', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.MOONETIX_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ user_id: String(req.user.id) }),
signal: AbortSignal.timeout(10000),
});
const data = await r.json().catch(() => ({}));
if (r.status === 201 && data.token) {
return res.json({ token: data.token });
}
const status = r.status === 403 ? 403 : 503;
res.status(status).json({ error: 'offerwall_unavailable' });
});# POST /api/moonetix/session: a fresh token for the signed-in user
@app.post("/api/moonetix/session")
@login_required
def moonetix_session():
key = os.environ["MOONETIX_API_KEY"]
r = requests.post(
"https://api.moonetix.com/v1/session",
data={"user_id": str(current_user.id)},
headers={"Authorization": f"Bearer {key}"},
timeout=10,
)
data = r.json()
if r.status_code == 201 and data.get("token"):
return {"token": data["token"]}
status = 403 if r.status_code == 403 else 503
return {"error": "offerwall_unavailable"}, status// Once, in your Application class
Moonetix.init(applicationContext, "YOUR_APP_ID")
// When the user taps Earn
Moonetix.open(activity, token)import MoonetixOfferwall
Moonetix.configure(appId: "YOUR_APP_ID")
// When the user taps Earn
Moonetix.open(token: token)import 'package:moonetix_offerwall/moonetix_offerwall.dart';
Moonetix.init('YOUR_APP_ID');
// When the user taps Earn
await Moonetix.open(token);Store rules for rewarded apps.
Apple and Google allow optional rewards inside apps, with hard lines around forced installs, reviews, crypto and kids. Checked against the official pages below.
Do
- Keep the wall optional. Apple’s guideline 3.2.2(x) lets you incentivize actions in your app, but not force users to download other apps to use it.
- Sell credits on iOS only through in-app purchase (3.1.1). Bought credits may not expire, so if earned and bought credits share one balance, let none expire.
- Give your app its own purpose. Google Play bars apps whose main functionality is rewarding installs of other apps, and Apple rejects apps made mainly for ads.
- Put a neutral age screen in front of the wall in a mixed-audience app, and show the wall only to users aged 16 and over.
Do not
- Never reward ratings or reviews, in your app or through any offer. Apple and Google Play both prohibit incentivized reviews.
- Don’t pay crypto for offers in a crypto app on iOS. Guideline 3.1.5(v) bars currency for tasks such as downloading other apps.
- Don’t add the wall to a kids’ app. Google’s Families policy names offerwalls, and Apple’s 5.1.4 bars third-party ads in apps for kids.
- Don’t lock a core feature behind the wall. Users must reach every feature by using your app, with offers only as a faster option.
Sources, checked on November 5, 2026: Apple App Review Guidelines, Google Play: User Ratings, Reviews, and Installs, Google Play Families Policies. Platform rules change, so check them before you launch.
Set it up in four steps.
Apply as a publisher
Apply with your app’s store listing. Every application is reviewed by hand, and once you are approved, every app you add is live right away. Get approved.
Set up your credits currency
Name it after what users spend, such as credits or premium days. Set the icon, units per $1, user split and rounding. The currency calculator helps.
Credit from postbacks, then test
Handle signed postbacks for credits and reversals, send test postbacks from the Integration tab, and test on a normal connection, not a VPN. Checklist.
What could it earn?
Slide to your audience and adjust the assumptions. The rates are an example, not a promise: placement, countries, and devices change every result.
Guides for Apps.
Step-by-step guides from the Moonetix Academy.
What is the best way to add an offerwall to an app?
Pay offers in a currency your app already uses, such as AI credits, premium days or hints, and place the Earn button where users run out. Credit users only from server-side postbacks.
Can I add an offerwall to an Android app?
Yes. The Moonetix Android SDK supports Android 5.0 (API 21) and newer, installs with one Gradle dependency, and adds only the internet permission. See the Kotlin guide.
Does Apple allow offerwalls in iOS apps?
In most cases, if the wall is optional and pays your own in-app currency. Guideline 3.2.2(x) allows incentives for actions in your app but bans forcing downloads or reviews. See offerwall rules for iOS apps.
Do I have to put my API key in the app?
No. Only the App ID, which is not a secret, ships in your build. Your server keeps the API key and requests a single-use token for the signed-in user, which works once, for 10 minutes.
Can users earn AI credits from offers?
Yes. Name your currency credits and price it so the inference cost of the credits stays below what an offer pays you. How to monetize an AI app shows the math.
Does the offerwall need an App Tracking Transparency prompt?
According to the iOS SDK docs, it does not track users across apps or use the advertising identifier. Whether you need ATT depends on every SDK in your app, so check the others too.
How old must users be to use the offerwall?
At least 16, and users under 18 need a parent’s or guardian’s permission. Keep the wall out of apps for children, as offerwalls and COPPA explains.
Which users see offers?
Offers depend on the user’s country and device. Users on VPNs, proxies, Tor or data center networks are blocked from the wall.
Other industries
- GamesMobile, Unity and HTML5 games
- Game serversMinecraft, Rust, Hytale and more
- DiscordServers, economy bots and /earn commands
- TelegramMini Apps, bots, channels, tap games
- CommunitiesForums, member sites and fan communities
- Rewards sitesGPT, cashback, faucet and reward apps
- Web apps & AISaaS, AI tools and freemium web apps
- ExtensionsChrome, Edge, Firefox and Electron apps
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.





