Sending data¶
The ingestion API is how you get data into Pulse. You send events that match one of your schemas, and Pulse validates them, stores them, and — for datasets enabled for unified profile — folds them into your customer profiles in real time.
All requests use the hosted base URL https://api.azothedge.com and include your API key. Sending data is a write, so you need an editor-or-higher key. See Authentication.
Send an event¶
POST /v1/collect accepts a single event. The body identifies the schema the event conforms to, a timestamp, and the event payload:
POST /v1/collect HTTP/1.1
Host: api.azothedge.com
Authorization: Bearer <your-api-key>
Content-Type: application/json
{
"schema_id": "<your-schema-id>",
"timestamp": "2026-06-16T10:30:00Z",
"payload": {
"personalEmail": { "address": "ada@example.com" },
"person": { "name": { "firstName": "Ada", "lastName": "Lovelace" } }
}
}
By default, ingestion is asynchronous. Pulse accepts the event for processing and immediately returns 202 Accepted:
{
"event_id": "01J9Z2K7P0QJ3M8V4N6T2X5R9C",
"status": "accepted"
}
The event_id is your handle for the event if you need to reference it later.
Validate inline¶
When you want to know immediately whether an event is valid — for example, while building or testing an integration — add ?syncValidation=true. Pulse validates the event against the schema inline and returns 200 OK with the result instead of queuing it:
POST /v1/collect?syncValidation=true HTTP/1.1
Host: api.azothedge.com
Authorization: Bearer <your-api-key>
Content-Type: application/json
{
"schema_id": "<your-schema-id>",
"timestamp": "2026-06-16T10:30:00Z",
"payload": {
"personalEmail": { "address": "ada@example.com" }
}
}
A passing event returns:
{ "status": "pass", "errors": [] }
A failing event returns the same shape with the problems listed:
{
"status": "fail",
"errors": [
{ "path": "person.name.firstName", "message": "expected string, received number" }
]
}
Inline validation is for checking, not high throughput
Use inline validation while developing and for low-volume checks. For production ingestion, send events asynchronously (the default) so Pulse can absorb your traffic.
Errors¶
| Status | When it happens |
|---|---|
| 202 Accepted | The event was queued (asynchronous mode, the default). |
| 200 OK | Inline validation ran (?syncValidation=true); see status for pass or fail. |
| 422 Unprocessable Entity | The event doesn't match the referenced schema, or the payload is too large. |
| 429 Too Many Requests | You exceeded the rate limit for inline validation. Retry with backoff, or switch to asynchronous ingestion. |
| 401 / 403 | Missing/invalid key, or a read-only key used for this write. See Authentication. |
Link identifiers¶
Sending events tells Pulse what happened. To tell Pulse who it happened to — and to connect the identifiers that belong to the same person — use POST /v1/identify. It links one or more identifiers to a profile and returns that profile's id:
POST /v1/identify HTTP/1.1
Host: api.azothedge.com
Authorization: Bearer <your-api-key>
Content-Type: application/json
{
"identifiers": [
{ "namespace": "email", "value": "ada@example.com" },
{ "namespace": "loyalty_id", "value": "LYL-90210" }
]
}
{ "profile_id": "01J9Z3B4D7E0F1G2H3J4K5M6N7" }
To connect an anonymous identifier (such as a pre-login app or web visitor) to a known person, use POST /v1/alias. Together these keep one person from appearing as many separate profiles.
To understand how Pulse decides which records belong to the same person, see How identity works.
Next steps¶
-
Full API reference
Every endpoint and field, in an interactive reference.
-
SDKs
Minimal Python and JavaScript examples to get going fast.