Skip to main content
Version: Next

API reference

Authentication

All requests require a bearer token in the Authorization header: Authorization: Bearer $ATLAS_API_KEY. Requests without a valid key return 401; requests with a key that's valid but lacks permission for the requested project return 403.

Ingest events

POST /v1/atlas/events

Accepts up to 1,000 events per request. Larger batches should be chunked client-side — the SDKs do this automatically.

Request

{
"events": [
{
"name": "checkout_completed",
"user_id": "usr_8f3a1c",
"timestamp": "2026-07-15T14:32:00Z",
"properties": {
"order_id": "ord_29xk3",
"revenue": 84.50,
"currency": "USD",
"items": 3
}
}
]
}

Response202 Accepted

{
"accepted": 1,
"rejected": 0,
"batch_id": "batch_7f2e9a1c"
}

If some events in a batch fail validation, Atlas accepts the valid ones and reports the rest individually rather than rejecting the whole batch:

{
"accepted": 2,
"rejected": 1,
"batch_id": "batch_7f2e9a1c",
"errors": [
{ "index": 2, "code": "invalid_timestamp", "message": "timestamp is more than 24h in the past" }
]
}

Query raw events

GET /v1/atlas/events

ParameterTypeDescription
user_idstringFilter to a single identity
namestringFilter to a single event name
since / untilISO 8601Time range (defaults to the last 24h)
limitintegerMax 100 per page, default 20
cursorstringOpaque pagination cursor from the previous response's next_cursor

Response200 OK

{
"data": [
{
"id": "evt_4k2p91xz",
"name": "checkout_completed",
"user_id": "usr_8f3a1c",
"timestamp": "2026-07-15T14:32:00Z",
"properties": { "revenue": 84.50, "currency": "USD", "items": 3 }
}
],
"next_cursor": "eyJvZmZzZXQiOjIwfQ==",
"has_more": true
}

Funnels

POST /v1/atlas/funnels creates a funnel definition; GET /v1/atlas/funnels/:id computes and returns current results for it.

Create — request

{
"name": "Signup to purchase",
"steps": ["signup_completed", "product_viewed", "checkout_completed"],
"window": "7d"
}

Query — response

{
"id": "fnl_9x2k3p",
"name": "Signup to purchase",
"steps": [
{ "name": "signup_completed", "count": 4200, "conversion_from_previous": 1.0 },
{ "name": "product_viewed", "count": 3110, "conversion_from_previous": 0.74 },
{ "name": "checkout_completed", "count": 892, "conversion_from_previous": 0.29 }
]
}

Cohorts

GET /v1/atlas/cohorts/:id — membership is recomputed on every call, not cached at creation time.

{
"id": "cht_3f8a2c",
"name": "Active purchasers (30d)",
"size": 1847,
"last_computed": "2026-07-15T14:32:00Z"
}

Errors

HTTP statuscodeMeaning
400invalid_event_schemaA required field was missing or the wrong type
400invalid_timestampTimestamp is more than 24h in the past, or in the future
401invalid_api_keyKey is missing, malformed, or revoked
403insufficient_scopeKey is valid but not authorized for this project
413batch_too_largeMore than 1,000 events in one request
429rate_limitedSee rate limits below; back off using the Retry-After header

Rate limits

600 requests/minute per API key for /events (ingestion), 60 requests/minute for query endpoints (/events GET, /funnels, /cohorts). Limits are per-key, not per-project — split high-volume ingestion across multiple keys if you need more throughput rather than requesting a limit increase first.

Support

For questions about Atlas, contact the product team or visit the community forum.