Versioning
Moda’s API uses a calendar-dated version string on theModa-Version request header. Pinning guarantees your wire shape stays stable.
Supported versions (as of 2026-04-24)
- Canonical = routes emit this shape natively. Pin this in production.
- Default = what unpinned requests get. Advances to the next-newest supported version on sunset dates.
- Sunset = after this date, pinning the sunset version returns
400 unsupported_version.
Sending the header
Omitting
If you omit the header, the server resolves to the current default. Integrations keep working across version bumps until a sunset advances the default. For production, pin.Unknown version
details.supported — that’s the ground truth, and it updates automatically.
Response header
Every response carries the resolved version:Moda-Version to know which shape you got.
Canonical (2026-05-01) vs legacy (2026-04-12)
Task endpoints
Legacy flat shape (2026-04-12):
2026-05-01):
List endpoints: offset → cursor
Legacy:next_cursor === null. See pagination.md.
Webhook events
Legacyjob.* names are retired in favor of task.* / export.*. Spelling changed: cancelled → canceled (matches the PublicTaskStatus.CANCELED enum). Non-terminal states (queued, running, expired) no longer fire webhooks.
What triggers a new version
Only breaking response-shape changes. Additive changes (new endpoints, new optional params, new response fields) ship at the current canonical version without a bump. Breaking:- Removing / renaming a response field
- Removing an endpoint or path
- Changing a field’s type
- Tightening validation
- Changing status vocabulary
- New endpoint / path / optional param / response field
- New error
codewithin an existingtype
Version-bump cadence
- New canonical arrives.
- Previous default stays supported for a sunset window (usually 2–3 weeks).
- On the sunset date, the older version retires; default advances.
- If you pinned, you upgrade on your schedule.
Recommendations
- Pin
Moda-Versionexplicitly on every production request. - Log the response
Moda-Versionso you can tell which shape your traffic is actually hitting. - When you see
400 unsupported_version, readdetails.supportedfrom the error. - Subscribe to the Moda changelog for sunset dates.
Common wrong guesses
- Omitting
Moda-Versionin production. The default will advance on sunset and your response shape will silently change. - Parsing legacy
job_id/canvas_idfrom canonical responses. They’re nested underidandresult.canvas_id. - Spelling
cancelledwith two Ls. Canonical spelling iscanceled(one L).cancelledis a legacy artifact. - Assuming a sunset version still works. After the sunset date, pinning it returns
400.
Upstream
docs.moda.app/api/versioning