Skip to main content
Contributor I
September 2, 2026
Question

Events API accepts writes (202) but no events, metrics, or profiles ever appear — even via bulk-create with no Location header

  • September 2, 2026
  • 0 replies
  • 5 views

I need help with I wanvt Klaviyo to recognize my metric payment failed and surface it so I can create a flow all effort has failed here is a summary: Every write returns HTTP 202 Accepted with valid Klaviyo response headers — but nothing is ever ingested: no event appears via the API or the UI, no metric is created, and no profile is created. Verified over ~2 hours, across single-event and bulk-create endpoints, multiple metric names (new and pre-existing), multiple profile emails, and two API revisions.

Setup

  • Endpoint: https://a.klaviyo.com/api
  • Auth: Authorization: Klaviyo-API-Key pk_… (private key, Full Access, events:write scope)
  • Revision headers tried: 2024-10-15 and 2026-07-15 — both echoed back in x-klaviyo-api-revision, so accepted
  • Company id from response header: cid: Y9LFtc (US endpoint)
  • Requests originate from a Node.js server (native fetch)

What we observe

1. Single-event create — POST /api/events

json

Copy

{
"data": {
"type": "event",
"attributes": {
"metric": { "data": { "type": "metric", "attributes": { "name": "Payment Failed - Soft Decline" } } },
"profile": { "data": { "type": "profile", "attributes": { "email": "demo+isolated@example.com" } } },
"unique_id": "test-1234",
"value": 12.34,
"properties": { "decline_type": "soft", "amount": 12.34, "currency": "usd" }
}
}
}

Result: 202 Accepted, empty body, real headers (cidx-klaviyo-req-id, rate limits). Identical result for events against an existing metric (Active on Site) and against new metric names.

2. Bulk-create job — POST /api/event-bulk-create-jobs

Used the structure from the OpenAPI spec and community examples: events-bulk-create.data[].attributes.profile + events.data[]backfill: false, profile first_name/last_name/email, event unique_id/time/value/metric/properties.

Result: 202 Accepted, empty body — but no Location header and no job id anywhere in the response, so the job can't be polled via GET /api/event-bulk-create-jobs/{id} (docs indicate the bulk endpoint returns a Location header).

3. Reads confirm nothing was ingested

  • GET /api/metrics → 20 metrics (account catalog); no new metric appears
  • GET /api/events?filter=equals(metric_id,"TX6mUj") (existing metric we posted to) → "data":[]
  • GET /api/events with datetime filters → "data":[]
  • GET /api/profiles?filter=equals(email,"demo+isolated@example.com") → "data":[] for every email used
  • UI (authoritative): Profiles shows only the account-owner profile; Analytics → Metrics shows nothing new, even 1–2 hours after the 202s