API reference / Analytics

post/v2/track

Ingest analytics events

Operation
trackEvents
Authentication
API key

Batched, because East African mobile connections make a request per event wasteful and the client buffers offline anyway. Two rules are enforced here rather than trusted to the client: event names come from the closed enum in @haavisa/analytics and an unknown name is rejected rather than stored, and known PII keys are refused — this endpoint is the boundary between our data and a third-party analytics provider, and the last place a passport number can be stopped from leaving.

Request

Body

eventsAnalyticsEvent[]required

Responses

202Stored, not yet forwarded. A partially rejected batch is not worth retrying the good half for.
acceptedintegerrequired
rejectedintegerrequired
rejectionsobject[]
400The request body or query failed validation.
errorobjectrequired
401No key, an unknown key, a revoked key, or a key whose tenant is not active. All four return an identical body on purpose: distinguishing them would let a caller discover which partners we have.
errorobjectrequired
403The key is valid but does not hold the scope this route requires.
errorobjectrequired
404Not found, or not yours. A resource belonging to another tenant answers 404 rather than 403, because 403 would confirm the record exists.
errorobjectrequired

Example

curl
curl -X POST https://api.haavisa.com/v2/track \
  -H "Authorization: Bearer $HAAVISA_API_KEY"

Something unclear? The eligibility guide explains the model behind the answers; the errors guide covers the envelope.