Skip to content

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.

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.

    API reference

  • SDKs


    Minimal Python and JavaScript examples to get going fast.

    SDKs