Skip to content

Contacts API

Manage customer contact records and their associated companies.

Contacts

Endpoints

MethodEndpointDescription
GET/contactsList contacts
POST/contactsCreate contact
GET/contacts/:idGet contact
PATCH/contacts/:idUpdate contact
DELETE/contacts/:idDelete contact

List Contacts

Terminal window
GET /api/v1/contacts

Query Parameters

ParameterTypeDescription
searchstringSearch name or email
company_iduuidFilter by company
pageintegerPage number
per_pageintegerItems per page

Response

{
"data": [
{
"id": "contact-uuid",
"name": "John Doe",
"email": "john@example.com",
"phone": "+1234567890",
"company": {
"id": "company-uuid",
"name": "Acme Corp"
},
"ticket_count": 12,
"created_at": "2024-01-10T09:00:00Z"
}
],
"meta": {
"total": 250,
"page": 1,
"per_page": 20
}
}

Create Contact

Terminal window
POST /api/v1/contacts
{
"name": "John Doe",
"email": "john@example.com",
"phone": "+1234567890",
"company_id": "company-uuid",
"notes": "VIP customer, handle with care"
}
FieldTypeRequiredDescription
namestringYesContact name
emailstringYesEmail address (unique)
phonestringNoPhone number
company_iduuidNoAssociated company
notesstringNoInternal notes

Get Contact

Terminal window
GET /api/v1/contacts/:id

Returns contact with recent tickets:

{
"data": {
"id": "contact-uuid",
"name": "John Doe",
"email": "john@example.com",
"phone": "+1234567890",
"company": { ... },
"notes": "VIP customer",
"recent_tickets": [
{ "id": "...", "code": "ACME-42", "subject": "..." }
],
"total_tickets": 12,
"created_at": "2024-01-10T09:00:00Z",
"updated_at": "2024-01-15T14:30:00Z"
}
}

Update Contact

Terminal window
PATCH /api/v1/contacts/:id
{
"name": "John Smith",
"phone": "+1987654321"
}

Delete Contact

Terminal window
DELETE /api/v1/contacts/:id

Companies

Endpoints

MethodEndpointDescription
GET/companiesList companies
POST/companiesCreate company
GET/companies/:idGet company
PATCH/companies/:idUpdate company
DELETE/companies/:idDelete company

List Companies

Terminal window
GET /api/v1/companies

Response

{
"data": [
{
"id": "company-uuid",
"name": "Acme Corp",
"domains": ["acme.com", "acme.co.uk"],
"hourly_rate": 150.00,
"currency": "USD",
"contact_count": 5,
"ticket_count": 42
}
]
}

Create Company

Terminal window
POST /api/v1/companies
{
"name": "Acme Corp",
"domains": ["acme.com"],
"hourly_rate": 150.00,
"currency": "USD",
"ticket_prefix": "ACME",
"notes": "Enterprise customer since 2020"
}
FieldTypeRequiredDescription
namestringYesCompany name
domainsstring[]NoEmail domains for auto-linking
hourly_ratedecimalNoBilling rate
currencystringNoUSD, EUR, GBP, etc.
ticket_prefixstringNoOverride default prefix
notesstringNoInternal notes

Domain Auto-Linking

When you set domains on a company:

  • New contacts with matching email domains are auto-linked
  • Existing contacts can be batch-updated
{
"domains": ["acme.com", "acme.co.uk", "acme.eu"]
}

Any contact with @acme.com, @acme.co.uk, or @acme.eu email will be linked.

Get Company

Terminal window
GET /api/v1/companies/:id

Returns company with contacts and recent tickets:

{
"data": {
"id": "company-uuid",
"name": "Acme Corp",
"domains": ["acme.com"],
"hourly_rate": 150.00,
"currency": "USD",
"ticket_prefix": "ACME",
"contacts": [
{ "id": "...", "name": "John Doe", "email": "john@acme.com" }
],
"recent_tickets": [ ... ],
"total_tickets": 42,
"total_time_minutes": 1250
}
}

Update Company

Terminal window
PATCH /api/v1/companies/:id
{
"hourly_rate": 175.00,
"domains": ["acme.com", "acme.io"]
}

Delete Company

Terminal window
DELETE /api/v1/companies/:id

Contacts remain but are unlinked from the company.

Error Codes

CodeDescription
CONTACT_NOT_FOUNDContact doesn’t exist
COMPANY_NOT_FOUNDCompany doesn’t exist
EMAIL_ALREADY_EXISTSEmail address is already used
INVALID_EMAILEmail format is invalid
INVALID_DOMAINDomain format is invalid