Contact
A contact is the face of a person or a group inside a tenant — who a ticket is for, who it is assigned to, who takes part in a thread. Contacts exist independently of accounts: someone can be a contact without ever signing in.
Three kinds exist, and only the first is created through these endpoints:
PERSON
a real individual, created here or alongside a user account
GROUP
the face of an internal group, created together with the group and never by hand
INTAKE
external inbound entity, planned
Returns the tenant's contacts, ordered by id unless sort says otherwise.
Filterable — id, tenantId, kind, title, firstName, lastName, email, phone, mobile, description, autoAssign, assignmentContext, createdAt, updatedAt.
Sortable — id, firstName, lastName, email, phone, mobile, createdAt, updatedAt.
Searchable — nothing yet; use filter with contains on firstName, lastName or email.
Filtering by kind separates people from the group faces: {"field":"kind","op":"eq","value":"PERSON"}.
Token issued by the central equipme authentication, sent as Bearer <token>.
JSON filter expression
Free-text term — no effect here
Comma-separated field:direction terms
Selection of fields and relations
firstName,lastName,emailNumber of entries to skip
0Page size, 1 to 100
100OK
Bad Request
Unauthorized
Forbidden
Internal Server Error
GET /api/v1/contacts HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"count": 1,
"data": [
{
"assignmentContext": "text",
"autoAssign": true,
"createdAt": "2026-01-01T00:00:00.000Z",
"description": "text",
"email": "ada.lovelace@example.com",
"firstName": "Ada",
"id": 17,
"kind": "",
"lastName": "Lovelace",
"mobile": "text",
"phone": "text",
"tenant": {
"id": 1,
"name": "text"
},
"tenantId": 1,
"title": "text",
"updatedAt": "2026-01-01T00:00:00.000Z"
}
]
}Creates a contact of kind PERSON. Every field is optional — a contact with nothing but an email address is valid, and so is one with only a name, because contacts are often created from whatever an inbound message revealed. email is checked for a valid address when it is given.
Group faces cannot be created here; they come into being with their group.
Token issued by the central equipme authentication, sent as Bearer <token>.
Created
Bad Request
Unauthorized
Forbidden
Internal Server Error
POST /api/v1/contacts HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 2
{}{
"data": {
"assignmentContext": "text",
"autoAssign": true,
"createdAt": "2026-01-01T00:00:00.000Z",
"description": "text",
"email": "ada.lovelace@example.com",
"firstName": "Ada",
"id": 17,
"kind": "",
"lastName": "Lovelace",
"mobile": "text",
"phone": "text",
"tenant": {
"id": 1,
"name": "text"
},
"tenantId": 1,
"title": "text",
"updatedAt": "2026-01-01T00:00:00.000Z"
}
}Returns a single contact by its id.
A contact outside the caller's tenant is answered with 404, the same as an id that does not exist.
Token issued by the central equipme authentication, sent as Bearer <token>.
Contact id
17Selection of fields and relations
firstName,lastName,emailOK
Bad Request
Unauthorized
Forbidden
Not Found
Internal Server Error
GET /api/v1/contacts/{contactId} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"data": {
"assignmentContext": "text",
"autoAssign": true,
"createdAt": "2026-01-01T00:00:00.000Z",
"description": "text",
"email": "ada.lovelace@example.com",
"firstName": "Ada",
"id": 17,
"kind": "",
"lastName": "Lovelace",
"mobile": "text",
"phone": "text",
"tenant": {
"id": 1,
"name": "text"
},
"tenantId": 1,
"title": "text",
"updatedAt": "2026-01-01T00:00:00.000Z"
}
}Changes a contact. The body follows JSON Merge Patch semantics: an absent field stays as it is, null clears it, a value sets it.
The kind cannot be changed — a person does not become a group face.
Token issued by the central equipme authentication, sent as Bearer <token>.
Contact id
17OK
Bad Request
Unauthorized
Forbidden
Not Found
Internal Server Error
PATCH /api/v1/contacts/{contactId} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 2
{}{
"data": {
"assignmentContext": "text",
"autoAssign": true,
"createdAt": "2026-01-01T00:00:00.000Z",
"description": "text",
"email": "ada.lovelace@example.com",
"firstName": "Ada",
"id": 17,
"kind": "",
"lastName": "Lovelace",
"mobile": "text",
"phone": "text",
"tenant": {
"id": 1,
"name": "text"
},
"tenantId": 1,
"title": "text",
"updatedAt": "2026-01-01T00:00:00.000Z"
}
}Last updated
Was this helpful?