Track events from your product
using System.Net.Http.Headers;var client = new HttpClient();var request = new HttpRequestMessage{ Method = HttpMethod.Post, RequestUri = new Uri("https://dashboard.azimea.com/api/v1/events"), Headers = { { "Authorization", "Bearer <token>" }, }, Content = new StringContent("{ \"events\": [ { \"id\": \"evt_7f3c2a\", \"name\": \"user.signed_up\", \"occurredAt\": \"2026-10-05T09:30:00+00:00\", \"contact\": { \"externalId\": \"user_123\", \"email\": \"ana@example.com\" }, \"properties\": { \"plan\": \"trial\", \"source\": \"landing-page\" } } ] }") { Headers = { ContentType = new MediaTypeHeaderValue("application/json") } }};using (var response = await client.SendAsync(request)){ response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);}const url = 'https://dashboard.azimea.com/api/v1/events';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"events":[{"id":"evt_7f3c2a","name":"user.signed_up","occurredAt":"2026-10-05T09:30:00+00:00","contact":{"externalId":"user_123","email":"ana@example.com"},"properties":{"plan":"trial","source":"landing-page"}}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://dashboard.azimea.com/api/v1/events \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "events": [ { "id": "evt_7f3c2a", "name": "user.signed_up", "occurredAt": "2026-10-05T09:30:00+00:00", "contact": { "externalId": "user_123", "email": "ana@example.com" }, "properties": { "plan": "trial", "source": "landing-page" } } ] }'Tells Azimea what people did in your product (user.signed_up, trial.ending, kyc.completed). Each event is recorded on the person’s timeline and starts every published flow whose trigger is that event name; the person is found, or created, from contact (the same object POST /contacts takes, with at least id, externalId or email). Send up to 100 events per call; a call counts once for the rate limit. id is your own id, unique in your account: sending it again is counted as a duplicate, so retries are safe. Names use lowercase letters, digits, _ and ., start with a letter, at most 64 characters; the prefixes order., cart., customer., subscriber., contact., email. and azimea. are reserved. occurredAt may be up to 30 days in the past and not in the future; properties is a JSON object of at most 16 KB and 3 levels. Each event is accepted or rejected on its own, with activity.* codes per field. Needs the events:write permission.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
object
Example
evt_7f3c2aExample
user.signed_upExample
2026-10-05T09:30:00+00:00Example
{ "externalId": "user_123", "email": "ana@example.com"}Example
{ "plan": "trial", "source": "landing-page"}Example
[ { "id": "evt_7f3c2a", "name": "user.signed_up", "occurredAt": "2026-10-05T09:30:00+00:00", "contact": { "externalId": "user_123", "email": "ana@example.com" }, "properties": { "plan": "trial", "source": "landing-page" } }]Example
{ "events": [ { "id": "evt_7f3c2a", "name": "user.signed_up", "occurredAt": "2026-10-05T09:30:00+00:00", "contact": { "externalId": "user_123", "email": "ana@example.com" }, "properties": { "plan": "trial", "source": "landing-page" } } ]}Responses
Section titled “Responses”How many events were accepted, were duplicates, or were rejected (with the reasons per event)
object
object
object
object
object
object
object
object
object
object
Example
{ "isSuccess": true, "value": { "accepted": 1, "duplicates": 0, "rejected": [] }, "status": 0, "errors": [], "fieldErrors": null}Validation failed: no events, or more than 100 (activity.batch_too_large)
object
object
Example
{ "statusCode": 400, "message": "One or more errors occurred!"}Missing or invalid API key
The key lacks the events:write permission