Who this is for: Backend developers and integrators sending server-side events. Mobile/web app actions should use an SDK instead.Complete reference for all Zixflow event ingress API endpoints — what each one does, when to use it, how to authenticate, and what to send. For Mintlify API playground pages (request/response fields), see the Events API Reference under Zixflow AI.
API vs SDK: When to Use Which
Zixflow exposes two surfaces for sending data: the client/server SDKs and the HTTP API.
Rule of thumb: If the event happens because a user tapped something in your app, use an SDK. If the event happens on your server (fulfillment, billing, fraud detection), use the API directly.
Authentication
Both API groups use the same scheme:Two API Groups
The service exposes two distinct API groups, each serving a different use case:Data Pipelines API (/v1/)
These endpoints accept event data in Segment-compatible format. All endpoints under /v1/ share the same auth middleware and rate limiter.
All requests accept: Content-Type: application/jsonAll success responses:
HTTP 200 with empty body {}
POST /v1/identify (alias: /v1/i)
Purpose: Create or update a user profile. Call this when a user signs up, logs in, or when you want to update their attributes.
When to use:
- User signs up or logs in → call identify with their userId and traits
- User updates their profile (name, email, plan) → call identify with updated traits
- Merging anonymous pre-signup activity → call identify with both
userIdandanonymousId
*At least one of
userId or anonymousId is required. Providing both triggers identity merge.
What happens:
- If
userIdis new → creates a new user profile - If
userIdexists → mergestraitswith existing profile (additive, not replace) - If both
userId+anonymousIdprovided → links all anonymous events to the identified profile
POST /v1/track (alias: /v1/t)
Purpose: Record a user action or business event. The most commonly used endpoint for custom event tracking.
When to use:
- Any user action: button tapped, purchase completed, feature used
- Business events from your server: subscription renewed, payment failed
- Device lifecycle:
Application Installed,Application Opened(SDK sends these automatically)
*At least one of
userId or anonymousId is required.
Semantic events — certain event names trigger special handling beyond the standard event pipeline:
POST /v1/screen (alias: /v1/s)
Purpose: Record a mobile screen view. Used by the Flutter SDK automatically when autoTrackScreenViews: true is configured, or manually when you want to attach screen-specific properties.
When to use:
- Mobile apps to track navigation flow
- Attribute screen-level data (product ID, category) to the view event
POST /v1/page (alias: /v1/p)
Purpose: Record a web page view. Equivalent to /v1/screen but for web apps.
When to use:
- Web apps and marketing sites
- Track specific page metadata (title, URL, referrer)
POST /v1/batch (alias: /v1/b)
Purpose: Send multiple events in a single HTTP request. This is what the Flutter SDK uses under the hood — the SDK queues events locally and sends them as a batch every 30 seconds or after 20 events accumulate.
When to use:
- The SDK handles this for you automatically
- If calling the API directly from a server and you have multiple events to send, prefer
/batchover individual calls to reduce latency and network overhead
type values:
Group and Alias are not supported. Do not send
type: "group" or type: "alias".
Limits:
- Minimum: 1 item per batch
- Maximum: 100 items per batch
- Items are processed concurrently
type field to identify the kind.
Track API v1 (/api/v1/customers/)
Server-side endpoints for user and device lifecycle management. Use these from your backend — not from mobile apps.
Auth: Same as Data Pipelines — Authorization: Basic base64(api_key:)User identifier: Passed in the URL path (
/:identifier), not the request body
PUT /api/v1/customers/:identifier
Purpose: Create or update a user profile. Server-side equivalent of /v1/identify.
When to use:
- Your backend creates a user and wants to push their profile to Zixflow
- Updating user attributes from your server (plan change, billing update)
- Attributes are flat key-value (not nested under
traits) - Timestamps must be Unix seconds (not ISO 8601)
:identifieris your user ID
POST /api/v1/customers/:identifier/events
Purpose: Track an event for a specific user. Server-side equivalent of /v1/track.
When to use:
- Order fulfilled (triggered by your fulfillment system, not the user’s app)
- Payment received / payment failed (from billing system)
- Subscription renewed (from subscription service)
- Any event your server generates, not the user’s device
- Event name goes in
name(notevent) - Event data goes in
data(notproperties) - Timestamp is Unix seconds
PUT /api/v1/customers/:identifier/devices
Purpose: Register a push notification device token for a user.
When to use:
- Your server manages push token registration (less common — the Flutter SDK handles this automatically via
registerDeviceToken()) - Server-side integrations that need to register tokens on behalf of users
DELETE /api/v1/customers/:identifier/devices/:token
Purpose: Remove a specific device token from a user. Call this when a user logs out of a device (so they don’t receive push on a device they’re no longer signed in to).
Request body: Empty
Effect: Soft-deletes the device record — sets active=false, push_enabled=false.
DELETE /api/v1/customers/:identifier
Purpose: Delete a user profile.
Request body: Empty
Effect: Sets is_deleted=true on the profile and deactivates all linked devices. The profile record and event history are preserved for analytics — this is a soft delete.
When to use:
- User requests account deletion (GDPR right to erasure)
- Account cleanup / fraud removal
POST /api/v1/customers/:identifier/suppress
Purpose: Suppress all outbound messages for a user across every channel simultaneously.
Request body: Empty
Effect: Sets is_suppressed=true on the profile. No push notifications, emails, SMS, WhatsApp, or RCS will be sent to this user until unsuppressed.
When to use:
- User has opted out of all communications
- Account is suspended or in bad standing
- Compliance hold
email_opt_out, push_opt_out, etc.) is per-channel. Suppression blocks everything with a single flag.
POST /api/v1/customers/:identifier/unsuppress
Purpose: Lift suppression and resume message delivery for a user.
Request body: Empty
Effect: Clears is_suppressed flag. Message delivery resumes on all channels the user hasn’t individually opted out of.
GET /api/v1/customers/:identifier/subscription_preferences
Purpose: Retrieve the current channel opt-out state for a user.
Query parameters:
Example:
email_opt_out, sms_opt_out, push_opt_out, whatsapp_opt_out, rcs_opt_out) with their opt-out timestamps.