Skip to content

Autocomplete contacts

GET
/contacts/autocomplete
curl --request GET \
--url 'https://contacts.work.optidata.cloud/api/contacts/autocomplete?query=ana&limit=50' \
--header 'Authorization: Bearer <token>'

Suggestions for a partially typed name, e-mail address or phone number — built for recipient fields and contact pickers. Matching and ranking are the same as GET /contacts/search, but the answer is a flat list and each suggestion’s emails and phones are plain strings, ready to display.

For accounts whose mail is hosted on the Optiwork mail platform, the list also includes the caller’s contact groups that match the term. A group suggestion has the shape of ContactSuggestionFromMail, with type: groupContact and the members’ addresses in emails. The same shape is used for every suggestion while the caller’s address book is being prepared for the first time.

query
required
string
>= 1 characters <= 255 characters

What the user has typed so far.

limit
integer
default: 50 >= 1 <= 100

Maximum number of suggestions to return.

Suggestions, best match first.

Media typeapplication/json
Array
One of:

An address-book contact offered as an autocomplete suggestion.

object
id
required

Contact id.

integer
type
required

What a contact represents. person and organization are the everyday kinds; the others identify mail-platform entries kept in the address book (distribution_list, group, resource) and secondary addresses that point to another contact (alias).

string
Allowed values: person organization distribution_list group resource alias
name
required

Display name — a person’s full name or an organization’s name.

string | null
avatar_url

URL of the contact’s picture, when one was set.

string | null
job_title

A person’s job title. Always null for an organization.

string | null
birthdate

Birth date, at midnight UTC.

string | null format: date-time
website
string | null
notes

Free-form notes.

string | null
custom_fields

Additional user-defined fields, as name/value pairs.

object | null
address

Postal address, as a single line of text.

string | null
identification_number

A tax or company registration number.

string | null
scope
required

Who a contact belongs to. user is a personal address-book entry; company is an entry shared across the company.

string
Allowed values: user company
cuid

Identifier of the company the contact was created in.

string
created_by_id
required

Numeric id of the user who owns the contact — always the caller.

integer
created_by_uuid
required

UUID of the user who owns the contact — always the caller.

string format: uuid
zimbra_id

Id of the matching entry in the mail platform’s address book, when the contact was imported from it.

string | null
app_id

Id of the Optiwork module that added the contact automatically (for example, Calendar when you invite someone new), or null when it was added by hand or imported.

integer | null
app_action

What, in that module, caused the contact to be added.

string | null
canonical_contact_id

For an alias, the id of the contact it points to.

integer | null
created_at
required
string format: date-time
updated_at
required
string format: date-time
deleted_at

Always null — contacts in the trash are not returned.

string | null format: date-time
score

Relevance, as in GET /contacts/search.

integer
emails
required

E-mail addresses, the primary one first.

Array<string>
phones
required

Phone numbers, as entered, the primary one first.

Array<string>
companies
required

The organizations a person works for.

Array

An employer of a person contact.

object
id
required

Contact id.

integer
type
required

What a contact represents. person and organization are the everyday kinds; the others identify mail-platform entries kept in the address book (distribution_list, group, resource) and secondary addresses that point to another contact (alias).

string
Allowed values: person organization distribution_list group resource alias
name
required

Display name — a person’s full name or an organization’s name.

string | null
avatar_url

URL of the contact’s picture, when one was set.

string | null
job_title

A person’s job title. Always null for an organization.

string | null
birthdate

Birth date, at midnight UTC.

string | null format: date-time
website
string | null
notes

Free-form notes.

string | null
custom_fields

Additional user-defined fields, as name/value pairs.

object | null
address

Postal address, as a single line of text.

string | null
identification_number

A tax or company registration number.

string | null
scope
required

Who a contact belongs to. user is a personal address-book entry; company is an entry shared across the company.

string
Allowed values: user company
cuid

Identifier of the company the contact was created in.

