FlagFix
API referenceReferenceIngestion

Ingérer un lot d'événements analytics

Persiste durablement les événements valides, déduplique par `(project, environment, eventId)`, retourne un accusé partiel. Limites V1 : - max 100 events par lot - max 256 KiB corps sérialisé UTF-8 - max 32 KiB par événement sérialisé Rate limit : compteur Redis partagé multi-instance (repli mémoire si Redis down).

POST
/api/v1/ingest/events

Persiste durablement les événements valides, déduplique par (project, environment, eventId), retourne un accusé partiel.

Limites V1 :

  • max 100 events par lot
  • max 256 KiB corps sérialisé UTF-8
  • max 32 KiB par événement sérialisé

Rate limit : compteur Redis partagé multi-instance (repli mémoire si Redis down).

Header Parameters

X-FlagFix-Sdk-Key*string

Clé d'environnement complète {prefix}.{secret}. Le serveur en dérive projectId, environmentId et keyType. CLIENT_SDK et SERVER_SDK acceptés selon l'opération.

Request Body

application/json
  1. body
events*array<>
Items1 <= items <= 100

Response Body

Accusé après commit durable. Tous les eventId du lot devraient apparaître dans acceptedIds, duplicateIds ou rejected. Un id absent est traité par le SDK comme non confirmé.

application/json
  1. response
acceptedIds*array<string>

Persistés durablement dans ce lot

duplicateIds*array<string>

Déjà connus pour ce project/environment — idempotent

rejected*array<>
Example Request
curl -X POST 'http://localhost:18080/api/v1/ingest/events' \  -H 'X-FlagFix-Sdk-Key: ff_development_client-sdk.abc123…' \  -H 'Content-Type: application/json' \  -d '{  "events": [    {      "schemaVersion": 1,      "eventId": "evt_01JBEXAMPLE000000000000001",      "kind": "track",      "name": "checkout_started",      "occurredAt": "2026-11-02T10:00:00.000Z",      "userId": "user_123",      "anonymousId": "$device:9f3c2a1b-4d5e-6789-abcd-ef0123456789",      "sessionId": "ses_01JBEXAMPLE",      "properties": {        "productId": "product_456",        "amount": 12000      },      "context": {        "page": {          "url": "https://app.example/checkout"        },        "library": {          "name": "@flagfix/browser",          "version": "0.1.0"        }      },      "sdk": {        "name": "@flagfix/browser",        "version": "0.1.0"      },      "sourceInstanceId": "tab_7c2a",      "sequence": 12    },    {      "schemaVersion": 1,      "eventId": "evt_01JBEXAMPLE000000000000002",      "kind": "exposure",      "name": "$exposure",      "occurredAt": "2026-11-02T10:00:01.000Z",      "userId": "user_123",      "properties": {        "featureKey": "new_checkout",        "variant": "on",        "configurationVersion": 12      },      "sdk": {        "name": "@flagfix/browser",        "version": "0.1.0"      },      "sourceInstanceId": "tab_7c2a",      "sequence": 13    }  ]}'
Example Response
{  "acceptedIds": [    "evt_01JBEXAMPLE000000000000001"  ],  "duplicateIds": [    "evt_01JBEXAMPLE000000000000002"  ],  "rejected": [    {      "eventId": "evt_01JBEXAMPLE000000000000003",      "code": "INVALID_PROPERTIES",      "retryable": false,      "message": "properties must be a JSON object"    }  ]}

Was this page useful?