For the complete documentation index, see llms.txt. This page is also available as Markdown.

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:

Kind
Where it comes from

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

List contacts

get

Returns the tenant's contacts, ordered by id unless sort says otherwise.

Filterableid, tenantId, kind, title, firstName, lastName, email, phone, mobile, description, autoAssign, assignmentContext, createdAt, updatedAt.

Sortableid, 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"}.

Authorizations
AuthorizationstringRequired

Token issued by the central equipme authentication, sent as Bearer <token>.

Query parameters
filterstringOptional

JSON filter expression

searchstringOptional

Free-text term — no effect here

sortstringOptional

Comma-separated field:direction terms

fieldsstringOptional

Selection of fields and relations

Example: firstName,lastName,email
offsetintegerOptional

Number of entries to skip

Default: 0
limitintegerOptional

Page size, 1 to 100

Default: 100
Responses
200

OK

application/json
countintegerOptional
get/v1/contacts
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"
    }
  ]
}

Create a contact

post

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.

Authorizations
AuthorizationstringRequired

Token issued by the central equipme authentication, sent as Bearer <token>.

Body
objectOptional
or
Responses
201

Created

application/json
post/v1/contacts
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"
  }
}

Get a contact

get

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.

Authorizations
AuthorizationstringRequired

Token issued by the central equipme authentication, sent as Bearer <token>.

Path parameters
contactIdintegerRequired

Contact id

Example: 17
Query parameters
fieldsstringOptional

Selection of fields and relations

Example: firstName,lastName,email
Responses
200

OK

application/json
get/v1/contacts/{contactId}
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"
  }
}

Change a contact

patch

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.

Authorizations
AuthorizationstringRequired

Token issued by the central equipme authentication, sent as Bearer <token>.

Path parameters
contactIdintegerRequired

Contact id

Example: 17
Body
objectOptional
or
Responses
200

OK

application/json
patch/v1/contacts/{contactId}
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?