Documentation Index
Fetch the complete documentation index at: https://docs.fintelite.ai/llms.txt
Use this file to discover all available pages before exploring further.
Overview
Webhooks let your application receive instant notifications when a verification status changes. No polling required. When you create a verification, include awebhook_url and AnyCheck will POST a signed payload to that URL each time the status transitions.
Real-time updates
Status changes are delivered within seconds of the verification progressing.
HMAC-SHA256 signed
Every request includes a cryptographic signature so you can verify authenticity.
Per-verification
Each verification has its own webhook URL and optional secret. No global setup required.
Replay protection
Signatures include a timestamp. Reject requests older than 5 minutes to prevent replay attacks.
Registering a Webhook
Passwebhook_url (and optionally webhook_metadata.webhook_secret) when creating a verification:
The
webhook_secret is used to sign outgoing payloads. Choose a random, high-entropy string (at least 32 characters). Keep it secret and never expose it in client-side code.Webhook Events
AnyCheck sends aPOST request to your webhook_url when the verification status transitions to any of the following:
| Status | Description |
|---|---|
IN_PROGRESS | The job has been picked up and is being processed |
NEED_REVIEW | Processing complete, manual review required |
COMPLETED | Verification finished successfully |
PARTIALLY_COMPLETED | Some verifications in the result group completed, others pending |
FAILED | Verification processing failed |
PARTIALLY_FAILED | Some verifications in the result group failed |
FRAUD_DETECTED | Potential fraud detected; review required |
CANCELLED | Verification was cancelled |
Payload Structure
Every webhook delivers the following JSON body:| Field | Type | Description |
|---|---|---|
event | string | Always "verification.status_changed" |
timestamp | ISO 8601 | UTC timestamp of when the event was generated |
verification_id | UUID | The verification this event belongs to |
status | string | The new verification status |
data | object | The verification output data (service-dependent) |
Security: Verifying the Signature
AnyCheck signs every webhook request with HMAC-SHA256. Two headers are included:| Header | Description |
|---|---|
X-Webhook-Timestamp | Unix timestamp (seconds) when the request was sent |
X-Webhook-Signature | Signature in the format t={timestamp},sha256={hex_signature} |
Verification steps
Step 1: Check the timestamp. Reject requests where the timestamp is more than 5 minutes old (or in the future by more than 5 minutes) to prevent replay attacks. Step 2: Reconstruct the signed string. Concatenate the timestamp and raw request body:webhook_secret as the key:
sha256 portion from X-Webhook-Signature and compare using a constant-time equality check.
Code examples
- Python
- Node.js
- Go
Delivery Behavior
- Timeout: AnyCheck waits up to 10 seconds for your endpoint to respond. If it times out or returns a non-2xx status, the delivery is considered failed.
- No automatic retry: Failed deliveries are not retried. Design your endpoint to be idempotent and use the verification ID as a deduplication key. If you miss an event, fetch the current state via
GET /verifications/{id}. - Async delivery: Webhooks are sent asynchronously in a background goroutine and do not block verification processing.
Best Practices
Respond quickly and do work asynchronously
Respond quickly and do work asynchronously
Your endpoint should return
200 OK immediately and process the payload in a background queue. If your handler takes longer than 10 seconds, AnyCheck will consider the delivery failed.Make your handler idempotent
Make your handler idempotent
The same event may be delivered more than once in edge cases. Use
verification_id + status as a deduplication key to avoid processing the same transition twice.Always verify the signature
Always verify the signature
Skip signature verification only during local development. In production, always reject requests with an invalid or missing signature.
Ignore unknown events
Ignore unknown events
New event types may be added in the future. Write your handler to gracefully ignore any
event value it does not recognize.Use polling as a fallback
Use polling as a fallback
For critical use cases, pair webhooks with periodic polling (
GET /verifications/{id}) to catch any missed events.