Cloakup API
Guides

Campaign create

Defaults, business rules, and create examples

Omitted fields are filled server-side. Do not copy the full filters object from GET responses — only send what you need.

Create defaults

FieldDefault when omitted
activetrue
filters.facebook, google, tiktok, kwai, taboola, pinterest, yandex, mgid, outbrain, sms, revcontent, adskeeper, newsbreakfalse
filters.adspy, bots, proxy, cloakup_aitrue
filters.deny_alwaysfalse
filters.state{ "allow": true, "states": [] }
filters.city{ "allow": true, "cities": [] }
filters.network_type{ "allow": true, "types": [] }
filters.device{ "allow": true, "devices": [] }
filters.geolocation.allowtrue
filters.referer.allowtrue
filters.query.allowtrue
filters.query.remove_paramsfalse
filters.domain.allow, browser.allow, browser_language.allow, isp.allow, os.allow, user_agent.allowtrue

Still required (no default for the key itself): name, mode, pages, domain, alias, and in filters: geolocation, referer, query, domain, browser, browser_language, isp, os, user_agent, blacklist.

Inside required objects you may omit nested defaults (e.g. send "domain": {}, "referer": { "block_null": true, "domains": [] }).

To target a single ad network, send only that network as true (e.g. "facebook": true). All other networks default to false.

Pages / offers business rules

Returns 422 if violated:

RuleDetail
Offer shareWithin each segmentation group, share values must sum to exactly 100. Group key = sorted segmentation.country join, or "fallback" when country list empty/missing.
Fallback offerAt least one offer must have no country segmentation (empty/missing segmentation.country).
mode: "basic"Exactly one ad-network flag true, and filters.device.devices must have ≥ 1 entry.
mode: "advanced"Zero or one ad network; empty device.devices allowed.

Minimal example

Production-safe body with only non-default values:

{
  "name": "My Campaign",
  "mode": "advanced",
  "domain": null,
  "alias": null,
  "pages": {
    "white": { "type": "content", "content": "safe.html" },
    "offers": [{ "type": "content", "content": "offer.html", "share": 100 }]
  },
  "filters": {
    "facebook": true,
    "geolocation": { "countries": ["BR"] },
    "referer": { "block_null": true, "domains": [] },
    "query": { "condition": "some", "params": {}, "rules": {} },
    "domain": {},
    "browser": {},
    "browser_language": { "languages": ["pt-br"] },
    "isp": {},
    "os": {},
    "user_agent": {},
    "blacklist": []
  }
}

Omitted here (defaults apply): active, all other ad networks, deny_always (false), bots, proxy, adspy, cloakup_ai, state, city, network_type, device, and every allow / remove_params flag.

Example with query params

Same production-safe body, plus URL param matching. This campaign allows traffic when the URL has utm_source=google or the custom token asiudhasudhasd=123u1basj.

Visitor URL that matches:

https://track.example.com/slug?utm_source=google&asiudhasudhasd=123u1basj

"asiudhasudhasd": "equals" is the comparison, not the value. In params the value is an array: "asiudhasudhasd": ["123u1basj"]. A plain string ("asiudhasudhasd": "123u1basj") is invalid. See Campaign filters for contains, starts_with, ends_with, every, and more copy-paste examples.

{
  "name": "My Campaign",
  "mode": "advanced",
  "domain": null,
  "alias": null,
  "pages": {
    "white": { "type": "content", "content": "safe.html" },
    "offers": [{ "type": "content", "content": "offer.html", "share": 100 }]
  },
  "filters": {
    "facebook": true,
    "geolocation": { "countries": ["BR"] },
    "referer": { "block_null": true, "domains": [] },
    "query": {
      "condition": "some",
      "params": {
        "utm_source": ["google"],
        "asiudhasudhasd": ["123u1basj"]
      },
      "rules": {
        "utm_source": "equals",
        "asiudhasudhasd": "equals"
      }
    },
    "domain": {},
    "browser": {},
    "browser_language": { "languages": ["pt-br"] },
    "isp": {},
    "os": {},
    "user_agent": {},
    "blacklist": []
  }
}

For test/review mode only, set "deny_always": true. See Production safety.

Update (PUT)

PUT /v1/campaigns/:id uses the same full body as create. This is not a partial PATCH — send the complete CampaignBody.

On this page