Jobs & Webhooks
All compute endpoints in ImagePipeline are asynchronous. A request returns
immediately with a job_id and status: queued; you retrieve the result by polling or
via a webhook.
The job lifecycle
status is one of: queued, pending, processing, completed, failed, cancelled.
The queued response
Every compute POST returns a JobQueuedResponse:
{
"job_id": "job_a1b2c3",
"status": "queued",
"endpoint": "/generate/image/v1",
"estimated_time_seconds": 8,
"queued_at": "2026-05-30T12:00:00Z"
}
Option A, Poll
Each compute endpoint has a matching status endpoint:
GET /{endpoint}/status/{job_id}. Poll it until status is terminal.
curl https://api.imagepipeline.io/generate/image/v1/status/job_a1b2c3 \
-H "X-API-Key: $IMAGEPIPELINE_API_KEY"
The JobStatusResponse carries progress, timing, credits, and, on success, the
result:
{
"job_id": "job_a1b2c3",
"status": "completed",
"progress": 100,
"result_url": "https://cdn.imagepipeline.io/...signed...",
"result_mime_type": "image/webp",
"queue_wait_seconds": 1.1,
"inference_time_seconds": 6.2,
"total_elapsed_seconds": 7.3,
"credits_charged": true,
"credits_amount": 1
}
On failure you get an error, a machine-readable failure_reason_code, and a
retryable flag, see Errors.
Use polling for development. Poll at a sensible interval (e.g. every 1–2s) rather than in a tight loop.
Option B, Webhooks
Pass a callback_url in any compute request body and ImagePipeline POSTs a
WebhookEvent to it when the job reaches a terminal state. Recommended for production.
{
"job_id": "job_a1b2c3",
"user_id": "usr_123",
"status": "completed",
"result_url": "https://cdn.imagepipeline.io/...signed...",
"result_mime_type": "image/webp",
"result_size_bytes": 184320,
"timestamp": 1769774400
}
status in a webhook is always completed or failed. Retrieve the canonical schema
any time:
curl https://api.imagepipeline.io/webhooks/event-schema \
-H "X-API-Key: $IMAGEPIPELINE_API_KEY"
Result URL lifecycle
result_url is a temporary pre-signed download link. Download and store the file in
your own storage immediately after the job completes, do not persist the URL itself, it
will stop working.
Some webhook payloads can also include result_base64 for small assets, avoiding a
second download round-trip.