# Monitor transfers in real time

Transfer manifests move packages between facilities and change status over hours or days. Polling for status changes wastes calls and adds latency. Webhooks tell you the moment something changes.

## Subscribe to transfer events

`POST /v1/webhooks/` with `events: ["transfer.arrived", "transfer.completed"]` and your endpoint URL. SeedLink signs every delivery so you can verify it actually came from SeedLink.

## Verify and handle deliveries

Check the `X-Seedlink-Signature` header against your webhook's signing secret before trusting the payload. A `transfer.arrived` event's `data` includes the transfer's `id`, `connection_id`, and `facility_id`, enough to look up the full transfer if you need more than the event gives you.

## Reconcile on startup

Webhooks can be missed (an outage on your end, a delivery that never arrives). On startup, or on a low-frequency schedule, call `GET /v1/connections/{connection_id}/facilities/{facility_id}/transfers` and reconcile against your own records as a fallback. Don't rely on webhooks as the only source of truth.

## Test it without waiting on a real transfer

In sandbox, `POST /v1/sandbox/{connection_id}/simulate` with `"scenario": "transfer_arrived"` fires the same event your webhook would receive in production, so you can build and test the handler before any real manifest exists.

