Tickets
Searching and listing tickets, one ticket with its conversation, creating, updating, bulk changes, replies and notes, and attachments.
| Method | Path | Summary |
|---|---|---|
| GET | /v1/app/psa/check | Check PSA app access |
| GET | /v1/app/psa/tickets | List tickets for tenant |
| GET | /v1/app/psa/tickets/:id | Get a single ticket with messages and activity |
| POST | /v1/app/psa/tickets | Create a ticket |
| POST | /v1/app/psa/tickets/bulk | Bulk update tickets (close, set_status, set_type, set_category, set_priority, assign) |
| POST | /v1/app/psa/tickets/:id | Update ticket fields |
| POST | /v1/app/psa/tickets/:id/delete | Delete ticket |
| POST | /v1/app/psa/tickets/:id/messages | Add a message or internal note to a ticket |
| GET | /v1/app/psa/attachments/:id | Download/view an attachment by DB id |
| GET | /v1/app/psa/tickets/:id/attachments | List attachments for a ticket |
#Check PSA app access
GET
/v1/app/psa/check- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/check- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Response 200
| Field | Type | Description |
|---|---|---|
ok | boolean | |
user | object | |
user.id | integer | |
user.roles | array of any |
Example response
JSON
{
"ok": true,
"user": {
"id": 42,
"roles": []
}
}Errors
| Status | Message |
|---|---|
| 404 | User not found |
Example request
Bash
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/psa/check' \
-H "X-API-Key: $BRAMBLE_KEY"JavaScript
const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/check', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();Python
import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/check",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()PowerShell
$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/check' -Headers $headers#List tickets for tenant
GET
/v1/app/psa/tickets- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Query parameters
| Name | Type | Description |
|---|---|---|
view | any | |
q | any | |
queue_id | number | |
customer_id | number | |
priority | string: "low" | "medium" | "high" | "critical" | |
type_id | number | |
category_id | number | |
status_id | number | |
limit | integer | |
offset | integer |
Response 200
| Field | Type | Description |
|---|---|---|
tickets | array of object | |
tickets[].preview | array of any | |
tickets[].last_body | any | |
tickets[].minutes | integer | |
tickets[].contact_role_ids | array of any | |
more | any | |
counts | array of any | |
queue_open | any |
Example response
JSON
{
"tickets": [
{
"…r": "…",
"preview": [],
"last_body": null,
"minutes": 1,
"contact_role_ids": []
}
],
"more": null,
"counts": [],
"queue_open": null
}Example request
Bash
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets' \
-H "X-API-Key: $BRAMBLE_KEY"JavaScript
const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();Python
import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()PowerShell
$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets' -Headers $headers#Get a single ticket with messages and activity
GET
/v1/app/psa/tickets/:id- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/:id- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
ticket | any | |
messages | array of any | |
activity | any |
Example response
JSON
{
"ticket": null,
"messages": [],
"activity": null
}Errors
| Status | Message |
|---|---|
| 404 | Ticket not found |
Example request
Bash
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/42' \
-H "X-API-Key: $BRAMBLE_KEY"JavaScript
const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/42', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();Python
import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/42",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()PowerShell
$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/42' -Headers $headers#Create a ticket
POST
/v1/app/psa/tickets- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Request body JSON
| Name | Type | Description |
|---|---|---|
type_id | integer | |
category_id | integer | |
subcategory_id | integer | |
subjectrequired | any | |
queue_idrequired | number | |
customer_id | integer | |
contact_id | integer | |
priority | any | |
assigned_to | any | |
body_html | any | |
body | any |
Response 200
| Field | Type | Description |
|---|---|---|
ticket | any |
Example response
JSON
{
"ticket": null
}Errors
| Status | Message |
|---|---|
| 400 | subject, body and queue_id required |
| 400 | Unknown queue |
| 400 | That type isn't used in this queue |
Example request
Bash
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"type_id":7,"category_id":7,"subcategory_id":7,"subject":"…","queue_id":12.5,"customer_id":7,"contact_id":7,"priority":"…","assigned_to":"…","body_html":"…","body":"…"}'JavaScript
const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"type_id":7,"category_id":7,"subcategory_id":7,"subject":"…","queue_id":12.5,"customer_id":7,"contact_id":7,"priority":"…","assigned_to":"…","body_html":"…","body":"…"}),
});
const data = await res.json();Python
import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"type_id":7,"category_id":7,"subcategory_id":7,"subject":"…","queue_id":12.5,"customer_id":7,"contact_id":7,"priority":"…","assigned_to":"…","body_html":"…","body":"…"},
)
r.raise_for_status()
data = r.json()PowerShell
$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"type_id":7,"category_id":7,"subcategory_id":7,"subject":"…","queue_id":12.5,"customer_id":7,"contact_id":7,"priority":"…","assigned_to":"…","body_html":"…","body":"…"}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets' -Headers $headers -ContentType 'application/json' -Body $body#Bulk update tickets (close, set_status, set_type, set_category, set_priority, assign)
POST
/v1/app/psa/tickets/bulkBulk update tickets (close, set_status, set_type, set_category, set_priority, assign). set_status takes a status id as value. Closing (close, or a status in the Closed group) skips tickets without a type and category and reports them as skipped.
- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/bulk- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Request body JSON
| Name | Type | Description |
|---|---|---|
actionrequired | string | |
ticket_idsrequired | array of any | |
value | number: "low" | "medium" | "high" | "critical" |
Response 200
| Field | Type | Description |
|---|---|---|
updated | integer | |
skipped | any |
Example response
JSON
{
"updated": 1,
"skipped": null
}Errors
| Status | Message |
|---|---|
| 400 | action and ticket_ids[] required |
| 400 | No valid ticket IDs |
| 400 | Unknown status |
| 400 | None of these tickets' queues use that status |
| 400 | None of these tickets' queues use that type |
| 400 | Set a type and category on these tickets before closing them |
| 400 | Invalid priority value |
| 404 | No matching tickets found |
| 400 | Unknown action |
Example request
Bash
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/bulk' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"action":"string","ticket_ids":[],"value":"low"}'JavaScript
const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/bulk', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"action":"string","ticket_ids":[],"value":"low"}),
});
const data = await res.json();Python
import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/bulk",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"action":"string","ticket_ids":[],"value":"low"},
)
r.raise_for_status()
data = r.json()PowerShell
$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"action":"string","ticket_ids":[],"value":"low"}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/bulk' -Headers $headers -ContentType 'application/json' -Body $body#Update ticket fields
POST
/v1/app/psa/tickets/:id- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/:id- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | number |
Request body JSON
| Name | Type | Description |
|---|---|---|
type_id | integer | |
category_id | integer | |
subcategory_id | integer | |
status_id | number | |
status | string | |
queue_id | number | |
subjectrequired | any | |
reply_to_email | string | |
cc_emails | string (email) | |
assigned_to | number | |
key | string |
Response 200
| Field | Type | Description |
|---|---|---|
ticket | any |
Example response
JSON
{
"ticket": null
}Errors
| Status | Message |
|---|---|
| 400 | Unknown status |
| 400 | A ticket needs a queue |
| 400 | Unknown queue |
| 400 | "…" isn't used in this queue |
| 400 | That type isn't used in this queue |
| 400 | The subject can't be empty |
| 400 | Invalid reply-to email address |
| 404 | Ticket not found |
Example request
Bash
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/12.5' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"type_id":7,"category_id":7,"subcategory_id":7,"status_id":12.5,"status":"active","queue_id":12.5,"subject":"…","reply_to_email":"alex@example.com","cc_emails":"alex@example.com","assigned_to":12.5,"key":"…"}'JavaScript
const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/12.5', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"type_id":7,"category_id":7,"subcategory_id":7,"status_id":12.5,"status":"active","queue_id":12.5,"subject":"…","reply_to_email":"alex@example.com","cc_emails":"alex@example.com","assigned_to":12.5,"key":"…"}),
});
const data = await res.json();Python
import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/12.5",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"type_id":7,"category_id":7,"subcategory_id":7,"status_id":12.5,"status":"active","queue_id":12.5,"subject":"…","reply_to_email":"alex@example.com","cc_emails":"alex@example.com","assigned_to":12.5,"key":"…"},
)
r.raise_for_status()
data = r.json()PowerShell
$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"type_id":7,"category_id":7,"subcategory_id":7,"status_id":12.5,"status":"active","queue_id":12.5,"subject":"…","reply_to_email":"alex@example.com","cc_emails":"alex@example.com","assigned_to":12.5,"key":"…"}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/12.5' -Headers $headers -ContentType 'application/json' -Body $body#Delete ticket
POST
/v1/app/psa/tickets/:id/delete- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/:id/delete- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
success | boolean |
Example response
JSON
{
"success": true
}Errors
| Status | Message |
|---|---|
| 404 | Ticket not found |
Example request
Bash
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/42/delete' \
-H "X-API-Key: $BRAMBLE_KEY"JavaScript
const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/42/delete', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();Python
import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/42/delete",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()PowerShell
$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/42/delete' -Headers $headers#Add a message or internal note to a ticket
POST
/v1/app/psa/tickets/:id/messages- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/:id/messages- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | number (email) |
Request body JSON
| Name | Type | Description |
|---|---|---|
type | string | |
body_html | any | |
body | any | |
attachments | array of any | |
status_id | integer | |
status | string | |
to | string (email) | |
cc | string (email) | |
is_resolution | boolean |
Response 200
| Field | Type | Description |
|---|---|---|
message | string |
Example response
JSON
{
"message": "Saved"
}Errors
| Status | Message |
|---|---|
| 400 | Write a message first |
| 400 | Attachments can be up to 15 MB each and 25 MB in total |
| 400 | Unknown status |
| 400 | Invalid To email address |
| 400 | "…" isn't used in this queue |
| 404 | Ticket not found |
Example request
Bash
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/12.5/messages' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"type":"string","body_html":"…","body":"…","attachments":[],"status_id":7,"status":"active","to":"string","cc":"string","is_resolution":true}'JavaScript
const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/12.5/messages', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"type":"string","body_html":"…","body":"…","attachments":[],"status_id":7,"status":"active","to":"string","cc":"string","is_resolution":true}),
});
const data = await res.json();Python
import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/12.5/messages",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"type":"string","body_html":"…","body":"…","attachments":[],"status_id":7,"status":"active","to":"string","cc":"string","is_resolution":True},
)
r.raise_for_status()
data = r.json()PowerShell
$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"type":"string","body_html":"…","body":"…","attachments":[],"status_id":7,"status":"active","to":"string","cc":"string","is_resolution":true}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/12.5/messages' -Headers $headers -ContentType 'application/json' -Body $body#Download/view an attachment by DB id
GET
/v1/app/psa/attachments/:id- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/attachments/:id- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response
A file or page.
Errors
| Status | Message |
|---|---|
| 404 | Attachment not found |
| 403 | Forbidden |
| 404 | File not found |
Example request
Bash
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/psa/attachments/42' \
-H "X-API-Key: $BRAMBLE_KEY"JavaScript
const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/attachments/42', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();Python
import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/attachments/42",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()PowerShell
$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/attachments/42' -Headers $headers#List attachments for a ticket
GET
/v1/app/psa/tickets/:id/attachments- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/:id/attachments- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
attachments | array of object | |
attachments[].id | integer | |
attachments[].ticket_id | integer | |
attachments[].message_id | integer, or null | |
attachments[].filename | string | |
attachments[].mime_type | string, or null | |
attachments[].size_bytes | integer, or null | |
attachments[].created_at | string (date-time), or null |
Example response
JSON
{
"attachments": [
{
"id": 42,
"ticket_id": 7,
"message_id": 7,
"filename": "Example filename",
"mime_type": "string",
"size_bytes": 1,
"created_at": "2026-11-12T09:30:00.000Z"
}
]
}Errors
| Status | Message |
|---|---|
| 404 | Ticket not found |
Example request
Bash
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/42/attachments' \
-H "X-API-Key: $BRAMBLE_KEY"JavaScript
const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/42/attachments', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();Python
import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/42/attachments",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()PowerShell
$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/tickets/42/attachments' -Headers $headersWas this page helpful?
Thanks for your feedback.