Instead of pollingDocumentation Index
Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
Use this file to discover all available pages before exploring further.
GET /v2/action-runs/{id} for every result, you can include a callback_url in your request. When the run reaches a terminal state, Zapier POSTs the result directly to your endpoint.
This is the recommended approach at high volumes — polling creates one request per run, while callbacks let Zapier push results to you.
Adding a Callback URL
Include the optionalcallback_url field in your POST /v2/action-runs request:
Validation Rules
Thecallback_url must meet these requirements, or the request returns 400 Bad Request:
| Rule | Requirement |
|---|---|
| Protocol | HTTPS only |
| IP ranges | Public IPs only — private ranges (10.x, 172.16–31.x, 192.168.x, 127.x, ::1) are rejected |
| Max length | 2048 characters |
Callback Payload
When the action reaches a terminal state, Zapier sends aPOST to your callback_url. Your endpoint must return a 2xx response to acknowledge receipt.
Success
id in the payload matches the run ID returned by the original POST /v2/action-runs response. You can use the same callback_url for every action run and dispatch on id to correlate each callback with its originating request.
Error
Security
Verifying Callback Authenticity
Each callback includes aZapier-Callback-Signature header containing a JWT signed with Zapier’s private key. Verify it using Zapier’s public keys from our JWKS endpoint:
- Python
- Node.js
Replay Protection
The JWT includesiat and exp claims. Both PyJWT and jose validate exp automatically and will throw on an expired token — no manual timestamp check required. Callbacks are valid for 5 minutes from issuance.
Reliability
Retry Behavior
Zapier retries on 5xx responses and network errors using exponential backoff, up to 3 total attempts. Retries happen quickly (within seconds). 4xx responses are not retried. If your endpoint returns a 4xx, the callback is immediately marked failed — fix the endpoint issue and fall back to polling to retrieve the result. After all retries are exhausted, the callback is marked failed. You can still retrieve the result by pollingGET /v2/action-runs/{id}.
Idempotency
Network issues may occasionally cause your endpoint to receive the same callback more than once. Deduplicate on the runid in the payload body.
Failure Modes
| Scenario | What happens | What to do |
|---|---|---|
| Endpoint returns 5xx | Retried with exponential backoff (up to 3 attempts) | Fix the endpoint; check your server logs |
| Endpoint returns 4xx | Not retried; callback permanently failed | Fix the endpoint error, then poll GET /v2/action-runs/{id} for the result |
| Endpoint unreachable | Retries exhaust; callback marked failed | Poll GET /v2/action-runs/{id} as fallback |
| Duplicate callback received | Can occur if your endpoint times out after returning 2xx | Deduplicate on the run id in the payload body |
| Long-running action (>45s) | Callback fires when the action eventually completes | No action needed — just wait |
Invalid callback_url on POST | 400 Bad Request with a validation error | Use a valid HTTPS URL on a public IP |