Documentation Index
Fetch the complete documentation index at: https://docs.chamelio.ai/llms.txt
Use this file to discover all available pages before exploring further.
Chamelio webhooks let you subscribe to platform events and receive HTTP POST notifications to your endpoint as they happen — no polling required.
How Webhooks Work
- You register a webhook endpoint URL in the Chamelio web application
- When a subscribed event occurs, Chamelio sends an HTTP
POST request to your URL with the event payload
- Your server processes the payload and responds with a
2xx status code to acknowledge receipt
Registering a Webhook
Configure webhook endpoints in Settings → Integrations → Webhooks in the Chamelio web application. You can:
- Register multiple endpoint URLs
- Subscribe each endpoint to specific event types
- View delivery logs and retry failed deliveries
Authentication & Verification
Each webhook request includes a signature header so you can verify it came from Chamelio:
X-Chamelio-Signature: sha256=<hmac_hex_digest>
The signature is an HMAC-SHA256 digest of the raw request body, computed using your webhook secret. Verify it on your server before processing the payload:
import hmac
import hashlib
def verify_signature(payload_body: bytes, secret: str, signature_header: str) -> bool:
expected = "sha256=" + hmac.new(
secret.encode(),
payload_body,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature_header)
Always verify the signature before processing a webhook payload. Skipping this step exposes your endpoint to spoofed requests.
Retry Policy
If your endpoint does not respond with a 2xx status within 10 seconds, Chamelio will retry delivery with exponential backoff:
| Attempt | Delay |
|---|
| 1st retry | 1 minute |
| 2nd retry | 5 minutes |
| 3rd retry | 30 minutes |
| 4th retry | 2 hours |
After 4 failed retries the event is marked as undelivered. You can manually replay events from the webhook delivery log in the Chamelio web application.
Common Payload Fields
All webhook events share a common envelope:
{
"event": "core.document.uploaded",
"event_id": "evt_01HXYZ1234567890",
"organization_id": "org_abc123",
"timestamp": "2025-06-01T14:32:00Z",
"data": { ... }
}
| Field | Type | Description |
|---|
event | string | Event type identifier (e.g., core.document.uploaded) |
event_id | string | Unique identifier for this event delivery. Use this to deduplicate retries |
organization_id | string | ID of the organization in which the event occurred |
timestamp | string | ISO 8601 UTC timestamp of when the event was generated |
data | object | Event-specific payload. See individual event pages for the schema |
Available Events
Core — Documents
| Event | Description |
|---|
core.document.uploaded | A new document was uploaded to Core |
core.document.upload_with_issues | A document was uploaded but processing encountered issues |
core.document.upload_completed | A document upload finished processing successfully |
core.document.updated | A document’s attributes or metadata were updated |
core.document.deleted | A document was deleted from Core |
Flows — Workflows
| Event | Description |
|---|
flows.workflow.new_version | A new version of a workflow was published |
flows.workflow.deleted | A workflow was deleted |
Flows — Tasks
| Event | Description |
|---|
flows.tasks.created | A new workflow task was created |
flows.tasks.step_change | A task moved to a different step |
flows.tasks.completed | A task was completed |
flows.tasks.canceled | A task was canceled |
flows.tasks.commented | A comment was added to a task |