Campaigns

Sellable campaigns

Geo targeting

ISO country codes. Empty = worldwide. Rotate matches CF-IPCountry / X-Geo-* / ?country=

Daypart targeting

Rotate uses server time in this timezone. Empty hours and no days checked = all hours/days.

Webhook

POST JSON when budget is exhausted or status becomes paused/completed. Payload includes spend, CTR, CVR, and conversions.

Update webhook

PUT webhook URL on an existing campaign. Test POSTs event=test without changing last-event tracking.

Update geo targeting

PUT existing campaign. Leave a field blank to clear that list (blank countries = worldwide).

Update daypart targeting

PUT existing campaign. Empty hours and no days checked = all hours/days (backward compatible).

Link creative

Update / unlink creative

Record conversion

Optimizer scales CampaignAd.weight by CTR (±20%) after 20 impressions. A systemd timer runs it every 20 minutes in production.