Developers · Ingestion

One endpoint. Everything else is a consequence.

Every product on the platform is fed by the same event spine. Connecting a facility means issuing one credential and pointing your system at one URL. There is no second project when you turn on the next product.

Attergo: the integrations screen, showing each connected system and its current state.
01

Authenticate

Per-facility credentials are resolved to a tenant before a single byte is parsed. An unauthenticated request never reaches the parser.

02

Archive

The exact bytes are written to an append-only store with the received time, the principal, the source address, the content type and a content hash. Oversized bodies spill to object storage and are referenced by key.

03

Deduplicate

A deterministic key is derived and checked against a unique index. A duplicate returns 200 and writes nothing further.

04

Queue

The request returns. Normalization happens in a worker, so your system is never waiting on our processing time.

05

Project

Workers build the views each product reads. Projections are re-runnable from the archive, which is what makes a bug in interpretation recoverable rather than permanent.

Stages 1 to 4 happen inside the request. Stage 5 is asynchronous and re-runnable.

The endpoint

What you post, and what comes back.

Events are accepted as JSON or XML over HTTPS. The content type is sniffed and both are normalized to the same internal shape, because a dispensing system that emits XML should not be a smaller customer than one that emits JSON.

POST https://api.attergo.com/ingest/pioneerrx
Authorization: Basic <per-facility credential>
Content-Type: application/json

{
  "eventType": "RxComplete",
  "eventId": "9f2c1e40-...",
  "facility": "store-1",
  "occurredAt": "2026-08-01T14:22:31Z",
  ...
}

Responses

Status Means You should
200 Accepted, or already seen. Nothing. A duplicate is not an error.
202 Accepted and archived, but not parseable. Nothing. It is in the dead-letter table and is replayable once we map it.
401 The credential is wrong, revoked or for another facility. Stop and check the credential. Retrying will not help.
5xx Our problem. Retry on your normal schedule. Retries are always safe.

Nothing is discarded for being unfamiliar. An unrecognised field is recorded for mapping review and the event still lands, so the week your vendor ships a release is not the week your integration stops.

Idempotency

The deduplication key is derived from the tenant, the event type and the vendor event identifier, falling back to a canonical hash of the payload when the vendor supplies no identifier. A unique index enforces it in the database rather than in application code, so two concurrent deliveries of the same event cannot both win a race.

You can replay your entire history at us and the result is identical to having sent it once, which is what makes onboarding a new facility safe.

Retention

Raw events are retained for a minimum of ten years. The archive is append-only at the database grant level: the application role holds no UPDATE and no DELETE permission on it, so the record cannot be edited by us or by anyone reaching us.

Other source systems

PioneerRx today, and anything that posts tomorrow.

Every vendor assumption lives in one isolated adapter package, enforced by a build gate that fails if vendor-specific parsing leaks into the core. Supporting another dispensing system, practice management system or HL7 feed means writing an adapter against a documented internal event shape, and leaving the spine, the products and the schema exactly where they are.

If you already have a system that can post JSON over HTTPS, you can send events to the same endpoint today and we will map them. Write to support@attergo.com.