Skip to main content
Every partner API request must declare which API version it targets. That lets Endl ship new versions and change behaviour without breaking existing integrations: you pin a version, and it keeps working.

The header

You send it on the request; Endl echoes it back on the response.
Request — you send
Response — Endl echoes
The echoed value is the version that actually served the request, so you can assert on it in monitoring and tests rather than assuming.
Api-Version is not Api-Key. One carries the API version, the other carries your credential. They are two separate headers and you send both.

Format

YYYY-MM.<release> — the year and month the version was cut, plus a release number within that month. Validated against ^\d{4}-\d{2}\.\d+$.

Supported versions

New versions are added here as they ship. Pin the version you built against — older supported versions keep their behaviour.

Validation and errors

The header is validated once, centrally, for the whole partner surface.
400
CORS preflight is exempt. An OPTIONS request needs no version header.

Examples

A valid request carries both headers:
Response
Omit the header and the call is refused before anything is processed:
400

Why it works this way

Non-breaking evolution. New request and response shapes ship under a new version. The version you pinned is untouched. An explicit contract. Every call states the version it expects, so an upgrade is a deliberate change on your side rather than a surprise on ours. Confirmable. The response echoes the version that served it, so you can assert on it in monitoring and tests.

Upgrading

When a new version ships, test your integration against it, then bump the Api-Version value you send. Nothing in your code path changes until you do.
This is separate from the webhook payload schemaVersion, which is also calendar-versioned but pinned per subscription rather than per request. See payload schema versions.