Webhooks
Webhooks allow you to receive real-time notifications when events occur in your LlamaCloud jobs. Instead of continuously polling for status updates, you can configure webhook endpoints to be notified immediately when jobs complete, fail, or reach other states.
Overview
Section titled “Overview”LlamaCloud webhooks provide:
- Real-time notifications for jobs
- Configurable event filtering to receive only relevant events
- Retry logic with exponential backoff for reliability
- Custom headers support for authentication
Supported Events
Section titled “Supported Events”Currently, LlamaCloud supports the following webhook events:
Extract Events
Section titled “Extract Events”extract.pending- Extract job has been queued and is waiting to be processedextract.success- Extract job completed successfullyextract.error- Extract job failed with an errorextract.partial_success- Extract job completed with some warnings or partial failuresextract.cancelled- Extract job was cancelled before completion
Parse Events
Section titled “Parse Events”parse.pending- Parse job has been queued and is waiting to be processedparse.success- Parse job completed successfullyparse.error- Parse job failed with an errorparse.partial_success- Parse job completed with some warnings or partial failuresparse.cancelled- Parse job was cancelled before completion
Classify Events
Section titled “Classify Events”classify.pending- Classify job has been queued and is waiting to be processedclassify.running- Classify job has started processingclassify.success- Classify job completed successfullyclassify.partial_success- Classify job completed with some warnings or partial failuresclassify.error- Classify job failed with an errorclassify.cancelled- Classify job was cancelled before completion
Configuration
Section titled “Configuration”Reference the full API schema here: https://api.cloud.llamaindex.ai/redoc#tag/LlamaExtract/operation/run_job_api_v1_extraction_jobs_post
Basic Configuration
Section titled “Basic Configuration”Configure webhooks by including webhook configurations in your API calls. You will want to include the webhook configurations as follows:
{ ... "webhook_configurations": [ { "webhook_url": "string", "webhook_headers": { "property1": "string", "property2": "string" }, "webhook_events": [ "extract.pending", "extract.success", "extract.error" ], "webhook_output_format": "json" } ] ...}Here’s how to configure webhooks in Python (added as the webhook_configurations parameter in the request body):
webhook_configurations = [ { "webhook_url": "https://your-domain.com/webhook-endpoint", "webhook_events": ["extract.success", "extract.error", "parse.success", "parse.error"], "webhook_headers": { "Authorization": "Bearer your-token", "X-Custom-Header": "custom-value" }, "webhook_output_format": "json" }]Event Filtering
Section titled “Event Filtering”You can specify which events to receive by setting the webhook_events array. If not specified, all events will be sent.
# Receive only success and error eventswebhook_configurations = [ { "webhook_url": "https://your-domain.com/webhook", "webhook_events": ["extract.success", "extract.error", "parse.success", "parse.error"] "webhook_output_format": "json" }]
# Receive all events (default behavior)webhook_configurations = [ { "webhook_url": "https://your-domain.com/webhook" "webhook_output_format": "json" # webhook_events omitted = receive all events }]Custom Headers
Section titled “Custom Headers”Add custom headers for authentication or other purposes:
webhook_configurations = [ { "webhook_url": "https://your-domain.com/webhook", "webhook_headers": { "Authorization": "Bearer your-secret-token", "X-Source": "llamacloud", "Content-Type": "application/json" # This is set automatically } "webhook_output_format": "json" }]Webhook Payload
Section titled “Webhook Payload”When an event occurs, LlamaCloud will send a POST request to your webhook URL with the following payload structure:
{ "event_id": "149744dd-9002-4411-a6c7-9635da372caa", "event_type": "parse.success", "timestamp": 1753985275.1154444, "data": { "id": "a9a57884-921e-4ec2-b555-f4e5a97ec02a", "job_id": "a9a57884-921e-4ec2-b555-f4e5a97ec02a" }}Payload Fields
Section titled “Payload Fields”event_id: Unique identifier for this webhook eventevent_type: The type of event that occurred (e.g., “extract.success”, “parse.success”)timestamp: Unix timestamp when the event occurreddata: Event-specific data containing job details and results
HTTP Headers
Section titled “HTTP Headers”LlamaCloud includes these headers with webhook requests:
Content-Type: application/jsonUser-Agent: llamaindex-webhook-service/1.0X-Webhook-Event-ID: {event_id}X-Webhook-Event-Type: {event_type}- Any custom headers you configured
Retry Behavior
Section titled “Retry Behavior”LlamaCloud implements automatic retry logic for webhook deliveries:
- Maximum attempts: 3 attempts by default
- Exponential backoff: Wait time doubles between attempts (1s, 2s, 4s)
- Maximum wait time: 60 seconds maximum between retries
- Timeout: 30-second timeout per request
A webhook delivery is considered successful if your endpoint returns any HTTP status code in the 200-299 range.
Example: Receiving Webhooks with Inngest
Section titled “Example: Receiving Webhooks with Inngest”You can point webhook_url at an Inngest webhook to receive LlamaCloud events without running your own server.
In the Inngest dashboard, create a webhook and add this Transform Function so each event is named by its event_type:
function transform(evt) { return { name: `Llamacloud/${evt.event_type}`, data: evt };}Then use the Inngest URL as your webhook_url:
webhook_configurations = [ { "webhook_url": "https://inn.gs/e/<your-inngest-key>", "webhook_events": ["parse.success", "parse.error"], "webhook_output_format": "json" }]Subscribe an Inngest function to the transformed event and fetch the parsed result with the job_id from the payload:
inngest.createFunction( { id: "llamacloud-parse-success" }, { event: "Llamacloud/parse.success" }, async ({ event }) => { const jobId = event.data.data.job_id; const res = await fetch( `https://api.cloud.llamaindex.ai/api/v2/parse/${jobId}?expand=markdown`, { headers: { Authorization: `Bearer ${process.env.LLAMA_CLOUD_API_KEY}` } }, ); const { markdown } = await res.json(); // do something with the parsed markdown },);