Webhooks
Receive a POST when a scrape finishes or a crawl completes.
Webhooks push results to you instead of making you poll. Give llmcrawl a URL and it POSTs a JSON payload when the work is done — useful for long crawls, background pipelines and notifications.
Subscribe to events
Two ways, and you can use both:
- Saved endpoints — create endpoints in the dashboard under Webhooks. Each endpoint has a name, a payload URL and an event subscription; an endpoint with no events selected receives every event.
- Per request — pass
webhookUrls(and optionalmetadata) onPOST /v1/scrapeorPOST /v1/crawl. This delivers that request's result to the given URLs without creating a saved endpoint.
Events currently delivered:
| Event | Sent when |
|---|---|
scrape.completed | A /v1/scrape request that included webhookUrls finished. |
crawl.completed | A crawl finished and its documents are ready. |
The dashboard can also send a test delivery to an endpoint so you can verify your receiver before relying on it.
Payloads
Every delivery is a POST with content-type: application/json. A scrape delivery carries
the finished document:
{
"success": true,
"event": "scrape.completed",
"data": {
"markdown": "...",
"metadata": { "sourceURL": "https://example.com", "statusCode": 200 }
},
"metadata": { "orderId": "A-1024" }
}A crawl delivery carries the summary and the documents collected so far (up to the first 200):
{
"success": true,
"event": "crawl.completed",
"data": {
"type": "crawl.completed",
"crawlId": "crawl_9f2c...",
"status": "completed",
"completed": 34,
"total": 34,
"data": [{ "markdown": "...", "metadata": { "sourceURL": "https://example.com/about" } }]
},
"metadata": { "run": "nightly" }
}metadata is whatever you passed as metadata on a scrape or webhookMetadata on a crawl —
use it to correlate deliveries with your own jobs.
Delivery and retries
- Deliveries are attempted up to 3 times, with a short backoff between attempts, and each attempt times out after 10 seconds.
- Return any
2xxstatus to acknowledge a delivery. Anything else is retried and then recorded as failed. - A failing webhook never fails the scrape or crawl that triggered it. Scrape responses carry
a
warningwhen a delivery could not be made, and every attempt — status code, attempts and failures — shows up in the dashboard's delivery log.
Local testing
To try a receiver locally, expose it with a tunnel and add the public URL as an endpoint, then hit Send test delivery in the dashboard. The delivery log shows what was sent and how your endpoint responded.