API Reference

Stats & leads

Clicks are recorded server-side with per-click tokens, ready for conversion postbacks from your affiliate networks. Leads from on-site forms land here too.

Click analytics

Every outbound click is recorded server-side with its own token — which is exactly what affiliate networks send back in conversion postbacks, so you can attribute revenue to the click, the offer and the page.

MethodEndpointDescription
GET/stats/overview?site=…&days=30Totals: clicks, unique visitors, top offers
GET/stats/offers?site=…&days=30Per-offer click counts — your EPC ranking input
GET/stats/daily?site=…&days=30Daily time series for charts
GET/stats/clicks?site=…Raw click log (paginated) — export it, join with network postbacks
Last 30 days, per offer
curl -s "$API/stats/offers?site=$SITE_ID&days=30" -H "Authorization: Bearer $KEY"
# → [{"offer_id":"…","name":"Acme VPN","clicks":412,"uniques":355}, …]
Attribution loop. We append a per-click token to the affiliate URL. When the network calls your conversion postback with that token, you can match revenue back to the exact click — and then to the offer, page and referrer in /stats/clicks.

Contacts

One model for every person who ever gave you their email on a site — newsletter leads, verified subscribers, and community members. A contact moves forward through three states and never back:

  • lead — footer/lead form signup, email only. Gets a welcome email with a double opt-in link.
  • subscriber — completed the welcome link: confirmed date of birth (18+ enforced; under-age submissions are deleted immediately) and ticked marketing consent, timestamped with their IP as proof.
  • member — a subscriber who also created a password; can post reviews and comments.

Plan-gated: lead_generation. Panel: Contacts page — stat chips, search, per-status filters, consent column, row actions, CSV export.

MethodEndpointDescription
GET/contacts?status=&q=&site=Unified list — filter by lead|subscriber|member, search email/display name, scope to a site
GET/contacts/statsCounts per status + total with live marketing consent (the chips above the table)
POST/contacts/:cid/action{"action":"unsubscribe"} clears marketing consent (same as their one-click link) · {"action":"rotate_lead_token"} issues a fresh welcome link
DELETE/contacts/:cidGDPR erasure — deletes the contact row entirely
GET/legacy-leadsOld flat leads table, read-only (affiliate postbacks still read it during migration)
GET/leads?site=…Legacy per-site lead list (pre-contacts data)
DELETE/leads/:lidDelete a legacy lead row

Weekly digest

With newsletter.enabled (see site settings) the platform emails every consenting subscriber their site's top-5 offers every Monday 08:00 UTC. Every digest carries a one-click unsubscribe header (Gmail/Outlook list-unsubscribe) plus an unsubscribe link in the body, and each send is logged idempotently — a retried worker run never double-sends.