Make a rule: its campaigns, subject, conditions, window, interval, action and limits. It runs dry, recording what it would do, unless status says active or paused
POST
/v1/buyer/automation/rules
const url = 'https://example.com/v1/buyer/automation/rules';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"action":"block_placement","campaign_ids":[1],"change":{"ceiling":{"amount":{"amount_micros":1,"currency":"example"},"factor_ppm":1},"floor":{"amount":{"amount_micros":1,"currency":"example"},"factor_ppm":1},"max_step_bps":1,"step":{"amount":{"amount":{"amount_micros":1,"currency":"example"},"factor_ppm":1},"kind":"up_percent","measure":"visits","percent_bps":1,"share_bps":1},"target":{"confidence_bps":1,"cpa":{"amount_micros":1,"currency":"example"},"epc_share_bps":1,"kind":"cpa","lower_only":true,"roi_ppm":1},"unit":"cpc"},"conditions":[{"comparison":"less","measure":"visits","money":{"amount_micros":1,"currency":"example"},"value":1}],"email_actions":true,"interval_seconds":1,"lag_seconds":1,"limits":{"cooldown_seconds":1,"per_day":1,"per_run":1},"min_visits":1,"name":"example","run_dates":{"from":"2026-04-15T12:00:00Z","to":"2026-04-15T12:00:00Z"},"run_hours":{"hours":[1],"time_zone":"example"},"status":"active","subject":"placement","window_seconds":1}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/v1/buyer/automation/rules \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "action": "block_placement", "campaign_ids": [ 1 ], "change": { "ceiling": { "amount": { "amount_micros": 1, "currency": "example" }, "factor_ppm": 1 }, "floor": { "amount": { "amount_micros": 1, "currency": "example" }, "factor_ppm": 1 }, "max_step_bps": 1, "step": { "amount": { "amount": { "amount_micros": 1, "currency": "example" }, "factor_ppm": 1 }, "kind": "up_percent", "measure": "visits", "percent_bps": 1, "share_bps": 1 }, "target": { "confidence_bps": 1, "cpa": { "amount_micros": 1, "currency": "example" }, "epc_share_bps": 1, "kind": "cpa", "lower_only": true, "roi_ppm": 1 }, "unit": "cpc" }, "conditions": [ { "comparison": "less", "measure": "visits", "money": { "amount_micros": 1, "currency": "example" }, "value": 1 } ], "email_actions": true, "interval_seconds": 1, "lag_seconds": 1, "limits": { "cooldown_seconds": 1, "per_day": 1, "per_run": 1 }, "min_visits": 1, "name": "example", "run_dates": { "from": "2026-04-15T12:00:00Z", "to": "2026-04-15T12:00:00Z" }, "run_hours": { "hours": [ 1 ], "time_zone": "example" }, "status": "active", "subject": "placement", "window_seconds": 1 }'Who: a workspace’s buyer, or its key. API keys with the buyer:write scope.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”Idempotency-Key
string
Made once per action and sent again on every retry of it, so the service acts once: the request_id of the create or money-moving call; a new one when left out
Request Bodyrequired
Section titled “Request Bodyrequired”Media typeapplication/json
object
action
string | null
campaign_ids
Array<integer> | null
change
Any of:
object
ceiling
floor
max_step_bps
integer format: int32
step
Any of:
null
target
unit
required
string
null
conditions
email_actions
boolean | null
interval_seconds
integer | null format: int64
lag_seconds
integer | null format: int64
limits
min_visits
integer | null format: int64
name
string | null
run_dates
status
string | null
subject
string | null
window_seconds
integer | null format: int64
Responses
Section titled “Responses”Created
Media typeapplication/json
object
action
required
string | null
campaign_ids
required
Array<integer>
change
required
Any of:
object
ceiling
required
floor
required
max_step_bps
required
integer format: int32
step
required
Any of:
object
amount
required
kind
required
string | null
measure
required
string | null
percent_bps
required
integer format: int32
share_bps
required
integer format: int32
null
target
required
Any of:
null
unit
required
string | null
null
conditions
required
created_at
required
string format: date-time
created_by
required
email_actions
required
boolean
id
required
integer format: int64
interval_seconds
required
integer format: int64
lag_seconds
required
integer format: int64
last_run_at
required
string | null format: date-time
last_run_status
required
string | null
limits
required
object
cooldown_seconds
required
integer format: int64
per_day
required
integer format: int32
per_run
required
integer format: int32
min_visits
required
integer format: int64
name
required
string
next_run_at
required
string | null format: date-time
raises_approved_at
required
string | null format: date-time
raises_approved_by
required
run_dates
required
sequence
required
integer format: int64
status
required
string | null
subject
required
string | null
updated_at
required
string format: date-time
updated_by
required
warnings
required
Array<string | null>
window_seconds
required
integer format: int64
workspace_id
required
integer format: int64
Example
{ "action": "block_placement", "change": { "step": { "kind": "up_percent", "measure": "visits" }, "target": { "kind": "cpa" }, "unit": "cpc" }, "conditions": [ { "comparison": "less", "measure": "visits" } ], "created_by": { "kind": "user" }, "last_run_status": "running", "raises_approved_by": { "kind": "user" }, "status": "active", "subject": "placement", "updated_by": { "kind": "user" }, "warnings": [ "visits_only" ]}default
Section titled “default”An error, as go-commons apperr maps it
Media typeapplication/json
object
error
required
object
code
required
string
fields
object
key
additional properties
string
message
required
string
Example generated
{ "error": { "code": "example", "fields": { "additionalProperty": "example" }, "message": "example" }}