Skip to content
TR

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.

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.