Skip to main content
POST
Ingest events
Use your organization’s pk_ public key in the URL path. Ingest requests do not use a bearer API key.

Request body

For browser (client) tracking, send a UUID visitorId; server events can omit it when an event provides email, userId, fingerprint, or customerId for identity or account attribution. source defaults to client and also accepts server or integration. Send 1–100 events per request. When a browser user is logged in, userIdentity can provide email, a system-owned userId, and user traits for immediate resolution. customerIdentity can provide a system-owned customerId and customerTraits for account attribution across the whole batch.

Event types

All events share these common fields:

UTM parameters

Pageview event

Track a page view.
Set type to pageview. title is the page title when available.

Custom event

Track any custom event.
Set type to custom and provide an eventName. The optional properties map accepts string, number, boolean, and null values.

Form event

Track a form submission.
Set type to form. formId is the form’s ID or name; formFields holds field names and values.
Do not send passwords, payment details, or national identifiers. Outlit filters formFields using a field denylist and sensitive-value checks; these safeguards do not replace filtering at the source.

Identify event

Identify the visitor with their email/userId.
Set type to identify and provide at least one of email or your system-owned userId. traits updates the user profile. Send your system-owned customerId to link that external account or workspace to the resolved contact; customerTraits updates its profile.

Engagement event

Track active time on a page. Automatically sent by the Outlit Browser SDK.
Set type to engagement. Send activeTimeMs for visible-tab interaction time and totalTimeMs for total wall-clock time on the page. sessionId is a UUID that groups engagement events and resets after 30 minutes of inactivity or when the tab closes.

Calendar event

Track calendar booking from embedded widgets (Cal.com, Calendly).
Set type to calendar and provider to cal.com, calendly, or unknown. eventType names the meeting; startTime and endTime use ISO 8601, duration is in minutes, and isRecurring indicates a recurring meeting. inviteeEmail and inviteeName are available only through server-side webhooks.

Response

Success response

processed counts the successfully processed events. Inspect errors when success is false.

Partial success response (HTTP 207)

When some events succeed and others fail:

Error response

Examples

cURL - browser events

cURL - server events

JavaScript (fetch)

Python

Server-side events

For server-side tracking, the visitorId field can be omitted. Identity is resolved from the event data, including customer-only attribution when customerId is provided:
  • Identify events: Use email and/or userId fields, plus optional customer context
  • Custom events: Include top-level email, userId, fingerprint, and/or customerId fields
Server events require identity or account attribution. Custom events need at least one of email, userId, fingerprint, or customerId; identify events need email or userId.

Batching best practices

For high-volume tracking:
  1. Batch events - Send multiple events per request (up to 100)
  2. Use background queue - Don’t block user actions
  3. Retry with backoff - Handle temporary failures
  4. Flush on shutdown - Send remaining events before exit

Path Parameters

publicKey
string
required
Minimum string length: 1

Body

application/json
visitorId
string<uuid>
required
Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
events
(Pageview event · object | Form event · object | Identify event · object | Custom event · object | Calendar event · object | Engagement event · object)[]
required
Required array length: 1 - 100 elements
fingerprint
string
Minimum string length: 1
source
enum<string>
default:client
Available options:
client,
server,
integration
sessionId
string<uuid>
Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
userIdentity
object
customerIdentity
object

Response

Ingestion result

success
boolean
required
processed
integer
required
Required range: 0 <= x <= 9007199254740991
errors
object[]