Troubleshooting
Practical fixes for the most common Vanta integration problems.
Events not appearing
Symptom: events are tracked but do not show up in the dashboard.
Likely cause: the key is wrong, the request was rejected, or the event is still in the ingestion queue.
- Check the call returned 202 Accepted. Anything else means the event was not accepted.
- Verify the API key is active and belongs to the project you are viewing.
- Ingestion enqueues events for the worker to process, so there is a short delay before they appear.
- Confirm the event type does not start with
$and was not rejected during validation.
Rate limited
Symptom: requests fail with HTTP 429.
Likely cause: you exceeded the per-key window for the endpoint.
- Single ingestion allows 1000 events/min; batch ingestion allows 100 requests/min.
- Back off for the seconds in the
Retry-Afterresponse header, or theretryAftervalue onRateLimitError. - Prefer batch ingestion over many single calls; it cuts request count dramatically.
Authentication failures
Symptom: requests fail with 401 or 403.
Likely cause: a missing or wrong API key, a revoked key, or a session without the required role.
- Confirm the request sends
Authorization: Bearer vk_.... - The full key secret is shown only once at creation time. If it is lost, create a new key.
- A 403 on admin routes means the session is not an owner or admin for the project.
- Keys are scoped to one project; a key for another project cannot read this one.
Time range issues
Symptom: analytics results are empty, or the server rejects the query.
Likely cause: a malformed or non-UTC time range, or one with the bounds reversed.
- Timestamps must be ISO 8601 datetimes in UTC ending in
Z. - Naive timestamps without a timezone are rejected.
- Bounds are inclusive, and
startmust be beforeend. - Counts, timeseries, aggregations, and grouping require a time range.
Filters not matching
Symptom: a filtered query returns fewer events than expected.
Likely cause: the field path or operator does not resolve the way the query expects.
- Use the documented aliases:
userId,groupId,sourceId,projectId,createdAt, andeventfor type. - Nested event properties need the
data.prefix, such asdata.plan; context paths needcontext.. - AND/OR nesting deeper than 5 levels is rejected. Keep the tree shallow.
- Filters are case-sensitive for exact matches; use
containsfor partial matches.
Uptime showing down
Symptom: a monitor reports down even though the service is running.
Likely cause: the heartbeat is not arriving within the expected interval plus grace period.
- Confirm the heartbeat endpoint is being called with the correct monitor slug.
- A monitor flips to down only after the interval plus the grace period passes without a heartbeat.
- If deliveries lag, increase the grace period so brief pauses do not page you.
- The first heartbeat creates the monitor if it does not exist; a new monitor reports
unknownuntil then.
Webhooks not delivering
Symptom: your endpoint never receives a delivery, or deliveries fail.
Likely cause: a permanent 4xx response, an unreachable URL, or signature verification failing on your side.
- Server errors and network failures retry after roughly 30s, 2m, 10m, and 30m, up to 5 attempts.
- Any other 4xx is treated as permanent; the delivery is not retried.
- Each request times out after 10 seconds, so the endpoint must answer quickly.
- URLs must be publicly reachable; localhost and private address ranges are rejected at creation.
- Verify signatures over the raw body with HMAC-SHA256 and reject deliveries older than five minutes.
Public page not loading
Symptom: a published page at /p/:slug returns nothing or an error.
Likely cause: the page is not published, the slug is wrong, or the page route is being blocked.
- Confirm the page was published and the slug matches the published URL.
- Published pages are intentionally public: they load without a session.
- Management routes (create, update, publish, unpublish) require an owner or admin session with
requireProjectAdmin.