Release Notes
DeskDay Public API · June 2026 · v1This 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
| Count | Category |
|---|---|
| 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 upgradingEach 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/ticketsGET /v1/usersGET /v1/customers
What to doStop sending
external_ref_sourceandexternal_ref_idwhen 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/customersPATCH /v1/customers/{id}
What to doSend the address pieces (
street,city,state,country,zip_code,address_1,address_2) at the top level instead of inside anaddressblock.
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/customersPATCH /v1/customers/{id}GET /v1/customers
What to doUse
industrywherever you previously usedsector.
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/customersPATCH /v1/customers/{id}GET /v1/customers
What to doIf 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/usersPATCH /v1/users/{id}
What to doMake sure the names you send fit these limits, otherwise the request will be rejected.
7 · Time entries no longer accept a "status"
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
— no longer accepts SLAPATCH /v1/tickets/{id}POST /v1/tickets/{id}/sla
What to doCall
POST /v1/tickets/{id}/slawith{ "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 doNothing in most cases — but if your code checks for exactly
204(or expects a completely empty response), accept200with the confirmation body instead.
✨ New
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
| Resource | New 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 |
| Users | flat address: street, city, state, country, zip_code, address_1, address_2 |
| Time entries | visibility, work_type_id, work_role_id, business_hours, notes_attachments |
New fields you'll see in responses
| Resource | New response fields |
|---|---|
| Tickets | u_id, ticket_owner {id,name}, billable, impact, urgency, location_id, budgeted_hours (minutes), estimated_end_at, participants |
| Users | site_name, manager_name, flat address fields; full_name now includes the middle name |
| Time entries | u_id, work_type_id, work_role_id, business_hours |
| SLA | new no_sla status for untracked tickets, plus a no_sla count in statistics |
Two things to noteAdding fields is safe — your existing parsing keeps working. But: on users,
stateandcountrycome back as numeric IDs; and some SLA timestamps can now benull.
🔧 Improvements
Quality-of-life changes that make the API easier and more forgiving.
Fewer required fields when creating a ticket — customer_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_idfrom list calls. - Flatten customer addresses; rename
sector→industry. - Lowercase-compare
customer_type. - Check user names fit 2–50 chars; move
manager_idto create-only. - Remove
statusfrom time entries. - Switch ticket SLA changes to
POST /v1/tickets/{id}/sla. - Accept
200(not204) when deleting webhooks.
Updated 19 days ago
