Ingest a Vercel Drain delivery
Receives a Vercel Drain (formerly “Log Drain”) delivery in VERCEL’S OWN format, so a Vercel-hosted customer needs no code: they paste this URL into a drain and add one Authorization: Bearer <api-key> custom header. We translate, classify the User-Agent through the same catalog the JS beacon uses, and store recognised AI-crawler requests with channel=vercel.
Accepts both delivery encodings — a JSON array or NDJSON — sniffed from the body rather than from Content-Type, which Vercel does not guarantee; gzip is detected by magic bytes. Records without a proxy object (build output, function stdout, and the sample events Vercel posts when the drain is created) are counted as skipped, not errors.
DELIBERATELY FORGIVING: a delivery we cannot parse, or one we fail to persist, still returns 200. Vercel publishes no retry policy and flags a drain (emailing the customer that the endpoint is broken) past 80% failed deliveries. Only a bad token, a foreign site_id, a signature mismatch or a spent quota return a non-2xx.
Requires the Growth plan or higher and is metered against the same monthly server-log event cap as /agents/ingest.
Authorizations
API keys generated via POST /api/v1/me/api-keys. Format:
Authorization: Bearer fxa_<32-char-secret>. Only accepted on
/api/public/v1/*. Cookie auth is rejected on that surface.
Headers
Hex HMAC-SHA1 of the raw body using the drain's signing secret. Vercel makes the secret optional; verification is enforced only when a secret has been saved for the brand, and then a missing or mismatched signature is a 403.
Query Parameters
The brand's public site id (the same value used by the JS tag). Ownership-checked against the API key's account. May also be sent as an X-FixAEO-Site header.
Echoed back as x-vercel-verify on every response.