Skip to main content

Webhook Callbacks

Instead of polling the status endpoint, you can provide a callback URL when submitting tasks to receive automatic notifications when generation completes.

How It Works

  1. Submit with callback URL: Include a callback_url in your task submission
  2. Receive notification: When the task completes (success or failure), PoYo AI sends a POST request to your URL
  3. Process result: Your server receives the complete task data including generated files

Callback Request

When a task completes, PoYo AI sends a POST request to your callback URL. The callback body uses the same task data shape as the status endpoint, without the outer code and data wrapper.

Request Headers

Request Body

Failed Task Callback

Signature Verification

PoYo signs every webhook request with HMAC-SHA256. Existing receivers can ignore these headers, but production systems should verify them. Get your webhook HMAC key:
Rotate your webhook HMAC key:
Signature rule:
Where:
  • task_id is the top-level task_id in the callback body
  • timestamp is the value of X-Webhook-Timestamp
  • webhook_hmac_key is returned by GET /api/api-keys/webhook-secret

Python Verification

Node.js Verification

Requirements

Your callback endpoint must meet the following requirements:
  • HTTPS only: Must use HTTPS protocol (HTTP not supported)
  • Maximum URL length: 2048 characters
  • Response timeout: Must respond within 30 seconds
  • Success response: Should return HTTP 200-299 status code
  • No internal IPs: Cannot use private/internal IP addresses (e.g., 192.168.x.x, 10.x.x.x)
  • Public accessibility: Must be publicly accessible from the internet

Retry Policy

If your callback endpoint fails to respond or returns an error:
  • Retry attempts: Up to 5 automatic retries
  • Retry delays: Exponential backoff, starting at about 60 seconds and capped at 10 minutes
  • Final failure: After all retry attempts fail, no further retries are made
If all retry attempts fail, you can still retrieve the results by polling the status endpoint.

Example Implementation

Python (Flask)

Node.js (Express)

Go

Security Best Practices

Verify requests: Validate X-Webhook-Timestamp and X-Webhook-Signature before processing callbacks.
Idempotency: Design your webhook handler to be idempotent in case of duplicate deliveries
Async processing: Process the callback asynchronously and return 200 quickly to avoid timeouts
Logging: Log all webhook requests for debugging and monitoring

Testing

Using ngrok for Local Testing

During development, you can use ngrok to expose your local server:

Webhook vs Polling

For production systems handling high volumes, webhooks are recommended to reduce API calls and get instant notifications.

Next Steps

Task Status

Learn about polling task status

Image Generation

Generate images with GPT-4o

Video Generation

Create videos with Sora 2

Quick Start

Back to Quick Start guide