There is no version prefix, and that is the current state of things
Paths are unversioned: /db/projects, not /v1/db/projects. This API grew as the private backend of one web app, where the client and the server ship together and a breaking change is a single deploy. That assumption stops holding the moment somebody else's code depends on it, which is what this page invites. Read the rest of this section before you build something you cannot easily change.
| Surface | Commitment |
|---|---|
| Paths and methods | Stable. An endpoint documented here will not move or change verb without notice. |
| Request fields | Stable. New optional fields may be added; existing ones will not change meaning or type. |
| Response fields | Additive. New keys may appear at any time. Parse permissively. A client that rejects unknown keys will break on a routine release. |
Error code values | Stable. The table above is the contract. |
Error message text | Not stable. Written for people, reworded freely. Never match on it. |
| Token lifetimes | Not stable. Configuration. Refresh on 401, not on a timer. |
| Undocumented endpoints | No commitment. The routes deliberately omitted from this page (see the note in this file's source) may change or disappear without notice. |
Building something durable#
- Ignore response keys you do not use, rather than validating against a closed schema.
- Branch on
detail.code, never ondetail.message. - Refresh when a call returns
401, rather than pre-emptively on a clock. - Retry
503with backoff. Retry nothing else automatically. - Set a generous timeout on every
/reports/*,/ai/*and/forms/*call. - Keep your device-type mapping in one place. The two vocabularies are the likeliest thing to catch you out.
Getting in touch#
If you are integrating against this API, tell us: support@rmsautomation.ai. It is the only way a change that would break you gets noticed before it ships. For a CORS origin, a higher concurrency band, or a commitment stronger than the table above, contact sales.