Log Ingestion
Push server or CDN logs into AI crawler tracking.
POST /api/ingest/logs accepts batches of request-log entries from any
system that can send JSON. Only AI-relevant entries are stored (known AI
crawlers, bot-like agents, and AI-referred human visits); everything else
is discarded on arrival. This is the write-side counterpart of
crawler events and
AI referrals.
Authentication
Create a log-ingest key in the app (AI crawlers, then Install, then Log sources, Webhook tab). Present it as:
X-API-Key: <site_key_id>.<key>Providers that can only configure a URL (for example Cloudflare Logpush
HTTP destinations) can pass the same value as a key= URL parameter
instead. Log-ingest keys cannot be used for anything else, and tracking
snippet keys cannot submit logs.
Request
{
"source": "webhook",
"entries": [
{
"timestamp": "2026-08-23T10:00:00Z",
"method": "GET",
"url": "/pricing?utm_source=chatgpt.com",
"status": 200,
"user_agent": "Mozilla/5.0 ...",
"client_ip": "203.0.113.9",
"referer": "https://chatgpt.com/",
"country": "US"
}
]
}- Up to 500 entries per batch, 5 MB per request.
timestampis ISO 8601 or epoch (seconds or milliseconds). Entries older than 30 days are skipped.urlmay be a path or a full URL; the query string is only used to readutm_sourcefor referral classification.client_ipis used for crawler verification and then discarded; only daily aggregates are stored.sourcelabels the rows (webhookby default). Managed connections set their own labels.
Response
{ "ok": true, "received": 4, "stored": 3, "discarded": 1, "invalid": 0 }stored counts AI-relevant entries written, discarded counts entries
that matched nothing AI-related, invalid counts entries that could not be
processed.
Reading the data back
Log-sourced rows appear in /api/v1/crawler-events and
/api/v1/ai-referrals with their ingest_source value, filterable with
?ingest_source=webhook (or cloudflare_worker, vercel, upload,
wordpress, beacon).