Skip to content
Current

The Current API is not open yet. These pages describe how it works; you can't create keys or connect apps until it opens.

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.

GET/v1/tickets

Needs 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

Errors this endpoint can answer
StatusCode and meaning
400bad_requestThe request was not in the expected shape.
401unauthorizedThis token was not accepted.
403not_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.
404not_foundNothing was found with that id, or this agent cannot see it.
405bad_request (method_not_allowed)That address does not accept this method. The Allow header lists the ones it does.
429rate_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.
503degradedCurrent is busy. Try again in a minute.
Request
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'
200 answer · a page
{
  "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
}
GET/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

Errors this endpoint can answer
StatusCode and meaning
400bad_requestThe request was not in the expected shape.
401unauthorizedThis token was not accepted.
403not_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.
404not_foundNothing was found with that id, or this agent cannot see it.
405bad_request (method_not_allowed)That address does not accept this method. The Allow header lists the ones it does.
429rate_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.
503degradedCurrent is busy. Try again in a minute.
Request
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'
200 answer · one record
{
  "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": []
    }
  }
}
PATCH/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

Errors this endpoint can answer
StatusCode and meaning
400bad_requestThe request was not in the expected shape.
401unauthorizedThis token was not accepted.
403not_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.
404not_foundNothing was found with that id, or this agent cannot see it.
405bad_request (method_not_allowed)That address does not accept this method. The Allow header lists the ones it does.
409conflictSomeone changed this first. Read it again, then retry.
413bad_request (body_too_large)The request body is larger than 64 KB.
429rate_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.
503degradedCurrent is busy. Try again in a minute.
Request
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'
200 answer · one record
{
  "data": {
    "ticket_id": "6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d",
    "status": "waiting_customer",
    "priority": "normal",
    "waiting_reason": "customer"
  }
}
POST/v1/tickets/{ticket_id}/assign

Needs 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

Errors this endpoint can answer
StatusCode and meaning
400bad_requestThe request was not in the expected shape.
401unauthorizedThis token was not accepted.
403not_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.
404not_foundNothing was found with that id, or this agent cannot see it.
405bad_request (method_not_allowed)That address does not accept this method. The Allow header lists the ones it does.
409conflictSomeone changed this first. Read it again, then retry.
413bad_request (body_too_large)The request body is larger than 64 KB.
429rate_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.
503degradedCurrent is busy. Try again in a minute.
Request
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'
200 answer · one record
{
  "data": {
    "ticket_id": "6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d",
    "assignee_id": "8d4b6f1a-2c9e-4e73-b05d-7a1e3c5f9b48",
    "previous_assignee_id": null
  }
}
POST/v1/tickets/{ticket_id}/close

Needs 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

Errors this endpoint can answer
StatusCode and meaning
400bad_requestThe request was not in the expected shape.
401unauthorizedThis token was not accepted.
403not_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.
404not_foundNothing was found with that id, or this agent cannot see it.
405bad_request (method_not_allowed)That address does not accept this method. The Allow header lists the ones it does.
409conflictSomeone changed this first. Read it again, then retry.
413bad_request (body_too_large)The request body is larger than 64 KB.
429rate_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.
503degradedCurrent is busy. Try again in a minute.
Request
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'
200 answer · one record
{
  "data": {
    "ticket_id": "6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d",
    "closed": true,
    "customer_notice": {
      "untrusted_text": "none",
      "source": "customer"
    },
    "note_id": "b3f8e1a6-7d24-4c09-a5e3-9f2c6d1b8a74"
  }
}
POST/v1/tickets/{ticket_id}/undo-close

Needs 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

Errors this endpoint can answer
StatusCode and meaning
400bad_requestThe request was not in the expected shape.
401unauthorizedThis token was not accepted.
403not_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.
404not_foundNothing was found with that id, or this agent cannot see it.
405bad_request (method_not_allowed)That address does not accept this method. The Allow header lists the ones it does.
409conflictSomeone changed this first. Read it again, then retry.
413bad_request (body_too_large)The request body is larger than 64 KB.
429rate_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.
503degradedCurrent is busy. Try again in a minute.
Request
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'
200 answer · one record
{
  "data": {
    "ticket_id": "6f1d2e8b-4c10-4a7e-9a52-0b8f2c5e3c1d",
    "status": "open",
    "from_status": "closed"
  }
}
POST/v1/tickets/{keep_ticket_id}/merge

Needs 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

Errors this endpoint can answer
StatusCode and meaning
400bad_requestThe request was not in the expected shape.
401unauthorizedThis token was not accepted.
403not_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.
404not_foundNothing was found with that id, or this agent cannot see it.
405bad_request (method_not_allowed)That address does not accept this method. The Allow header lists the ones it does.
409conflictSomeone changed this first. Read it again, then retry.
413bad_request (body_too_large)The request body is larger than 64 KB.
429rate_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.
503degradedCurrent is busy. Try again in a minute.
Request
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'
200 answer · one record
{
  "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"
  }
}
Was this helpful?