Skip to main content
Every letter leaves a trail. Dairo tracks each letter through printing, posting, and delivery, and keeps its status and event timeline current — there is no carrier feed for you to integrate. Read the letter back by id, subscribe to a webhook event, or let Dairo email you at each milestone.

The lifecycle

A letter’s status is a stable enum you can build on. The happy path runs:
An undeliverable letter cannot be re-routed — correct the address and create a new letter. A failed letter was never posted; fix the document and create it again.
Cancellation is only possible before dispatch — while a letter is draft, queued, processing, printable, or submitted. Once it is in_transit it cannot be recalled; a late cancel returns 409 with code: "letter_not_cancelable". The cancel call itself is on Send a letter.

The event timeline

Alongside its status, each letter carries a list of letter_event objects — the detailed delivery timeline. The timeline comes inlined on GET /v1/letters/{id} (newest first, up to 100 events) or on its own from GET /v1/letters/{id}/events.
Order a letter’s history by occurredAt, not the time you fetched it — delivery updates can land slightly out of order.

Track a letter

Poll it. The most direct way to follow a letter is to fetch it by id: GET /v1/letters/{id} returns the current status, the trackingNumber once a tracked class provides one, and the event timeline. Fetching an in-flight letter refreshes its tracking state, so a poll returns the latest known status. Subscribe to it. Every status change emits a letter.status_changed event carrying the letterId, the new status, and the batchId when the letter belongs to a batch. Point a webhook at your endpoint to receive it. The same event is also kept in the durable event stream, alongside everything else happening in your account. These events fire regardless of the email notifications setting below.

Owner email notifications

Dairo can also email the account owner at each delivery milestone — no code, no endpoint. When a letter reaches a milestone, the owner gets a short status email (“Your letter to Zürich, CH is on its way”), with the tracking number when there is one and a link to the letter’s timeline in the dashboard. Milestone emails are on by default. Turn them off for a single letter with notifications: false — useful for high-volume sends where you would rather watch the timeline than receive an email per milestone. Batches accept the same flag once for the whole run.

When a notification email is sent

An email goes out only when the status changes into one of the delivery milestones — once per transition, never for a re-confirmed update, and never for internal churn like queued or processing. The remaining statuses — draft, queued, processing, printable, and canceled — never trigger an email.

Next steps

  • Send a batch — track many letters together with a live per-status rollup.
  • Pricing — what a letter costs before you send it.