---
title: "Records analytics events from a client SDK."
method: POST
path: "/v1/client/events"
tags: ["Client SDK"]
---

# Records analytics events from a client SDK.

`POST /v1/client/events`

## Request

- Base URL: `https://eval.featureflip.io`
- URL: `https://eval.featureflip.io/v1/client/events`
- Auth: API key in header `Authorization`

The client-surface counterpart of `POST /v1/sdk/events`, for SDKs that authenticate
with a client key. The mobile SDKs (Swift, Android, Flutter) use this to report
`track()` calls. Server SDKs keep using `/v1/sdk/events`.
            
A client that sends `X-Featureflip-Reports-Evaluations: 1` on `evaluate` and
`identify` reports the flags its code actually reads here, as `Evaluation` events
(one per flag, variation and user is enough). For clients that don't send the header, this
API records the evaluations it serves on their behalf.
            
Because a client key is public by design, this endpoint is rate limited per client IP,
limits the size of a request, and caps the number of events in one request. An event that
exceeds one of the following per-event limits is discarded on its own; the rest of the
batch is still recorded, and the response is unchanged:
            
- its `timestamp` sits far outside the present;
- its `flagKey` is longer than 256 characters;
- it is a `Custom` event introducing more than 50 distinct event keys in one request.
  Repeats of a key already in the request are always recorded, so this bounds how many
  distinct event names a single batch can introduce, not how many events it may carry.

## Request body

- RecordEventsRequest
  - `events` SdkEventDto[], nullable, required
    - `type` 'Evaluation' | 'Impression' | 'Identify' | 'Custom', required
    - `flagKey` string, nullable, required
    - `userId` string, nullable
    - `variation` string, nullable
    - `timestamp` string, date-time
    - `metadata` object, nullable
    - `prerequisiteKey` string, nullable

## Response `202`

Events were accepted for processing.

## Other responses

- `400`: The batch exceeds the maximum number of events per request.
- `401`: Client SDK key is missing or invalid.
- `413`: The request body is larger than this endpoint accepts.

---

[API](https://skmtc.dev/featureflip/apis/featureflip-evaluation-api.md) · [All operations](https://skmtc.dev/featureflip/apis/featureflip-evaluation-api/llms.txt) · [OpenAPI document](https://skmtc.dev/featureflip/apis/featureflip-evaluation-api/revisions/1f5311d7fc25?raw)
