POST /v2/product-events (one event) or POST /v2/product-events/batch (up to 5,000 events). Both need a token with WRITE access.
eventId, userId, eventName, timestamp, and properties are required. orgId is optional.
Accepted is not stored
A202 means the event passed validation and is durably queued. It does not mean the event is stored yet.
Each event name starts disabled. Its events are archived but not stored or used by triggers until you enable the event name in Product Data Explorer. The name appears there after its first event. Enabling takes effect within minutes and back-fills that event’s recent history from the archive. Back-filled events do not fire triggers.
Identity
userId is the product user ID used by POST /v2/users. orgId is the organization ID. Events never create or update product users or organizations. Events for an ID that doesn’t exist yet are kept and link up once it exists.
Timestamps
timestamp accepts any of these:
A date alone, a space instead of
T, a numeric string, and offsets like +0530 are rejected.
Properties
properties is an object with 1 to 256 top-level keys. Nested objects and arrays are stored, but only top-level string, number, and boolean values can be used in dynamic lists and triggers.
Deduplication and retries
eventId identifies an event within your workspace. A repeat within the deduplication window is rejected with DUPLICATE_EVENT.
Always retry with the same eventId:
- Resend events rejected with
DEPENDENCY_UNAVAILABLE. - Resend the whole request after a
500. - On a retry,
DUPLICATE_EVENTnormally means the event was already accepted.
eventId are all rejected.
Responses
Product event responses contain onlyerrors and meta. Accepted events are not listed individually. meta.correlationId identifies the request; include it when you contact support.
202 with SUCCESS when every event is accepted, or PARTIAL_SUCCESS when some are rejected. Error paths keep each event’s original index (/events/1/...), so you can match errors back to your input.
Limits
See Rate limits for how this budget relates to the rest of the API.