Skip to main content
Use the Node.js, Python, or Go SDK for event ingestion. Each track() or Track() call sends one event; batching is explicit.
See Node.js event tracking, Python event tracking, or Go event tracking for subscription resolution and idempotency behavior.

Event envelope

A Feature that aggregates a property (sum, max, latest, weighted_sum or a custom aggregation) needs that property in properties as a number or a numeric string. An event whose value is missing, empty or not a number is still accepted, but Nozle skips it for usage limits, revenue and cost instead of counting it as 1 unit. count and unique_count Features do not read a value and count every event. An event needs external_subscription_id or external_customer_id. With only the customer, Nozle looks up that customer’s active subscription and stores the event with its external_subscription_id, as the SDKs do. The customer must have exactly one active subscription; with several, send external_subscription_id. For direct HTTP ingestion, send this envelope to POST https://api.nozle.app/engine/api/v1/events with a secret key. Send batches of 1–100 events to POST https://api.nozle.app/engine/api/v1/events/batch using an events array. Event reads and fee estimates use the Core API. Prefer the SDKs so subscription lookup, UUID generation, timeout handling, and errors remain consistent.
For retry safety, preserve the complete event payload, including timestamp, and reuse the same transaction_id. Never reuse a transaction_id for a different event: on the standard event store the first accepted event owns that identifier, the same event returns the stored one, and a different one (another code, subscription, properties or sent timestamp) gets 409 transaction_id_conflict. On the high-volume event store the repeat is accepted with 200, which does not tell you how it is counted; a repeat is deduplicated only when transaction_id and timestamp both match. Without a timestamp, each attempt is stamped when it arrives, so send one and reuse it. See deduplication.

Responses and limits

Nozle does not reject events for being old or in the future. A feature code that matches no feature is accepted but never counted, so check the event name against the feature code.

Retrying

  • Retry a network error, a timeout or a 5xx with the same transaction_id and the same payload.
  • Do not retry a 4xx. Fix the event first, because the same request gets the same answer.
  • For a batch, resend the whole batch after a failure you cannot read: a batch is either stored or rejected.
See idempotency and errors.