Release Notes

📘

DeskDay Public API · June 2026 · v1

This release adds new endpoints and fields, improves six resources, and includes 9 breaking changes that may affect an existing integration. Most changes are additive and safe — but read the Breaking changes section before you upgrade.

At a glance

CountCategory
9⚠️ Breaking changes that may need action
2✨ Brand-new endpoints
6🔧 Resources improved
👍

Only five minutes?

Read the Breaking changes section below — those are the only changes that can affect an existing integration. Everything else is additive and safe.

⚠️ Breaking changes (action required)

🚧

Review before upgrading

Each item below changes behaviour you may already rely on, lists the endpoints involved, and tells you exactly what to do.

1 · The old "external reference" search filters were removed

When listing tickets, users, or customers, you could previously filter by an external system's reference. The query parameters external_ref_source and external_ref_id are no longer accepted, and sending them now returns a 422 error.

Endpoints affected

  • GET /v1/tickets
  • GET /v1/users
  • GET /v1/customers
👍

What to do

Stop sending external_ref_source and external_ref_id when listing these records.

2 · Customer address details are no longer grouped together

Address details used to be wrapped inside one address block. They now sit directly on the customer, on both requests and responses. A nested address object now returns 422.

Before

{
  "address": {
    "city": "Boston",
    "zip_code": "02108"
  }
}

Now

{
  "city": "Boston",
  "zip_code": "02108"
}

Endpoints affected

  • POST /v1/customers
  • PATCH /v1/customers/{id}
👍

What to do

Send the address pieces (street, city, state, country, zip_code, address_1, address_2) at the top level instead of inside an address block.

3 · A customer's "sector" is now called "industry"

The field was renamed to better match the rest of the product. The old sector name is no longer recognised — when sending data, filtering a list, or reading a customer back. It was removed from the request body, the list filter, and the response.

Endpoints affected

  • POST /v1/customers
  • PATCH /v1/customers/{id}
  • GET /v1/customers
👍

What to do

Use industry wherever you previously used sector.

4 · Customer type is always returned in lowercase

The customer type can be either business or individual. Input is case-insensitive ("Business" works), but the value you get back will always be lowercase.

Endpoints affected

  • POST /v1/customers
  • PATCH /v1/customers/{id}
  • GET /v1/customers
👍

What to do

If you compare this value anywhere in your code, compare it lowercased.

5 · User names now follow stricter rules

full_name, first_name, and last_name must now be 2–50 characters and look like real names — letters, digits, spaces, and the common punctuation . , ' -. Blank or punctuation-only names are rejected with a 400.

Endpoints affected

  • POST /v1/users
  • PATCH /v1/users/{id}
👍

What to do

Make sure the names you send fit these limits, otherwise the request will be rejected.

6 · A user's manager can only be set when the user is created

manager_id can still be set when creating a user, but it is rejected when updating one.

Endpoints affected

  • PATCH /v1/users/{id}
👍

What to do

Set the manager at creation time, and remove manager_id from your update calls.

7 · Time entries no longer accept a "status"

A time entry has no status of its own — that's a property of the ticket. Sending status now returns 422.

Endpoints affected

  • POST /v1/time-entries
  • PATCH /v1/time-entries/{id}
👍

What to do

Drop status from time-entry create/update. To change a ticket's status, update the ticket instead.

8 · Setting a ticket's SLA now has its own action

You used to set the SLA while updating a ticket. Sending sla_id in a ticket update now returns 422 NOT_SUPPORTED. There's a dedicated endpoint instead that also recalculates the due dates.

Use this instead of the old way

  • PATCH /v1/tickets/{id} — no longer accepts SLA
  • POST /v1/tickets/{id}/sla
👍

What to do

Call POST /v1/tickets/{id}/sla with { "sla_id": "…" }, sending just the SLA you want to assign.

9 · Deleting a webhook now returns a confirmation message

DELETE /v1/webhooks/{id} changed from 204 No Content (empty) to 200 OK with a JSON body: { success, statusCode, message, data: null }. Deleting something that doesn't exist still returns 404.

Endpoint affected

  • DELETE /v1/webhooks/{id}
👍

What to do

Nothing in most cases — but if your code checks for exactly 204 (or expects a completely empty response), accept 200 with the confirmation body instead.

✨ New

📘

Safe by default

New endpoints and fields. Nothing in this section affects existing calls.

Apply an SLA policy to a ticket

POST /v1/tickets/{id}/sla — body { "sla_id": "…" }. Returns the ticket's new and previous SLA plus the recalculated due dates.

List your MSP locations

GET /v1/reference/msp-locations — supports search, is_default, updated_after, and pagination. Returns location details with contact info and coordinates.

New optional fields you can send

ResourceNew request fields
Tickets (create)site_id, participants[] (CC members, up to 50)
Tickets (update)customer_id, customer_user_id, impact, urgency, location_id, budgeted_hours, estimated_end_at
Usersflat address: street, city, state, country, zip_code, address_1, address_2
Time entriesvisibility, work_type_id, work_role_id, business_hours, notes_attachments

New fields you'll see in responses

ResourceNew response fields
Ticketsu_id, ticket_owner {id,name}, billable, impact, urgency, location_id, budgeted_hours (minutes), estimated_end_at, participants
Userssite_name, manager_name, flat address fields; full_name now includes the middle name
Time entriesu_id, work_type_id, work_role_id, business_hours
SLAnew no_sla status for untracked tickets, plus a no_sla count in statistics
📘

Two things to note

Adding fields is safe — your existing parsing keeps working. But: on users, state and country come back as numeric IDs; and some SLA timestamps can now be null.

🔧 Improvements

Quality-of-life changes that make the API easier and more forgiving.

Fewer required fields when creating a ticketcustomer_id and priority are now optional. If omitted, the ticket uses the MSP-converted customer and a "low" priority. The source field defaults to "api".

Technician IDs are more flexible — time-entry tech_id now accepts any non-empty string (up to 75 chars), not just UUIDs — so opaque resource IDs work directly.

Clearer validation errors — when you send an invalid value for an enum field, the error now lists the allowed values, e.g. "sort_by must be one of: a, b, c". The accepted values themselves haven't changed.

More sensible status codes — sending an unknown ticket status now returns a clear 422 validation error instead of a 500.

✅ Upgrade checklist

  • Remove external_ref_source / external_ref_id from list calls.
  • Flatten customer addresses; rename sectorindustry.
  • Lowercase-compare customer_type.
  • Check user names fit 2–50 chars; move manager_id to create-only.
  • Remove status from time entries.
  • Switch ticket SLA changes to POST /v1/tickets/{id}/sla.
  • Accept 200 (not 204) when deleting webhooks.


Did this page help you?