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).
- This page — what changed in the API contract itself. For every integrator.
@dsptch-work/api-clientchangelog — 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) andgetCompany(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, andgetTimecodealso acceptas_of[transaction]. Both parameters are additive; omitting them still reads the version current now. - Job status filtering:
listJobsaccepts comma-separatedfilter[status]values, including the groupedpendingandactivestates. Unknown values return a422. - 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 a400. - Job responses now include the always-present
manager_usersarray and nullableregion. - Direct uploads accept optional free-form
blob.metadata; the returnedmetadatamatches the submitted object. - OpenAPI discovery metadata now includes DSPTCH support contact details, license metadata, and
an
externalDocslink to the rendered API reference.
Changed
- Seven list operations are now paginated:
listJobs,listCustomFieldConfigs,listWorkTypes,listTemplates,listGroups,listGroupUsers, andlistTimeCardPerDiemsnow 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]forlistFeatures,listAtlasSites,listUserCertifications,listFormDefinitions,listPerDiems, andlistUsers. Each endpoint defaults toactive, acceptsall, and uses its domain-specific non-active state (decommissioned,archived,inactive, orterminated). This is breaking for callers that usedfilter[status]on Atlas Sites,filter[is_active]on Per Diems, orfilter[membership_status]on Users; rename those parameters tofilter[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
getJobWageDeterminationanddeleteWageDeterminationpaths 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_idin 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. updateJobstatus writes are validated. Onlycompleted,cancelled, anddisputedcan be set directly; computed or unknown statuses now return a422instead of being silently ignored.deletePerDiem(DELETE /per_diems/{id}) now permanently removes an unused rate. To retain a rate but make it inactive, sendPATCH is_active: false; deleting a rate already referenced by a time card returns a422.updateProduct(PATCH /assets/products/{id}) no longer acceptstypeorperformed_by_user_id. Both are create-only — the product type is fixed once set, andperformed_by_user_idis recorded only on create — and were silently ignored on update. The update request schema now omits them.- Service events (
createServiceEvent,updateServiceEvent):kindis now optional. When the event is linked to a service schedule viaassets_service_schedule_id, the schedule determines the kind and any submittedkindis ignored; sendkindonly 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_dateis adate-time,purchase_price_centsis a decimal string, user-certificationexpiration_dateis adate,position_function_idis a string identifier, event timestamps carrydate-time, global certificationcompany_idis 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 requirename, and form-assignment scheduling fields correctly allow null where the endpoint does. - Apprenticeship wage-schedule period updates can now send
idand_destroyinsideperiods_attributes, matching the nested update and removal behavior the endpoint already supports.
Fixed
- Unauthorized responses now return a localized string in
messagein deployed environments instead of the booleanfalse, 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.