---
title: "Change delivery"
method: POST
path: "changeDelivery"
tags: ["Changes & History"]
---

# Change delivery

`POST changeDelivery` (webhook)

Sent to each endpoint registered on a watchlist, once a day at 05:30 UTC,
when that list has changes the endpoint has not yet received. Nothing is
sent on a day with no changes.

**Verify the signature before parsing the body** — see *Webhooks* in the
introduction for the `X-Apino-Signature` scheme and a worked
implementation. Compute the HMAC over the raw bytes: re-serialising the
JSON changes them and the signature will not match.

This is declared as an OpenAPI 3.1 webhook so tooling and code
generators see it. The Scalar reference does not render the `webhooks`
section, which is why the payload is also written out under *Webhooks*
in the introduction — that is the copy a reader will actually find.

**`event_id` is stable across retries.** A failed delivery leaves the
cursor where it was, so the retry covers the same window and carries the
same id. Deduplicate on it — a receiver that acts twice on one id will
act twice on the same change.

Deliveries are retried three times with backoff. Redirects are never
followed: a redirect is a second URL nobody checked.

## Payload

- WebhookPayload
  - `event_id` string, required: Stable across retries of the same window. Deduplicate on it.
  - `test` boolean: Present and true only on a ping. A ping is shaped like a real delivery on purpose — it proves your signature check and parsing work — so act on this flag rather than on the empty `changes`.
  - `watchlist` object, required
    - `id` string, required
    - `name` string, required
  - `changes` OrganizationChange[], required
    - `id` integer: Change record ID
    - `organization_id` integer: Organization ID
    - `country_code` 'SK' | 'CZ': Country the organization belongs to.
    - `identifier` string: CIN at time of change
    - `organization_name` string: Company name at time of change
    - `change_type` string: Type of change (e.g. name, address, legal_form)
    - `old_value` string: Previous value (simple text fields); absent when there was none
    - `new_value` string: New value (simple text fields); absent when there is none
    - `old_data` unknown
    - `new_data` unknown
    - `sync_date` string, date-time: Date from the RPO export file. A timestamp at midnight UTC (`2018-03-02T00:00:00Z`); only the date part carries meaning.
    - `detected_at` string, date-time: When the change was detected by our system
    - `source` 'daily' | 'historical' | 'tax' | 'ruz' | 'peppol': Origin of the change: `daily` — detected from the daily register sync; `historical` — extracted from the register's own validity dates; `tax` — the Slovak Financial Administration's lists or the Czech VAT register; `ruz` — the Register of Financial Statements; `peppol` — the Peppol e-invoicing network. New values may be added.
  - `cursor` integer, required: The id of the last change in this delivery. The same value you would pass to `GET /changes?since_id=` to continue by polling instead.
  - `has_more` boolean, required: True when more changes were waiting than one delivery carries; the next run continues from `cursor`.

## Acknowledgement `2xx`

Any 2xx marks the delivery received and advances the endpoint's
cursor. Anything else is retried; five failed runs pause the
endpoint.

---

[API](https://skmtc.dev/apino/apis/apino-api.md) · [All operations](https://skmtc.dev/apino/apis/apino-api/llms.txt) · [OpenAPI document](https://skmtc.dev/apino/apis/apino-api/revisions/d172569847cd?raw)