string
created_by_id
required

Numeric id of the user who owns the contact — always the caller.

integer
created_by_uuid
required

UUID of the user who owns the contact — always the caller.

string format: uuid
zimbra_id

Id of the matching entry in the mail platform’s address book, when the contact was imported from it.

string | null
app_id

Id of the Optiwork module that added the contact automatically (for example, Calendar when you invite someone new), or null when it was added by hand or imported.

integer | null
app_action

What, in that module, caused the contact to be added.

string | null
canonical_contact_id

For an alias, the id of the contact it points to.

integer | null
created_at
required
string format: date-time
updated_at
required
string format: date-time
deleted_at

Always null — contacts in the trash are not returned.

string | null format: date-time
pivot

The link between the person and this organization.

object
contact_id

Id of the person.

integer
related_contact_id

Id of the organization.

integer
relation_type
string
company_name
required

Name of the person’s first listed employer, for display.

string | null
Examples
Examplesuggestions
[
{
"id": 33901,
"type": "person",
"name": "Ana Souza",
"avatar_url": null,
"job_title": "Account Manager",
"birthdate": null,
"website": null,
"notes": null,
"cuid": "7f3c2a10-5b8e-4d21-9c6a-0e4f1b2d3c4a",
"created_by_id": 5,
"created_by_uuid": "2d9e8f70-1a3b-4c5d-8e9f-a0b1c2d3e4f5",
"created_at": "2026-10-15T20:31:01.000000Z",
"updated_at": "2026-10-15T20:31:01.000000Z",
"deleted_at": null,
"custom_fields": null,
"address": null,
"identification_number": null,
"zimbra_id": null,
"app_id": null,
"canonical_contact_id": null,
"scope": "user",
"app_action": null,
"score": 80,
"emails": [
"ana.souza@example.com"
],
"phones": [
"+5511987654321"
],
"companies": [
{
"id": 33910,
"type": "organization",
"name": "Acme Ltda",
"avatar_url": null,
"job_title": null,
"birthdate": null,
"website": "https://acme.example.com",
"notes": null,
"cuid": "7f3c2a10-5b8e-4d21-9c6a-0e4f1b2d3c4a",
"created_by_id": 5,
"created_by_uuid": "2d9e8f70-1a3b-4c5d-8e9f-a0b1c2d3e4f5",
"created_at": "2026-10-15T20:31:01.000000Z",
"updated_at": "2026-10-15T20:31:01.000000Z",
"deleted_at": null,
"custom_fields": null,
"address": "Av. Paulista, 1000 — São Paulo, SP",
"identification_number": null,
"zimbra_id": null,
"app_id": null,
"canonical_contact_id": null,
"scope": "user",
"app_action": null,
"pivot": {
"contact_id": 33901,
"related_contact_id": 33910,
"relation_type": "employee"
}
}
],
"company_name": "Acme Ltda"
},
{
"id": "8231",
"name": "Sales team",
"company_name": null,
"job_title": null,
"emails": [
"ana.souza@example.com",
"bruno.lima@example.com"
],
"phones": [],
"notes": null,
"type": "groupContact"
}
]

No authentication key was sent.

Media typeapplication/json

Authentication failures use an error key rather than message.

object
error
required
string
Examples
Examplemissing

No bearer token sent

{
"error": "JWT passport exception: Missing bearer token in request"
}

The authentication key is expired or not recognised. Get a fresh one and retry.

Media typeapplication/json

Authentication failures use an error key rather than message.

object
error
required
string
Examples
Exampleexpired
{
"error": "JWT passport expired: Passport expired"
}

The query string failed validation.

Media typeapplication/json
object
message
required

The first validation message.

string
errors
required

Validation messages keyed by field name.

object
key
additional properties
Array<string>
Examples

Search term missing

{
"message": "The search query field is required.",
"errors": {
"query": [
"The search query field is required."
]
}
}