Affiliate API
Read the offer wall, create links and smartlinks, follow conversions and statistics, and set your postbacks through the API, with the key scopes each call needs.
Affiliate endpoints sit under /affiliate and need an account with the publisher role (every publisher account is an affiliate). Paths are relative to https://ulumob.com/api/v1. See Authentication and keys for the header and the scopes.
| Scope | Calls |
|---|---|
read |
Every GET below except statistics |
campaigns |
Creating, changing and archiving links, traffic sources, postbacks, access requests and favorites |
reports |
GET /affiliate/stats |
Offer wall
| Method and path | What it does |
|---|---|
GET /affiliate/offers |
The offers you may see, 40 a page. Filters: q, country, group (tier1, eu, latam…), carrier, connection=cellular|wifi, vertical=adult|mainstream, category, flow, traffic_type, access, payout_min, payout_max, favorites=1; sort=featured|epc|payout|newest. |
GET /affiliate/offers/{id} |
One offer: every event and country payout for you, the hold, requirements and restrictions, similar offers, your access standing. 404 for an offer you may not see. |
POST /affiliate/offers/{id}/access |
Asks to run an offer that needs approval. Body: {"note": "Pop traffic, TR and DE"}. |
POST / DELETE /affiliate/offers/{id}/favorite |
Saves the offer for later, or removes it. |
Each card has payout (the main event's amount for you), standing (open, approved, requested, rejected, none, invite, blocked) and may_run. Read the wall with a read key:
curl "https://ulumob.com/api/v1/affiliate/offers?country=TR&connection=cellular&sort=epc" \
-H "Authorization: Bearer YOUR_KEY" -H "Accept: application/json"
Traffic sources
GET /affiliate/sources lists yours; POST /affiliate/sources adds one: {"name", "type", "description", "urls"}. Types: website, pop_push_network, social, email, messaging, search, incentive, mobile_app, other. A new or edited source waits for review; links need an approved one.
Links and smartlinks
| Method and path | What it does |
|---|---|
GET /affiliate/link-options |
What a link needs: your sources, the network presets with their sub macros, tracking domains, categories and flows. |
GET /affiliate/links?type=custom|smart |
Your links with code and url. |
POST /affiliate/links |
Creates a link. Returns 201 with url. |
PUT /affiliate/links/{id} |
Changes name, source, preset, subs, trafficback, tracking domain, postback, smartlink settings or status (active, paused). |
DELETE /affiliate/links/{id} |
Archives the link; its code stops working, its statistics stay. |
A link to one offer, with a campaigns key:
curl -X POST https://ulumob.com/api/v1/affiliate/links \
-H "Authorization: Bearer YOUR_KEY" -H "Accept: application/json" -H "Content-Type: application/json" \
-d '{"type": "custom", "campaign_id": 1042, "name": "TR pops", "traffic_source_id": 7, "source_preset_id": 2,
"trafficback_url": "https://example.com/tb?r={reason}&s={sub1}"}'
A smartlink: {"type": "smart", "name": "All mainstream", "traffic_source_id": 7, "smart": {"vertical": "mainstream", "categories": ["vpn"], "geos": ["TR", "DE"]}}. Without an approved source the answer is 403 with "code": "source_required"; an offer you may not run is a 422. See Links and formats and Smartlinks.
Conversions and statistics
| Method and path | What it does |
|---|---|
GET /affiliate/conversions |
Your conversions, 50 a page: offer, link, event, status, payout, hold, reason, sub IDs. Filters: status, event, offer_id, link_id, from, to, sub1 to sub5. |
GET /affiliate/conversions/summary |
Pending, approved and rejected counts and amounts, the pending balance, and the days holds end. |
POST /affiliate/conversions/{id}/dispute |
Disputes a rejection once: {"note": "..."} (10 to 1,000 characters). |
GET /affiliate/stats |
Clicks, unique clicks, invalid clicks, trafficback, conversions by status, payout, CR and EPC; group=day|offer|link|geo|reason|sub1…sub5, from, to, link_id, offer_id. Needs reports. |
Postbacks
GET /affiliate/postback returns your default postbacks with the events, macros and tracker templates; PUT /affiliate/postback replaces them: {"postbacks": [{"url": "https://tracker.example/pb?cid={sub1}&p={payout}&s={status}", "events": ["pending", "approved"]}]}. POST /affiliate/postback/test sends one with sample values, GET /affiliate/postback-logs lists every try. See Postbacks.
Every list and error follows the shapes on Rate limits and errors.
Something missing or wrong? Tell us.