How It Works
- A user taps an EarnOS offer link — we generate a click ID and pass it to your platform via your tracking URL template (e.g.
sub1,custom_1,aff_sub, etc.) - The user completes an action on your platform (install, purchase, reaches a level, etc.)
- Your server sends a postback to your dedicated EarnOS callback endpoint with the click ID and event details
- EarnOS validates the postback, matches it to the user, and processes the reward
Your Callback Endpoint
Each provider receives a dedicated endpoint:slug is assigned during onboarding (e.g. ayet, affise, tune). Both GET and POST methods are accepted.
The endpoint returns 200 OK immediately — processing happens asynchronously.
Parameters
Parameters can be sent as query string (GET) or JSON body (POST). The exact parameter names depend on your platform’s adapter — we support aliases for all major networks.Required
The EarnOS click ID provided to you via the tracking URL. Depending on your platform this may be passed as
click_id, custom_1, sub1, aff_sub, clickid, or external_identifier.The event type, e.g.
install, tutorial_complete, level_achieved_10, purchase. Must match the event names configured for your campaign in EarnOS.Your unique transaction/conversion ID for this event. Used for deduplication — sending the same
transaction_id twice will be treated as a duplicate. Aliases: event_id, conversion_id, action_id, tid.Optional
Payout amount, e.g.
"2.50". Aliases: payout_usd, payout, amount, sum, currency_amount.ISO currency code. Defaults to
USD when payout_usd is used.When the event occurred. Accepts ISO 8601, unix timestamp (seconds or milliseconds). Aliases:
callback_ts, datetime, ts, timestamp.EarnOS launch tracking ID (provided in your tracking URL template). Aliases:
custom_2, launchId, aff_sub2, sub2.EarnOS launch identity (provided in your tracking URL template). Aliases:
custom_3, launchIdentity, aff_sub3, sub3.Your internal offer/campaign identifier.
Conversion status. Use
is_chargeback=1 or status=reversed to report chargebacks/reversals.Authentication
Authentication is configured per-provider during onboarding. We support multiple verification methods to match your platform’s capabilities.HMAC-SHA256 Query Signature (Recommended)
Sign the query string using HMAC-SHA256 with your shared secret. The signature can be sent as a header or query parameter depending on your configuration. Signature computation (sorted query):API Key
Include your API key as a header or query parameter:HMAC-SHA256 Body Signature
For POST requests with JSON bodies:IP Allowlist
Callbacks are only accepted from your registered IP addresses. No signature required.Other Methods
We also support Timestamped Token, Affise S2S, and Signed Redirect (including Dynata-specific) verification. Contact your partner manager for configuration details.Examples
GET — Install Event (Query String)
POST — Purchase Event (JSON Body)
Multiple Events (Same Click)
A single click can have multiple events — common for milestone-based offers. Each event needs a uniquetransaction_id:
Response
All requests return 200 OK immediately. Processing is asynchronous.transaction_id) are silently deduplicated — you will still receive a 200 response.
Error Codes
| HTTP Code | Error | Meaning | Action |
|---|---|---|---|
| 400 | INVALID_CLICK_ID | Click ID not found or expired | Do not retry |
| 400 | CLICK_PARTNER_MISMATCH | Click belongs to a different provider | Verify click source |
| 400 | EVENT_NOT_ALLOWED | Event name not configured for campaign | Contact EarnOS |
| 401 | SIGNATURE_REQUIRED | No signature provided | Add authentication |
| 401 | INVALID_SIGNATURE | Signature verification failed | Check secret key |
| 401 | TIMESTAMP_EXPIRED | Timestamp outside 5-minute window | Sync server clock |
| 404 | PROVIDER_NOT_FOUND | Unknown provider slug | Verify endpoint URL |
| 503 | SERVICE_UNAVAILABLE | Temporary error | Retry with backoff |
Retry Logic
- 200: Accepted — do not retry
- 400: Client error — do not retry (fix the request)
- 401: Auth error — do not retry (fix credentials)
- 503: Server error — retry with exponential backoff
Tracking URL Parameters
During onboarding, EarnOS configures your tracking URL template with the following values in your platform’s sub-parameter slots:| EarnOS Value | Purpose | Common Slot Names |
|---|---|---|
click_id | Links the postback to the user | sub1, custom_1, aff_sub, clickid |
launch_id | Tracks the app launch session | sub2, custom_2, aff_sub2 |
launch_identity | Provider-specific launch identity | sub3, custom_3, aff_sub3 |
click_id value so we can attribute the conversion.
Event Names
Event names are configured per-campaign during onboarding. Common examples:| Event | Description |
|---|---|
install | App installed / account created |
tutorial_complete | Completed onboarding tutorial |
level_achieved_10 | Reached level 10 |
level_achieved_25 | Reached level 25 |
purchase | Made an in-app purchase |
signup | Completed registration |
subscription | Started a subscription |
Testing
Verification Checklist
- Verify click_id capture: Ensure your tracking template correctly captures the EarnOS click ID
- Send test postback: Use a real click_id from a test session
- Check response: Confirm you receive
200 OK - Verify in EarnOS: Confirm the conversion appears in the EarnOS dashboard
- Test duplicate handling: Send the same postback again — it should be silently deduplicated
- Test all event types: Send each configured event name to verify the full flow
FAQ
Q: What’s the attribution window? A: 7 days by default. Postbacks for clicks older than 7 days will be rejected. Q: What happens if I send a duplicate? A: Duplicates are silently deduplicated based ontransaction_id. You’ll still receive a 200 response.
Q: Can I send multiple events for the same click?
A: Yes. Each event needs a unique transaction_id. This is standard for milestone-based campaigns (e.g. install, then tutorial, then level 10).
Q: How quickly are rewards processed?
A: Postbacks are processed within seconds. Reward payout timing depends on the campaign configuration.
Q: Do you support chargebacks/reversals?
A: Yes. Send a postback with is_chargeback=1 or status=reversed using the same click_id. This must be enabled for your account.
Support
- Integration issues: Contact your EarnOS partner manager
- Technical questions: support@earnos.io