POST /v1/events

Send a single event

Use this for one-off events from server-side code or low-volume client paths. For repeated ingestion the batch endpoint is more efficient.

POST /v1/events HTTP/1.1
Host: api.getfluxly.com
Authorization: Bearer gflux_pub_abcdef1234
Content-Type: application/json

{
  "event": "subscription_started",
  "anonymous_id": "anon_a8f3c2",
  "external_id": "user_42",
  "properties": {
    "plan": "pro",
    "currency": "usd",
    "value": 99
  },
  "timestamp": "2026-05-16T07:00:00Z"
}

Request body

| Field | Type | Required | Notes | | --- | --- | --- | --- | | event | string | yes | Snake_case event name, ≤ 64 chars | | anonymous_id | string | one of | Browser-side identifier from the SDK | | external_id | string | one of | Your application's user ID | | user_id | string | one of | GetFluxly resolved profile ID (server-side flows) | | properties | object | no | Event-specific properties, ≤ 32 keys | | timestamp | ISO 8601 | no | Defaults to server receipt time | | context | object | no | Optional client/device context envelope |

At least one of anonymous_id, external_id, or user_id must be present. See Identity model.

Response, 202 Accepted

{
  "accepted": 1,
  "rejected": 0,
  "request_id": "req_b3a8c2d1e"
}

The response confirms intake, not delivery. Events are processed asynchronously by the analytics + identity workers.

Errors

| HTTP | error | When | | --- | --- | --- | | 400 | validation_error | Missing required field, bad shape | | 401 | unauthenticated | Missing or invalid API key | | 403 | wrong_key_type | Publishable key used on a server-only event shape | | 413 | payload_too_large | Event body over 32 KB | | 429 | rate_limited | Per-key bucket exhausted, see Retry-After header |

Full table at errors.