v1. The endpoints for sessions, fingerprints, agents, organizations, and webhooks live under /v1/.
/v2/collect/. The SDKs manage that transport for you, so this page describes versioning for the REST API.
Version numbers in the path signal major, breaking releases. Inside a major version, the API evolves continuously - we add fields, enum values, and endpoints without bumping the version. Pinning to /v1/ gives you a stable contract for the life of that major.
What’s additive (safe to adopt)
The following kinds of changes can appear inside a major version without notice, and your integration should handle them gracefully:- New endpoints. New paths under
/v1/may be added at any time. - New optional request fields. New parameters on existing endpoints are always optional - existing requests continue to work unchanged.
- New response fields. Additional fields may be added to any response object. Treat response shapes as open - deserialize the fields you care about and ignore the rest.
- New enum values. New values may be added to existing enums (verdict categories, attribution facets, error codes). Don’t switch on a closed set; include a default branch.
- New error codes. The error
codenamespace grows over time. Branch on the category prefix (auth.*,request.*,rate_limit.*) when you want broad handling; branch on the specific code only where your UX needs the precision. - New webhook events. New event types may be added and delivered alongside existing ones. Acknowledge and ignore event types you don’t recognize rather than rejecting them.
What’s breaking (announced in advance)
Changes that could break an existing integration get a version bump or, for surgical cases, a deprecation notice with a migration path. Examples of what counts as breaking:- Removing a field from a response
- Renaming a field
- Changing a field’s type (
string→number, nullable → non-nullable, etc.) - Changing the semantics of an existing field or enum value
- Removing an endpoint
- Making a previously-optional field required
- Changing authentication requirements on an endpoint
- Changing the default behavior of an endpoint in a way that surprises existing callers
/v1/.
Deprecation and sunset
When a specific endpoint, field, or behavior needs to go, we follow a staged process inside the current major:- Announcement. For material changes, Foil emails the organization owner on record for each affected organization.
- Grace period. The old behavior continues to work alongside the new one. The documented sunset date is never less than 90 days from the announcement for live-mode behavior; test-mode deprecations may be shorter.
- Sunset. After the grace period, the old behavior is removed. Requests to a removed endpoint return
404with the coderequest.not_found, and the message names the replacement where one exists. For fields, the field is simply absent from responses. A retired version of the Collect API transport returns426with the codetransport.upgrade_required, and the fix is to update the browser or mobile SDK.
Pinning to a version
The only version pin you need is the/v1/ in the URL. As long as you keep calling /v1/, you’ll stay on the stable major contract.
We do not offer dated API versions (e.g. API-Version: 2025-04-16) - additive evolution inside /v1/ is the design. If that ever changes, the current /v1/ contract is what we’d continue to honor until a new major version of the REST API ships.
When a new major version ships
If we release a new major version of the REST API, three things will be true:- The announcement will be early. Foil emails organization owners on
v1at least 180 days beforev1is scheduled for sunset. - Both versions will run in parallel. Your
/v1/integration keeps working through the overlap. - A migration guide will be published. Every breaking change will be listed, with the equivalent call in the new version for each
/v1/pattern.
/v1/ in the foreseeable future. This section exists so the policy is clear if and when we do.
SDK versioning
The server SDKs follow their own semver release cadence, independent of the API version:- Patch releases (
x.y.z→x.y.z+1) - bug fixes and dependency updates. Safe to upgrade without reading the release notes. - Minor releases (
x.y.z→x.y+1.0) - new endpoints, new helper methods, new SDK-level features. Backwards-compatible with existing code. - Major releases (
x.y.z→x+1.0.0) - breaking SDK changes: renamed methods, changed return types, dropped support for old Node/Python/Go versions. Migration notes are published with each major.
Watching for changes
- OpenAPI spec - the shape-of-truth for endpoints, fields, and enums. Diff it across releases if you need to automate detection of new fields or codes.
- SDK release notes - each server SDK publishes its release notes as GitHub Releases in its repository.
- Email - Foil emails the organization owner on record about material deprecations that affect the organization.
What’s next
Errors
Branch on category prefixes, not specific codes.
Pagination
Cursor opacity and why not to parse.
Authentication
Key lifecycle across live and test environments.