Versioning
How the Agoo API changes over time, what counts as a breaking change, and how to write an integration that keeps working.
This is a published preview. Names and fields may still change before general availability; changes will be listed in the changelog.
The major version is in the path: https://api.agoo.ardent.africa/v1. Within a major version, Agoo only makes changes that a well-behaved integration can ignore. Anything that could break one waits for a new major version, which runs alongside the old one for at least 12 months.
During the preview
The API is in preview (version 1.0.0-preview of the contract) while it is built in phase P9. Until general availability, names and fields may still change. Every change, breaking or not, is listed in the changelog. Build against test mode now, and check the changelog before you go live. The guarantees below apply to /v1 from general availability.
Changes that ship without notice
These are additive. They can arrive at any time, in the API and in webhook payloads:
- new endpoints;
- new optional request fields and query parameters;
- new fields in responses and in event objects;
- new values in enums, such as a new visit
status, attendancemethodor errorcode; - new event types;
- new response headers;
- changes to the wording of
detailin errors, and to the order of fields in JSON.
Breaking changes
These happen only in a new major version, such as /v2:
- removing or renaming an endpoint, field, parameter or event type;
- changing a field's type or format;
- making an optional request field required, or adding a required one;
- changing what an existing field or status means;
- changing the error
codereturned for an existing situation; - changing how events are signed.
When a new major version ships, the old one keeps working, unchanged, for at least 12 months. The changelog announces the date it will be switched off well before then.
Write a tolerant integration
Your code keeps working through additive changes if you:
- Ignore fields you don't know. If you generate a client from the OpenAPI document, make sure it doesn't reject unknown properties.
- Handle unknown enum values. Treat a status or method you haven't seen as "other": log it and carry on, rather than crashing.
- Ignore unknown event types. Return
2xxfor events you don't handle, so Agoo doesn't retry them and eventually disable your endpoint. Better still, subscribe only to the event types you use. - Branch on error
code, never ondetail. - Don't depend on field order or on the exact length of IDs and cursors.
switch (visit.status) {
case "checked_in":
showOnSite(visit)
break
case "checked_out":
markLeft(visit)
break
default:
// expected, awaiting_approval, denied, cancelled, no_show, or a status added later
logUnhandledStatus(visit.status)
}Webhooks and versions
Event payloads follow the same rules as the API: an event's data.object has the same shape as the object returned by its endpoint in the same major version. Additive changes can appear in payloads without notice, and breaking changes come only with a new major version.