Saltar al contenido principal

API Changelog

The change history of the DSPTCH public REST API's contract: endpoints, request and response fields, enums, and required-ness. It describes the API itself, so it applies whether you call the API directly over HTTP or through the TypeScript client.

Entries follow Keep a Changelog — grouped under Added, Changed, Deprecated, Removed, Fixed, and Security, newest first, dated to the production release that shipped them. Field names appear as they do on the wire (snake_case).

Which changelog do I want?
  • This page — what changed in the API contract itself. For every integrator.
  • @dsptch-work/api-client changelog — the same changes as TypeScript method and type changes, keyed by the npm version you install.
  • Product changelog — end-user, in-app feature updates.

2026-07-27

Added

  • Company directory: listCompanies (GET /companies) and getCompany (GET /companies/{id}) expose paginated, name-filterable company profiles. The response includes public company details only, and sandbox companies remain visible only within their tenant.
  • Point-in-time reads: as_of[valid] is now available on the list and show operations for External Maps, Timecodes, Pay Schedules, Job Wage Determinations, and Rate Rules. listExternalMaps, getExternalMap, listTimecodes, and getTimecode also accept as_of[transaction]. Both parameters are additive; omitting them still reads the version current now.
  • Job status filtering: listJobs accepts comma-separated filter[status] values, including the grouped pending and active states. Unknown values return a 422.
  • Page-size control: all 58 paginated list operations now document page[limit]. The default is 20, values above 100 are capped at 100, and zero, negative, or non-integer values return a 400.
  • Job responses now include the always-present manager_users array and nullable region.
  • Direct uploads accept optional free-form blob.metadata; the returned metadata matches the submitted object.
  • OpenAPI discovery metadata now includes DSPTCH support contact details, license metadata, and an externalDocs link to the rendered API reference.

Changed

  • Seven list operations are now paginated: listJobs, listCustomFieldConfigs, listWorkTypes, listTemplates, listGroups, listGroupUsers, and listTimeCardPerDiems now return the standard { meta, links, data } envelope instead of a top-level array. This response-shape change is breaking.
  • Lifecycle filtering is standardized on filter[state] for listFeatures, listAtlasSites, listUserCertifications, listFormDefinitions, listPerDiems, and listUsers. Each endpoint defaults to active, accepts all, and uses its domain-specific non-active state (decommissioned, archived, inactive, or terminated). This is breaking for callers that used filter[status] on Atlas Sites, filter[is_active] on Per Diems, or filter[membership_status] on Users; rename those parameters to filter[state]. Non-active rows that previously appeared by default must now be requested explicitly.
  • Job Wage Determination and Rate Rule member routes use stable family keys. The getJobWageDetermination and deleteWageDetermination paths now use {uid} instead of {id}; nested Rate Rule paths use {wage_determination_uid} and Rate Rule members use {uid}. The old row-ID paths are removed, so this route change is breaking.
  • Creating a Job Wage Determination requires trade_id in both the federal and regional request shapes, and both response shapes now include it. Create the trade first through the job or project PWA Trades endpoint. This is breaking for create requests that omitted the trade.
  • updateJob status writes are validated. Only completed, cancelled, and disputed can be set directly; computed or unknown statuses now return a 422 instead of being silently ignored.
  • deletePerDiem (DELETE /per_diems/{id}) now permanently removes an unused rate. To retain a rate but make it inactive, send PATCH is_active: false; deleting a rate already referenced by a time card returns a 422.
  • updateProduct (PATCH /assets/products/{id}) no longer accepts type or performed_by_user_id. Both are create-only — the product type is fixed once set, and performed_by_user_id is recorded only on create — and were silently ignored on update. The update request schema now omits them.
  • Service events (createServiceEvent, updateServiceEvent): kind is now optional. When the event is linked to a service schedule via assets_service_schedule_id, the schedule determines the kind and any submitted kind is ignored; send kind only for an ad-hoc service or repair.
  • Response requiredness now matches runtime output across the public schemas. Fields rendered on every response — including nullable values and always-present arrays — are now marked required, so generated clients no longer type them as optional.
  • Schema types and formats now match serialized values: asset-item purchase_date is a date-time, purchase_price_cents is a decimal string, user-certification expiration_date is a date, position_function_id is a string identifier, event timestamps carry date-time, global certification company_id is nullable, and supported event/category/frequency values use enums.
  • Asset and task request constraints are more precise. Restock and transfer quantities require a minimum of 1, adjustments require a non-negative quantity, service intervals require a minimum of 1, fixed asset sites require site_id, mobile asset sites require name, and form-assignment scheduling fields correctly allow null where the endpoint does.
  • Apprenticeship wage-schedule period updates can now send id and _destroy inside periods_attributes, matching the nested update and removal behavior the endpoint already supports.

Fixed

  • Unauthorized responses now return a localized string in message in deployed environments instead of the boolean false, matching the documented error schema.
  • Compliance-check filtering now recognizes pay-period checks, and returned pay-period checks identify their subject through pay_period_id.

The request/response schema corrections describe behavior the endpoints already had, so existing HTTP integrations do not need to change for those corrections. Generated TypeScript types become more precise; review compiler errors for fields that are now required, narrowed to enums, or removed from update requests.