Skip to main content

Webhooks

Zupertry sends a signed HTTP POST to your webhook URL when a job completes or fails. Webhooks are the recommended way to receive results — more reliable than polling.

Setup

Provide your webhook URL when submitting a job:
Or set a default webhook URL for your entire organisation in the console under Settings → Webhook URL. The per-request webhook_url overrides the org-level default.

Event types

Payload shape

For job.failed:

Signature verification

Every webhook request includes an X-Zupertry-Signature header. This is an HMAC-SHA256 of the raw request body, signed with your webhook signing secret.
Always verify the signature before processing a webhook. Skip this and anyone can forge events to your endpoint.

Node.js

Python (Flask)

Retry logic

If your endpoint returns a non-2xx status (or doesn’t respond within 10 seconds), Zupertry retries the delivery:
Always respond 200 OK as quickly as possible (within the 10-second window). Do any heavy processing asynchronously — add the event to a queue and process it later.

Idempotency

Your endpoint may receive the same event more than once (network timeouts cause retries even after successful delivery). Always make your handler idempotent by using job_id as a deduplication key:

Reading webhook logs

All delivery attempts are logged in the Zupertry console under Logs → Webhook logs. Each row shows:
  • Delivery attempt number
  • HTTP status returned by your endpoint
  • Response time (ms)
  • Timestamp
Click any row to expand the full request payload and response body.

Testing webhooks locally

Use ngrok to expose your local server:
Use the ngrok URL as your webhook URL when submitting test jobs.