Skip to content

Changelog ​

  • 06.11.2026:
    • Rate limits: each company has a budget of 800 points per minute and 5 calls at once, which every response reports in X-RateLimit-* headers. Calls over it are still served for now; this changelog announces when they're answered with 429.
    • v2/assignments: customAttributes holds the values of the company's custom fields, by definition uuid, read with include=customAttributes; a POST sets them, a PATCH changes the ones it names and removes one by null.
    • Added v2/assignment-custom-attribute-definitions: the custom fields themselves, read-only.
    • Webhooks: assignment-custom-attribute-definition.*; assignment.updated also when a custom field's value changes.
    • Added v2/contacts: every contact, customers included, with its types as typeUuids. The system type makes a contact a customer, also listed under v2/customers.
    • Added v2/contact-types: the company's contact types; the system type is read-only.
    • v2/assignments: contacts lists who holds which contact type on the assignment, and a POST or PATCH sets them.
    • Webhooks: contact.* and contact-type.*; assignment.updated also when the assignment's contacts change, or its customer or a contact on it is deleted.
    • Webhooks: a deleted assignment or group sends assignment-event.deleted for its work steps, and an assignment assignment-event-group.deleted for its groups; a deleted user sends assignment-event.updated and gang.updated for the work steps and gangs it leaves.
  • 22.10.2026:
    • Released v2: every v1 resource under /v2/, addressed by uuid instead of the integer id. New endpoints come to v2 only; v1 keeps working and receives bug fixes. Migrating to v2 lists every difference.
    • Added v2/assignment-event-series: recurring work steps, read-only.
    • Added webhooks: subscribe through v2/webhook-subscriptions or in Artesa's settings, and Artesa calls your endpoint when data changes.
    • Addresses: a state you send is kept; the geocoder only fills it in when it is empty, instead of replacing it with its own name for the region.
    • v1/users and v1/assignment-event-groups: the spec now says what a PATCH always did — roleId and typeId are ignored there.
    • v1/time-entries and v1/user-absences: an unknown typeId on create answers 400 Unknown typeId …, like every other unknown id, instead of 404.
    • Uploads of v1/assignments and v1/assignment-events: an upload is only found under its own assignment or event, the token is checked before the file is received, and the file of a rejected upload is no longer kept.
    • Querying: $in and $nin take a repeated key per value; the comma-separated lists the docs showed were never split.
  • 21.10.2026:
    • v1/assignment-events: an event that is outward by its type's default now gets the default addresses too (start and return at the company, destination at the assignment), as one created with isOutward: true always did.
    • v1/customers: a PATCH that sends neither firstName nor surname no longer changes the stored name, and an empty name reads as null instead of "". PATCH and DELETE answer 404 for contacts that aren't customers, as GET and the list already did. The spec documents the POST body as CustomerCreate.
    • v1/gangs: a PATCH no longer resets order, externalId and deactivatedAt it doesn't send, and a POST stores deactivatedAt.
    • v1/roles: getting an internal role by id answers 404, as the list already leaves it out.
    • v1/user-absences: an absence by the day is widened to whole days, and one by the hour kept to one day, in the company's time zone instead of always Europe/Berlin.
    • Every PATCH changes only the properties it sends. Before, an omitted property with a documented default was reset to it, e.g. a user's color to #FFFFFF, or order of time entry types and upload categories to 1.
    • v1/user-absences: a requestedAt sent with a new absence is kept instead of being replaced by the time of the request.
    • Uploads of v1/assignments and v1/assignment-events: a POST without a file, or with an invalid form field, answers 400 naming the problem instead of a server error, and a uuid sent along is kept.
  • 06.10.2026:
    • Added read-only computedDuration to the v1/time-entries endpoint: the net worked duration in seconds, after pauses and time booked in parallel on another entry. duration stays the gross endsAt - startsAt.
  • 29.09.2026:
    • Every v1 resource now returns a uuid and can be filtered by it; a create may set it, as a UUIDv7. id stays the integer it was.
  • 28.09.2026:
    • v1/assignment-events: an omitted manPower is now calculated as workDays × workingTimePerDay × plannedEmployeeCount instead of taking the type's default, and recalculated when a patch changes one of those. Types with a fixed effort keep their default and derive workingTimePerDay from it.
  • 26.06.2026:
    • Added v1/time-sheet-days endpoint to manage time sheet days, including a by-user lookup by userId and day (created on demand).
    • Added v1/time-sheet-weeks endpoint to manage time sheet weeks, including a by-user lookup by userId and weekStart (created on demand).
    • Added v1/time-sheet-months endpoint to manage time sheet months, including a by-user lookup by userId and month (created on demand).
    • Added read-only dayStatus property and filter to the v1/time-entries endpoint, reflecting the approval status of the entry's time sheet day.
    • Added submittedAt and approvedAt filters to the v1/time-sheet-days endpoint.
    • Added read-only daySubmittedAt and dayApprovedAt properties and filters to the v1/time-entries endpoint, reflecting when the entry's time sheet day was submitted/approved.
  • 05.08.2025:
  • 29.07.2025:
  • 11.07.2025:
    • Added userIds to v1/gangs endpoint to manage gang members.
    • Added deactivatedAt to v1/users.
    • Removed DELETE operation from v1/users endpoint for safety reasons. Use deactivatedAt instead.
  • 07.07.2025:
  • 01.07.2025:
  • 26.05.2025: Added new v1/projects endpoint to manage projects.
  • 01.05.2025: Initial release of the public API specification.