Skip to main content

Versioning

Moda’s API uses a calendar-dated version string on the Moda-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

Pin explicitly on every request. Don’t rely on the default.

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

Read details.supported — that’s the ground truth, and it updates automatically.

Response header

Every response carries the resolved version:
If you omit the request header, read the response’s 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):
Canonical Task envelope (2026-05-01):
Migration map:

List endpoints: offset → cursor

Legacy:
Canonical:
Iterate until next_cursor === null. See pagination.md.

Webhook events

Legacy job.* names are retired in favor of task.* / export.*. Spelling changed: cancelledcanceled (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
Additive (no bump):
  • New endpoint / path / optional param / response field
  • New error code within an existing type
Tolerate unknown fields in your client.

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-Version explicitly on every production request.
  • Log the response Moda-Version so you can tell which shape your traffic is actually hitting.
  • When you see 400 unsupported_version, read details.supported from the error.
  • Subscribe to the Moda changelog for sunset dates.

Common wrong guesses

  • Omitting Moda-Version in production. The default will advance on sunset and your response shape will silently change.
  • Parsing legacy job_id / canvas_id from canonical responses. They’re nested under id and result.canvas_id.
  • Spelling cancelled with two Ls. Canonical spelling is canceled (one L). cancelled is a legacy artifact.
  • Assuming a sunset version still works. After the sunset date, pinning it returns 400.

Upstream

docs.moda.app/api/versioning