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
  • 1 reply
  • 17 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

1 reply

Temi O.
Community Manager
Community Manager
September 4, 2026

Hi ​@MathewN , 

Thanks for reaching out! The key detail is that both requests use demo+isolated@example.com. Klaviyo can accept these requests with 202, but events associated with placeholder domains such as @example.com are filtered before ingestion, so no profile, event, or metric appears. This behavior is noted in the Events API documentation.
 

The single-event body is otherwise in the expected JSON:API shape, and the bulk request is using the documented event-bulk-create-job structure. Before changing the payload further, please retry with a test address on a real domain that you control and use a brand-new unique_id, for example api-test+payment-failed@yourdomain.com and payment-failed-test-2. The customer_email property is fine, but it does not replace the email used in the profile object for identity resolution.
 

After sending the new request, check the profile Activity feed and Analytics > Metrics. Once the event is successfully processed, Payment Failed - Soft Decline should become available as a flow trigger. If the same issue occurs with a non-example.com address and a fresh unique_id, then please escalate with the company ID Y9LFtc, timestamps, redacted payloads, API revisions, complete response headers, and all x-klaviyo-req-id values. Also include that the bulk request returned 202 without a Location header.

 


Temi@Klaviyo