Try the API with a real sample: download maya-bot-logs.sample.ndjson (15 rows, ~5 KB) and POST it with X-Maya-Mode: test to validate the schema end-to-end before integrating your filter.
Malformed payload. The body identifies the first parse failure.
401 Unauthorized
Missing or invalid token.
413 Payload Too Large
Body exceeds limits. Split the batch.
429 Too Many Requests
Rate limit exceeded. The Retry-After header provides a backoff hint.
5xx Server Error
Transient. Retry with exponential backoff. Maya's ingestion endpoint is idempotent on X-Maya-Batch-Id — replaying the same batch ID will not double-count.
Validation rules (server-side)
The endpoint validates each record. A record is rejected (and counted in rejections) if any of the following are true:
A field outside the allowlist is present.
A required field is missing.
user_agent does not match the LLM bot allowlist.
timestamp is older than 90 days or in the future.
request_path exceeds 8 KB.
request_path contains a query-string parameter on the denylist.
Rejection of individual records does not fail the batch. The 207 response identifies which records were dropped, so you can correct your filter.
Idempotency
If X-Maya-Batch-Id is supplied, the endpoint deduplicates. A duplicate ID returns the original 202/207 response without ingesting again. This makes safe retries trivial: the same batch can be replayed indefinitely without skewing counts.
Compression
Content-Encoding: gzip is supported and recommended. Typical compression ratio for filtered NDJSON is 8:1 to 12:1.
Set X-Maya-Mode: test to validate without ingesting. The endpoint runs the full validation pipeline and returns the same 202/207 response, but does not persist any record. This is the recommended way to validate a new filter before going to production.