Customers
Customers (organisations), their agreements, and their links to RMM sites and to a Bramble organisation.
| Method | Path | Summary |
|---|---|---|
| GET | /v1/app/psa/customers | List customers |
| POST | /v1/app/psa/customers | Create customer |
| POST | /v1/app/psa/customers/:id | Update customer |
| POST | /v1/app/psa/customers/:id/delete | Delete customer |
| GET | /v1/app/psa/customers/:id/contacts | Contacts for a customer |
| GET | /v1/app/psa/customers/:id/tickets | Tickets for a customer |
| GET | /v1/app/psa/customers/:id/devices | ════════════════════════════════════════════════════════════════════════════════ CUSTOMER ↔ RMM DEVICES (RMM-license gated) ════════════════════════════════… |
| GET | /v1/app/psa/rmm-sites | RMM sites (to link to customers) |
| POST | /v1/app/psa/customers/:id/link-site | Link a customer to an RMM site |
| GET | /v1/app/psa/customers/:id/links | One customer record (ticket #85, services/customerLinks.js): the RMM sites and the customer's own Bramble organisation linked to a PSA customer, plus what co… |
| GET | /v1/app/psa/customers/:id/agreement | A customer's agreement |
| POST | /v1/app/psa/customers/:id/agreement | Add an agreement line |
| PUT | /v1/app/psa/customers/:id/agreement/:lineId | Update an agreement line |
| DELETE | /v1/app/psa/customers/:id/agreement/:lineId | Remove an agreement line |
| PUT | /v1/app/psa/customers/:id/bramble-tenant | Link a customer to its Bramble organisation |
| POST | /v1/app/psa/customers/:id/unlink-site | Unlink a customer from an RMM site |
#List customers
/v1/app/psa/customers- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/customers- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Response 200
| Field | Type | Description |
|---|---|---|
customers | array of object | |
customers[].id | integer | |
customers[].tenant_id | integer | |
customers[].name | string | |
customers[].domain | string, or null | |
customers[].phone | string, or null | |
customers[].address | string, or null | |
customers[].notes | string, or null | |
customers[].account_manager_id | integer, or null | |
customers[].created_at | string (date-time), or null | |
customers[].updated_at | string (date-time), or null | |
customers[].status | string | |
customers[].org_type | string, or null | |
customers[].short_name | string, or null | |
customers[].website | string, or null | |
customers[].alert_note | string, or null | |
customers[].primary_contact_id | integer, or null | |
customers[].logo_file_id | integer, or null | |
customers[].bramble_tenant_id | integer, or null | |
customers[].customer_type_id | integer, or null | |
customers[].contact_count | boolean | |
customers[].open_ticket_count | boolean |
Example response
{
"customers": [
{
"id": 42,
"tenant_id": 1,
"name": "Example name",
"domain": "string",
"phone": "string",
"address": "string",
"notes": "string",
"account_manager_id": 7,
"created_at": "2026-11-12T09:30:00.000Z",
"updated_at": "2026-11-12T09:30:00.000Z",
"status": "active",
"org_type": "string",
"short_name": "Example short name",
"website": "string",
"alert_note": "string",
"primary_contact_id": 7,
"logo_file_id": 7,
"bramble_tenant_id": 7,
"customer_type_id": 7,
"contact_count": false,
"open_ticket_count": false
}
]
}Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/customers', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/customers",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers' -Headers $headers#Create customer
/v1/app/psa/customers- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/customers- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Request body JSON
| Name | Type | Description |
|---|---|---|
namerequired | string | |
domain | string | |
phone | any | |
address | any | |
notes | array of any | |
account_manager_id | integer |
Response 200
| Field | Type | Description |
|---|---|---|
customer | any |
Example response
{
"customer": null
}Errors
| Status | Message |
|---|---|
| 400 | name is required |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Example name","domain":"string","phone":"…","address":"…","notes":[],"account_manager_id":7}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/customers', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"name":"Example name","domain":"string","phone":"…","address":"…","notes":[],"account_manager_id":7}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/customers",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"name":"Example name","domain":"string","phone":"…","address":"…","notes":[],"account_manager_id":7},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"name":"Example name","domain":"string","phone":"…","address":"…","notes":[],"account_manager_id":7}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers' -Headers $headers -ContentType 'application/json' -Body $body#Update customer
/v1/app/psa/customers/:id- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/: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 |
Request body JSON
| Name | Type | Description |
|---|---|---|
name | string | |
domain | string | |
phone | any | |
address | any | |
notes | array of any | |
account_manager_id | integer |
Response 200
| Field | Type | Description |
|---|---|---|
customer | any |
Example response
{
"customer": null
}Errors
| Status | Message |
|---|---|
| 404 | Customer not found |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Example name","domain":"string","phone":"…","address":"…","notes":[],"account_manager_id":7}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"name":"Example name","domain":"string","phone":"…","address":"…","notes":[],"account_manager_id":7}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"name":"Example name","domain":"string","phone":"…","address":"…","notes":[],"account_manager_id":7},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"name":"Example name","domain":"string","phone":"…","address":"…","notes":[],"account_manager_id":7}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42' -Headers $headers -ContentType 'application/json' -Body $body#Delete customer
/v1/app/psa/customers/:id/delete- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/: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
{
"success": true
}Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/delete' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/delete', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/delete",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/delete' -Headers $headers#Contacts for a customer
/v1/app/psa/customers/:id/contacts- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/:id/contacts- 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 |
|---|---|---|
contacts | array of object | |
contacts[].id | integer | |
contacts[].tenant_id | integer | |
contacts[].customer_id | integer, or null | |
contacts[].first_name | string | |
contacts[].last_name | string | |
contacts[].email | string, or null | |
contacts[].phone | string, or null | |
contacts[].job_title | string, or null | |
contacts[].notes | string, or null | |
contacts[].created_at | string (date-time), or null | |
contacts[].updated_at | string (date-time), or null | |
contacts[].mobile | string, or null | |
contacts[].contact_type | string, or null | |
contacts[].location_id | integer, or null | |
contacts[].is_important | boolean |
Example response
{
"contacts": [
{
"id": 42,
"tenant_id": 1,
"customer_id": 7,
"first_name": "Alex",
"last_name": "Morgan",
"email": "alex@example.com",
"phone": "string",
"job_title": "Example job title",
"notes": "string",
"created_at": "2026-11-12T09:30:00.000Z",
"updated_at": "2026-11-12T09:30:00.000Z",
"mobile": "string",
"contact_type": "string",
"location_id": 7,
"is_important": true
}
]
}Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/contacts' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/contacts', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/contacts",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/contacts' -Headers $headers#Tickets for a customer
/v1/app/psa/customers/:id/tickets- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/:id/tickets- 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 |
|---|---|---|
tickets | array of object | |
tickets[].id | integer | |
tickets[].subject | string | |
tickets[].status | string: "open" | "pending" | "on-hold" | "closed" | |
tickets[].priority | string: "low" | "medium" | "high" | "critical" | |
tickets[].updated_at | string (date-time), or null |
Example response
{
"tickets": [
{
"id": 42,
"subject": "Example subject",
"status": "open",
"priority": "low",
"updated_at": "2026-11-12T09:30:00.000Z"
}
]
}Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/tickets' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/tickets', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/tickets",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/tickets' -Headers $headers#════════════════════════════════════════════════════════════════════════════════ CUSTOMER ↔ RMM DEVICES (RMM-license gated) ════════════════════════════════…
/v1/app/psa/customers/:id/devices════════════════════════════════════════════════════════════════════════════════ CUSTOMER ↔ RMM DEVICES (RMM-license gated) ════════════════════════════════════════════════════════════════════════════════ Reuses bramble_rmm.sites.client_id (added by BRM-Schemas/2026-08-02_rmm_site_client_scoping.sql for the client-portal "your devices" feature — see v1-appPortal.js GET /devices for the same join) rather than a new per-device table: a customer is tagged by linking one or more RMM sites to it, and every device at a linked site counts as that customer's. Previously only settable from BRM-Admin's RMM site editor (v1-admin.js POST/PUT /rmm/sites) with no PSA-side UI at all.
- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/:id/devices- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Licence: RMM.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
sites | array of any | |
devices | array of any |
Example response
{
"sites": [],
"devices": []
}Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/devices' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/devices', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/devices",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/devices' -Headers $headers#RMM sites (to link to customers)
/v1/app/psa/rmm-sites- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/rmm-sites- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Licence: RMM.
Response 200
| Field | Type | Description |
|---|---|---|
sites | array of object | |
sites[].id | integer | |
sites[].site_name | string | |
sites[].client_id | integer, or null |
Example response
{
"sites": [
{
"id": 42,
"site_name": "Example site name",
"client_id": 7
}
]
}Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/psa/rmm-sites' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/rmm-sites', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/rmm-sites",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/rmm-sites' -Headers $headers#Link a customer to an RMM site
/v1/app/psa/customers/:id/link-site- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/:id/link-site- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Licence: RMM.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Request body JSON
| Name | Type | Description |
|---|---|---|
site_idrequired | integer | The RMM site. |
Response 200
| Field | Type | Description |
|---|---|---|
success | boolean |
Example response
{
"success": true
}Errors
| Status | Message |
|---|---|
| 400 | site_id required |
| 404 | Customer not found |
| 404 | Site not found |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/link-site' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"site_id":7}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/link-site', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"site_id":7}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/link-site",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"site_id":7},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"site_id":7}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/link-site' -Headers $headers -ContentType 'application/json' -Body $body#One customer record (ticket #85, services/customerLinks.js): the RMM sites and the customer's own Bramble organisation linked to a PSA customer, plus what co…
/v1/app/psa/customers/:id/linksOne customer record (ticket #85, services/customerLinks.js): the RMM sites and the customer's own Bramble organisation linked to a PSA customer, plus what could be linked (with suggestions by name).
- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/:id/links- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | number |
Response 200
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/links' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/links', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/links",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/links' -Headers $headers#A customer's agreement
/v1/app/psa/customers/:id/agreement- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/:id/agreement- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | number |
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/agreement' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/agreement', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/agreement",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/agreement' -Headers $headers#Add an agreement line
/v1/app/psa/customers/:id/agreement- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/:id/agreement- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | number |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/agreement' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/agreement', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/agreement",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/agreement' -Headers $headers#Update an agreement line
/v1/app/psa/customers/:id/agreement/:lineId- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/:id/agreement/:lineId- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | number | |
lineIdrequired | number |
Example request
curl -X PUT 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/agreement/12.5' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/agreement/12.5', {
method: 'PUT',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.put(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/agreement/12.5",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method PUT -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/agreement/12.5' -Headers $headers#Remove an agreement line
/v1/app/psa/customers/:id/agreement/:lineId- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/:id/agreement/:lineId- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | number | |
lineIdrequired | number |
Example request
curl -X DELETE 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/agreement/12.5' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/agreement/12.5', {
method: 'DELETE',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.delete(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/agreement/12.5",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method DELETE -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/agreement/12.5' -Headers $headers#Link a customer to its Bramble organisation
/v1/app/psa/customers/:id/bramble-tenant- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/:id/bramble-tenant- 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 |
|---|---|---|
tenant_id | integer | The customer's Bramble organisation (for MSPs managing them as a partner). |
Response 200
Example request
curl -X PUT 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/bramble-tenant' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"tenant_id":1}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/bramble-tenant', {
method: 'PUT',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"tenant_id":1}),
});
const data = await res.json();import os, requests
r = requests.put(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/bramble-tenant",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"tenant_id":1},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"tenant_id":1}'
Invoke-RestMethod -Method PUT -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/12.5/bramble-tenant' -Headers $headers -ContentType 'application/json' -Body $body#Unlink a customer from an RMM site
/v1/app/psa/customers/:id/unlink-site- Address
https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/:id/unlink-site- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Licence: PSA.
Licence: RMM.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Request body JSON
| Name | Type | Description |
|---|---|---|
site_idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
success | boolean |
Example response
{
"success": true
}Errors
| Status | Message |
|---|---|
| 400 | site_id required |
| 404 | Site not found or not linked to this customer |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/unlink-site' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"site_id":7}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/unlink-site', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"site_id":7}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/unlink-site",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"site_id":7},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"site_id":7}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/app/psa/customers/42/unlink-site' -Headers $headers -ContentType 'application/json' -Body $bodyWas this page helpful?
Thanks for your feedback.