API reference: tickets
Search, read and change service desk tickets: status, priority, owner, close, take a close back and merge.
Last updated
A ticket is one service desk request. Read endpoints need tickets:read; every change needs tickets:write and a request_id. Every sample reads the key from CURRENT_API_KEY and calls https://api.current.day/v1.
/v1/ticketsNeeds the tickets:read scope. Pages with a cursor.
Service desk tickets this agent can open, by subject words, a ticket number, one company or a change time, newest activity first or (sort created) by creation; it changes nothing and never shows money or a password. Pages with a cursor, at most 100 a page. In activity order a ticket that changes while you page moves to the top and is not seen again in that walk, so a sync pages with sort created and updated_since.
Parameters
Query parameters
- querytext, up to 200 charactersOptional
- Words in the subject, or a ticket number such as 48213.
- company_iduuidOptional
- Only this company's tickets.
- open_onlytrue or falseOptional
- Leave out resolved and closed tickets.
- needs_replytrue or falseOptional
- Only open tickets where the customer wrote last and nobody has answered yet.
- sortone of the values listedOptional
- activity (the default): newest activity first. created: newest first by creation, an order that does not move while you page. A cursor works only with the order it came from.
activitycreated- updated_sincetext, up to 40 charactersOptional
- Only tickets changed (any field or a new message) at or after this time (ISO 8601, such as 2026-10-01T00:00:00Z). Each ticket carries updated_at and last_activity_at.
- limitinteger, 1 to 100Optional
- Rows per page, 1 to 100. 25 when left out.
- cursorcursorOptional
- next_cursor from the previous page.
Errors
| Status | Code and meaning |
|---|---|
| 400 | bad_requestThe request was not in the expected shape. |
| 401 | unauthorizedThis token was not accepted. |
| 403 | not_allowed, frozen, module_offThis agent is not allowed to do that. This workspace is read only right now, so nothing can be changed. The API is not switched on for this workspace. |
| 404 | not_foundNothing was found with that id, or this agent cannot see it. |
| 405 | bad_request (method_not_allowed)That address does not accept this method. The Allow header lists the ones it does. |
| 429 | rate_limited, send_cappedToo many requests from this token. Wait, then try again. This token has sent its limit of customer emails for now. Try again later. |
| 503 | degradedCurrent is busy. Try again in a minute. |
curl -sS --fail-with-body "https://api.current.day/v1/tickets?open_only=true&limit=5" \
-H "Authorization: Bearer $CURRENT_API_KEY"
# A refusal exits non-zero and prints the error: read .error.code and .error.reason,
# for example with jq -r '.error.code, .error.reason'{
"data": [
{
"id": "6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d",
"number": 48213,
"subject": {
"untrusted_text": "Printer offline in reception",
"source": "customer"
},
"status": "open",
"priority": "normal",
"company_id": "c2e9a0f4-1b7d-4c35-a8e6-5d3f7b1c9e02",
"company_name": {
"untrusted_text": "Lakeshore Dental",
"source": "customer"
},
"board_id": "5b3e8d2a-7c41-4f96-a0d7-1e9c6b4f2a85",
"assignee_id": "8d4b6f1a-2c9e-4e73-b05d-7a1e3c5f9b48",
"created_at": "2026-10-30T13:52:40.000Z",
"updated_at": "2026-10-30T14:05:12.000Z",
"last_activity_at": "2026-10-30T14:05:12.000Z",
"awaiting_reply": true
}
],
"next_cursor": "AQAGXyH39YhYgXbhAof0TceGFCDmEr9kQ2w7Ux1bZ3vLp0sDnF5aTcY",
"has_more": true
}/v1/tickets/{ticket_id}Needs the tickets:read scope.
Reads one ticket: its header, its last 10 messages (each clamped) and its alert summary; give ticket_id or number. It changes nothing and never shows money or a password.
Parameters
Path parameters
- ticket_iduuid or integer, 1 or moreRequired
- The ticket's id, or its number (such as 48213).
Errors
| Status | Code and meaning |
|---|---|
| 400 | bad_requestThe request was not in the expected shape. |
| 401 | unauthorizedThis token was not accepted. |
| 403 | not_allowed, frozen, module_offThis agent is not allowed to do that. This workspace is read only right now, so nothing can be changed. The API is not switched on for this workspace. |
| 404 | not_foundNothing was found with that id, or this agent cannot see it. |
| 405 | bad_request (method_not_allowed)That address does not accept this method. The Allow header lists the ones it does. |
| 429 | rate_limited, send_cappedToo many requests from this token. Wait, then try again. This token has sent its limit of customer emails for now. Try again later. |
| 503 | degradedCurrent is busy. Try again in a minute. |
curl -sS --fail-with-body "https://api.current.day/v1/tickets/6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d" \
-H "Authorization: Bearer $CURRENT_API_KEY"
# A refusal exits non-zero and prints the error: read .error.code and .error.reason,
# for example with jq -r '.error.code, .error.reason'{
"data": {
"ticket": {
"id": "6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d",
"number": 48213,
"subject": {
"untrusted_text": "Printer offline in reception",
"source": "customer"
},
"status": "open",
"priority": "normal",
"company_id": "c2e9a0f4-1b7d-4c35-a8e6-5d3f7b1c9e02",
"company_name": {
"untrusted_text": "Lakeshore Dental",
"source": "customer"
},
"board_id": "5b3e8d2a-7c41-4f96-a0d7-1e9c6b4f2a85",
"assignee_id": "8d4b6f1a-2c9e-4e73-b05d-7a1e3c5f9b48",
"created_at": "2026-10-30T13:52:40.000Z",
"updated_at": "2026-10-30T14:05:12.000Z",
"last_activity_at": "2026-10-30T14:05:12.000Z",
"awaiting_reply": true,
"description": {
"untrusted_text": "The reception printer shows offline on every computer since this morning.",
"source": "customer"
},
"category": {
"untrusted_text": "printing",
"source": "customer"
},
"board_name": {
"untrusted_text": "Front line",
"source": "staff"
},
"assignee_name": {
"untrusted_text": "Priya Okafor",
"source": "staff"
},
"due_at": "2026-10-31T17:00:00.000Z",
"resolved_at": null,
"closed_at": null
},
"messages": [
{
"id": "e7a2c9d1-3b5f-4e80-9c64-2d1f8a7b3e50",
"kind": "customer_message",
"channel": "email",
"author": {
"untrusted_text": "Dana Whitfield",
"source": "customer"
},
"at": "2026-10-30T13:52:40.000Z",
"body": {
"untrusted_text": "Hi, the reception printer is offline again. Can someone take a look?",
"source": "customer"
}
}
],
"alerts": {
"alerts": 0,
"open_alerts": 0,
"devices": 0,
"monitors": 0,
"recent": []
}
}
}/v1/tickets/{ticket_id}Needs the tickets:write scope.
Changes a ticket's status, priority or both, as a person in this agent's role would; resolved and closed are never set here (use POST /v1/tickets/{ticket_id}/close). Send expected_status or expected_priority to change it only if it still reads that way, and Current emails the customer nothing (the ticket's Teams status card still updates, and a linked PSA may send its own notices).
Parameters
Path parameters
- ticket_iduuidRequired
- The ticket's id (read it with GET /v1/tickets/{ticket_id} or GET /v1/tickets). A number is not accepted on a change.
Header parameters
- Idempotency-KeyuuidOptional
- The same uuid as request_id, if you prefer a header. Send one or the other, or both with the same value.
Body parameters
- request_iduuidOptional
- A uuid you mint for this change. Send the same one again to retry safely: Current answers the first answer and never writes twice (kept 24 hours). Required unless the Idempotency-Key header is sent.
- statusone of the values listedOptional
newopenwaiting_customerwaiting_internalscheduled- waiting_reasonone of the values listedOptional
- Only beside waiting_customer or waiting_internal.
customervendorpartnerprerequisiteour_team- priorityone of the values listedOptional
lownormalhighurgent- expected_statusone of the values listedOptional
newopenwaiting_customerwaiting_internalscheduled- expected_priorityone of the values listedOptional
lownormalhighurgent
Errors
| Status | Code and meaning |
|---|---|
| 400 | bad_requestThe request was not in the expected shape. |
| 401 | unauthorizedThis token was not accepted. |
| 403 | not_allowed, frozen, module_offThis agent is not allowed to do that. This workspace is read only right now, so nothing can be changed. The API is not switched on for this workspace. |
| 404 | not_foundNothing was found with that id, or this agent cannot see it. |
| 405 | bad_request (method_not_allowed)That address does not accept this method. The Allow header lists the ones it does. |
| 409 | conflictSomeone changed this first. Read it again, then retry. |
| 413 | bad_request (body_too_large)The request body is larger than 64 KB. |
| 429 | rate_limited, send_cappedToo many requests from this token. Wait, then try again. This token has sent its limit of customer emails for now. Try again later. |
| 503 | degradedCurrent is busy. Try again in a minute. |
REQUEST_ID=$(uuidgen) # a new id for this change; send the same one again only to retry it
curl -sS --fail-with-body -X PATCH "https://api.current.day/v1/tickets/6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d" \
-H "Authorization: Bearer $CURRENT_API_KEY" \
-H "Content-Type: application/json" \
-d @- <<EOF
{"request_id":"$REQUEST_ID","status":"waiting_customer","waiting_reason":"customer"}
EOF
# A refusal exits non-zero and prints the error: read .error.code and .error.reason,
# for example with jq -r '.error.code, .error.reason'{
"data": {
"ticket_id": "6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d",
"status": "waiting_customer",
"priority": "normal",
"waiting_reason": "customer"
}
}/v1/tickets/{ticket_id}/assignNeeds the tickets:write scope.
Gives a ticket to a desk staff member, to this agent, or to nobody (null), never to another agent. expected_assignee_id is the owner you last read (null for nobody); if it changed since, nothing moves and the answer is conflict, and Current emails the customer nothing (the ticket's Teams status card still updates, and a linked PSA may send its own notices).
Parameters
Path parameters
- ticket_iduuidRequired
- The ticket's id (read it with GET /v1/tickets/{ticket_id} or GET /v1/tickets). A number is not accepted on a change.
Header parameters
- Idempotency-KeyuuidOptional
- The same uuid as request_id, if you prefer a header. Send one or the other, or both with the same value.
Body parameters
- request_iduuidOptional
- A uuid you mint for this change. Send the same one again to retry safely: Current answers the first answer and never writes twice (kept 24 hours). Required unless the Idempotency-Key header is sent.
- assignee_iduuid or nullRequired
- The new owner, or null for nobody.
- expected_assignee_iduuid or nullRequired
- The owner the ticket has now, or null for nobody.
Errors
| Status | Code and meaning |
|---|---|
| 400 | bad_requestThe request was not in the expected shape. |
| 401 | unauthorizedThis token was not accepted. |
| 403 | not_allowed, frozen, module_offThis agent is not allowed to do that. This workspace is read only right now, so nothing can be changed. The API is not switched on for this workspace. |
| 404 | not_foundNothing was found with that id, or this agent cannot see it. |
| 405 | bad_request (method_not_allowed)That address does not accept this method. The Allow header lists the ones it does. |
| 409 | conflictSomeone changed this first. Read it again, then retry. |
| 413 | bad_request (body_too_large)The request body is larger than 64 KB. |
| 429 | rate_limited, send_cappedToo many requests from this token. Wait, then try again. This token has sent its limit of customer emails for now. Try again later. |
| 503 | degradedCurrent is busy. Try again in a minute. |
REQUEST_ID=$(uuidgen) # a new id for this change; send the same one again only to retry it
curl -sS --fail-with-body -X POST "https://api.current.day/v1/tickets/6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d/assign" \
-H "Authorization: Bearer $CURRENT_API_KEY" \
-H "Content-Type: application/json" \
-d @- <<EOF
{"request_id":"$REQUEST_ID","assignee_id":"8d4b6f1a-2c9e-4e73-b05d-7a1e3c5f9b48","expected_assignee_id":null}
EOF
# A refusal exits non-zero and prints the error: read .error.code and .error.reason,
# for example with jq -r '.error.code, .error.reason'{
"data": {
"ticket_id": "6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d",
"assignee_id": "8d4b6f1a-2c9e-4e73-b05d-7a1e3c5f9b48",
"previous_assignee_id": null
}
}/v1/tickets/{ticket_id}/closeNeeds the tickets:write scope.
Closes a ticket, with an optional internal resolution note first, which the customer never sees. What the customer hears is the tenant admin's choice (nothing, Current's closed email, the survey email alone or the PSA's own notice; at most one email per ticket), customer_notice in the answer says which, and the Teams status card still updates. The close can be taken back for 24 hours with POST /v1/tickets/{ticket_id}/undo-close.
Parameters
Path parameters
- ticket_iduuidRequired
- The ticket's id (read it with GET /v1/tickets/{ticket_id} or GET /v1/tickets). A number is not accepted on a change.
Header parameters
- Idempotency-KeyuuidOptional
- The same uuid as request_id, if you prefer a header. Send one or the other, or both with the same value.
Body parameters
- request_iduuidOptional
- A uuid you mint for this change. Send the same one again to retry safely: Current answers the first answer and never writes twice (kept 24 hours). Required unless the Idempotency-Key header is sent.
- resolution_notetext, up to 15,000 charactersOptional
Errors
| Status | Code and meaning |
|---|---|
| 400 | bad_requestThe request was not in the expected shape. |
| 401 | unauthorizedThis token was not accepted. |
| 403 | not_allowed, frozen, module_offThis agent is not allowed to do that. This workspace is read only right now, so nothing can be changed. The API is not switched on for this workspace. |
| 404 | not_foundNothing was found with that id, or this agent cannot see it. |
| 405 | bad_request (method_not_allowed)That address does not accept this method. The Allow header lists the ones it does. |
| 409 | conflictSomeone changed this first. Read it again, then retry. |
| 413 | bad_request (body_too_large)The request body is larger than 64 KB. |
| 429 | rate_limited, send_cappedToo many requests from this token. Wait, then try again. This token has sent its limit of customer emails for now. Try again later. |
| 503 | degradedCurrent is busy. Try again in a minute. |
REQUEST_ID=$(uuidgen) # a new id for this change; send the same one again only to retry it
curl -sS --fail-with-body -X POST "https://api.current.day/v1/tickets/6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d/close" \
-H "Authorization: Bearer $CURRENT_API_KEY" \
-H "Content-Type: application/json" \
-d @- <<EOF
{"request_id":"$REQUEST_ID","resolution_note":"Replaced the toner. Printing again."}
EOF
# A refusal exits non-zero and prints the error: read .error.code and .error.reason,
# for example with jq -r '.error.code, .error.reason'{
"data": {
"ticket_id": "6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d",
"closed": true,
"customer_notice": {
"untrusted_text": "none",
"source": "customer"
},
"note_id": "b3f8e1a6-7d24-4c09-a5e3-9f2c6d1b8a74"
}
}/v1/tickets/{ticket_id}/undo-closeNeeds the tickets:write scope.
Takes back a resolve or a close made in the last 24 hours, to the status you name; only the ticket's owner, the person who raised it or a desk manager can. A close made by a merge is never taken back here, after 24 hours a person reopens the ticket, and Current emails the customer nothing (the ticket's Teams status card still updates, and a linked PSA may send its own notices).
Parameters
Path parameters
- ticket_iduuidRequired
- The ticket's id (read it with GET /v1/tickets/{ticket_id} or GET /v1/tickets). A number is not accepted on a change.
Header parameters
- Idempotency-KeyuuidOptional
- The same uuid as request_id, if you prefer a header. Send one or the other, or both with the same value.
Body parameters
- request_iduuidOptional
- A uuid you mint for this change. Send the same one again to retry safely: Current answers the first answer and never writes twice (kept 24 hours). Required unless the Idempotency-Key header is sent.
- to_statusone of the values listedRequired
newopenwaiting_customerwaiting_internalscheduledresolved
Errors
| Status | Code and meaning |
|---|---|
| 400 | bad_requestThe request was not in the expected shape. |
| 401 | unauthorizedThis token was not accepted. |
| 403 | not_allowed, frozen, module_offThis agent is not allowed to do that. This workspace is read only right now, so nothing can be changed. The API is not switched on for this workspace. |
| 404 | not_foundNothing was found with that id, or this agent cannot see it. |
| 405 | bad_request (method_not_allowed)That address does not accept this method. The Allow header lists the ones it does. |
| 409 | conflictSomeone changed this first. Read it again, then retry. |
| 413 | bad_request (body_too_large)The request body is larger than 64 KB. |
| 429 | rate_limited, send_cappedToo many requests from this token. Wait, then try again. This token has sent its limit of customer emails for now. Try again later. |
| 503 | degradedCurrent is busy. Try again in a minute. |
REQUEST_ID=$(uuidgen) # a new id for this change; send the same one again only to retry it
curl -sS --fail-with-body -X POST "https://api.current.day/v1/tickets/6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d/undo-close" \
-H "Authorization: Bearer $CURRENT_API_KEY" \
-H "Content-Type: application/json" \
-d @- <<EOF
{"request_id":"$REQUEST_ID","to_status":"open"}
EOF
# A refusal exits non-zero and prints the error: read .error.code and .error.reason,
# for example with jq -r '.error.code, .error.reason'{
"data": {
"ticket_id": "6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d",
"status": "open",
"from_status": "closed"
}
}/v1/tickets/{keep_ticket_id}/mergeNeeds the tickets:write scope.
Merges merge_ticket_id into keep_ticket_id on the same company: its messages, files, unsent time and people move, and it closes as a duplicate; Current never tells the customer (the ticket's Teams status card still updates, and a linked PSA may send its own notices). A merge made here is final: there is no Undo from the API.
Parameters
Path parameters
- keep_ticket_iduuidRequired
- The ticket that stays open.
Header parameters
- Idempotency-KeyuuidOptional
- The same uuid as request_id, if you prefer a header. Send one or the other, or both with the same value.
Body parameters
- request_iduuidOptional
- A uuid you mint for this change. Send the same one again to retry safely: Current answers the first answer and never writes twice (kept 24 hours). Required unless the Idempotency-Key header is sent.
- merge_ticket_iduuidRequired
- The ticket folded into it and closed.
Errors
| Status | Code and meaning |
|---|---|
| 400 | bad_requestThe request was not in the expected shape. |
| 401 | unauthorizedThis token was not accepted. |
| 403 | not_allowed, frozen, module_offThis agent is not allowed to do that. This workspace is read only right now, so nothing can be changed. The API is not switched on for this workspace. |
| 404 | not_foundNothing was found with that id, or this agent cannot see it. |
| 405 | bad_request (method_not_allowed)That address does not accept this method. The Allow header lists the ones it does. |
| 409 | conflictSomeone changed this first. Read it again, then retry. |
| 413 | bad_request (body_too_large)The request body is larger than 64 KB. |
| 429 | rate_limited, send_cappedToo many requests from this token. Wait, then try again. This token has sent its limit of customer emails for now. Try again later. |
| 503 | degradedCurrent is busy. Try again in a minute. |
REQUEST_ID=$(uuidgen) # a new id for this change; send the same one again only to retry it
curl -sS --fail-with-body -X POST "https://api.current.day/v1/tickets/6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d/merge" \
-H "Authorization: Bearer $CURRENT_API_KEY" \
-H "Content-Type: application/json" \
-d @- <<EOF
{"request_id":"$REQUEST_ID","merge_ticket_id":"a41c7b20-9d3e-4f58-8b16-2e7c5d9f0a34"}
EOF
# A refusal exits non-zero and prints the error: read .error.code and .error.reason,
# for example with jq -r '.error.code, .error.reason'{
"data": {
"merge_id": "f2a6d8c3-1e74-4b95-a0c8-7d3e5b9f1c26",
"keep": "6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d",
"merged": "a41c7b20-9d3e-4f58-8b16-2e7c5d9f0a34",
"moved": {
"messages": 3,
"files": 1
},
"customer_told": false,
"undo": "none"
}
}