Skip to content

Versioning & Deprecation

The version is a path segment, and it is the only place it appears:

https://api.zelnum.com/api/v1

There is one live version. Its identity in the OpenAPI document is 1.0.0; the path segment v1 is what you target. Response bodies deliberately do not repeat a version, so there is no second field to keep in sync.

ClassExamplesEffect on you
AdditiveA new endpoint, a new optional request field, a new response field, a new product in the catalogNone. No version bump, no action.
BehaviouralA new value inside an existing enum such as error_code or billing_status; a changed defaultUsually none, but it can break exhaustive matching.
BreakingRemoving or renaming a field, changing a type, changing what a status means, requiring a new headerRequires a new version.
ContractThe documentation was wrong about what the API doesNone — but see below.

Documentation is corrected in place when the API’s behaviour was misdescribed. That is a documentation change, not a contract change: the API did not move, the description did. Because a correction is exactly the event you cannot see in a changelog entry of the form “nothing changed”, corrections are listed explicitly in the changelog.

If a correction changes something you had built against, it appears there as a note rather than a silent edit.

When an operation is deprecated it is marked deprecated: true in the OpenAPI document, and this site documents the replacement. The operation keeps working for the notice period, and the notice period is stated where the deprecation is announced.

A deprecation is never the same release as its replacement’s introduction. Both are live at once, so you can migrate on your own schedule rather than during an incident.

POST /v1/realtime/detect is retained for pre-release clients and is marked deprecated in the contract. New integrations should use the series-specific endpoints.

It is a rename, not a redesign — the request body and the response are the same shape:

LegacyCurrent
EndpointPOST /v1/realtime/detectPOST /v1/realtime/check/phone or POST /v1/realtime/check/email
SeriesImplied by the products you sendExplicit in the path, and it must match them
Products fieldproducts (alias)product_ids
Idempotency-KeyRequiredRequired

Migrating is a two-line change:

Terminal window
# Before
curl -X POST "https://api.zelnum.com/api/v1/realtime/detect" \
-H "X-API-Key: YOUR_KEY_HERE" \
-H "Idempotency-Key: UNIQUE_REQUEST_ID" \
-H "Content-Type: application/json" \
-d '{"identifier":"+8613800138000","products":[47]}'
# After — the series moves into the path and the field is renamed
curl -X POST "https://api.zelnum.com/api/v1/realtime/check/phone" \
-H "X-API-Key: YOUR_KEY_HERE" \
-H "Idempotency-Key: UNIQUE_REQUEST_ID" \
-H "Content-Type: application/json" \
-d '{"identifier":"+8613800138000","product_ids":[47]}'

Sending both product_ids and products in one request is rejected as 400 invalid_realtime_request, so the two must not be mixed during a staged rollout.

  • OpenAPI — the machine-readable contract, including the deprecated flag
  • Changelog — what changed, and when