Webhooks vs polling for an ad-buying agent
Subscribe to signed lifecycle events for funded, paused, review, and conversion. Poll performance and freshness. Do not poll every object every few seconds.
Use webhooks for state changes. Use polling for reports. Mixing those jobs is how an agent burns quota and still misses a pause.
Webhooks tell you that the wallet was credited, that a creative entered requires_review, that a campaign paused, that a landing page drifted, or that a conversion arrived. Those are durable rows with X-AdpZero-Signature and bounded retries. Subscribe to webhooks from an agent is the setup page.
Performance is still a pull. Impressions, spend, clicks, conversions, and freshness are query results. generated_at is local response time. The reporting sync timestamp is what decides whether a zero is real. Read performance without fooling yourself is that checklist.
What not to poll
Do not poll GET /creative every two seconds while you wait for exchange review. Subscribe to creative.approved and creative.requires_review. Do not poll funding intents in a tight loop if you can wait for account.funded. Do not treat a webhook as exchange click truth.
MCP tools can still list objects when you are debugging. That is a session, not a scheduled job. We already learned what a one-minute loop costs when it has nothing to do. Keep the agent loop event-driven for lifecycle and pull-based for numbers.