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.