Create a search campaign
POST /v1/ads/search_campaigns — scope billing:write, live key and Idempotency-Key required
VETTA_AD_MAX_BUDGET_MICRO_USD=100000000), and the primitive never raises a budget.
List and inspect
GET /v1/ads/campaigns?connection_id={connection}&customer_id={customer} — scope agents:read
GET /v1/ads/campaigns/{campaign}/insights?connection_id={connection}&customer_id={customer} —
scope agents:read
Both read current provider state. A campaign with no ad has final_url: null rather than being
omitted from the list. Insights report impressions, clicks, conversions and spend_micro_usd;
Naive does not copy OAuth credentials or maintain a second campaign ledger.
Activate or pause
POST /v1/ads/campaigns/{campaign}/activate — scope billing:write, live key required
POST /v1/ads/campaigns/{campaign}/pause with connection_id and
customer_id under scope agents:write.