> ## Documentation Index
> Fetch the complete documentation index at: https://docs.inflection.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Sending product events

> Send product activity straight to Inflection, one event or up to 5,000 at a time.

Product events are the actions your product users take in your product, like viewing a page or starting a trial. Send them with `POST /v2/product-events` (one event) or `POST /v2/product-events/batch` (up to 5,000 events). Both need a token with `WRITE` access.

```bash theme={null}
curl -X POST "https://api.inflection.io/v2/product-events" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "eventId": "event-123",
    "userId": "user-42",
    "eventName": "Viewed Page",
    "orgId": "org-7",
    "timestamp": "2026-10-21T12:00:00Z",
    "properties": { "page": "/pricing" }
  }'
```

`eventId`, `userId`, `eventName`, `timestamp`, and `properties` are required. `orgId` is optional.

## Accepted is not stored

A `202` 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.

> [!TIP]
>
> Send one test event first, then enable its event name in Product Data Explorer before you start a large backfill.

## Identity

`userId` is the product user ID used by [`POST /v2/users`](https://docs.inflection.io/api-reference/product-users/create-a-product-user). `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:

| Format | Example |
| - | - |
| ISO 8601 date-time with an offset | `2026-11-04T10:52:00Z`, `2026-11-04T10:52:00.123+05:30` |
| ISO 8601 date-time without an offset (read as UTC) | `2026-11-04T10:52:00` |
| Unix milliseconds, as an integer | `1793789520000` |

> [!WARNING]
>
> Send milliseconds, not seconds. A Unix timestamp in seconds resolves to a date in 1970.

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_EVENT` normally means the event was already accepted.

In one batch, valid events that share an `eventId` are all rejected.

## Responses

Product event responses contain only `errors` and `meta`. Accepted events are not listed individually. `meta.correlationId` identifies the request; include it when you contact support.

```json theme={null}
{
  "errors": [
    { "errorCode": "INVALID_SCHEMA", "message": "Required fields are missing.", "paths": ["/events/1/userId"] }
  ],
  "meta": { "status": "PARTIAL_SUCCESS", "timestamp": "2026-10-21T12:00:00.000Z", "correlationId": "4d36e05b-21ab-4633-b811-cf4f1ad8f72c" }
}
```

A batch returns `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

| Limit | Value |
| - | - |
| Single event request body | 256 KiB |
| Batch request body | 20 MiB, up to 5,000 events, 256 KiB per event |
| Rate limit | 3,000 units per second per workspace, burst of 15,000 |
| Cost per request | 1 unit for a single event, 2,000 units for a batch |

See [Rate limits](https://docs.inflection.io/api-reference/rate-limits.md) for how this budget relates to the rest of the API.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.