OQL ยท Entities
Contacts
OQL field reference for contacts. The people in your CRM and their associated company, communication details, and metadata.
Last updated Jul 16, 2026
Contacts are the people in your CRM and their associated company, communication details, and metadata.
Default sort: weight descending. When you omit order_by,
contacts return in Action Stream priority
order (the same
order the OnePageCRM app uses).
Fields
Legend: F filterable, S sortable, A aggregatable, G groupable.
| Field | Type | F | S | A | G | Description |
|---|---|---|---|---|---|---|
id | ID | Y | โ | โ | โ | Contact ID |
first_name | string | Y | Y | โ | โ | First name |
last_name | string | Y | Y | โ | โ | Last name |
company | string | Y | Y | โ | โ | Company name (display text) |
company_id | ID | Y | โ | โ | Y | Linked company record ID |
job_title | string | Y | Y | โ | โ | Job title |
status | string (output only) | โ | โ | โ | โ | Status display name. Filter and sort by status_id instead. |
status_id | string | Y | Y | โ | Y | Status system_id (e.g. lead, prospect, customer) |
owner_id | ID | Y | โ | โ | Y | Owner user ID |
lead_source | string (output only) | โ | โ | โ | โ | Lead source display name |
lead_source_id | string | Y | Y | โ | Y | Lead source system_id |
tags | string[] | Y | โ | โ | Y | Tag names |
starred | boolean (virtual) | Y | โ | โ | โ | Starred by the current user |
background | string | โ | โ | โ | โ | Background text (select only) |
address | string | Y | โ | โ | โ | Primary street address |
city | string | Y | Y | โ | Y | Primary address city |
state | string | Y | Y | โ | Y | Primary address state or region |
zip_code | string | Y | โ | โ | โ | Primary address postal code |
country_code | string | Y | Y | โ | Y | ISO 3166-1 alpha-2 country code |
address_type | string | Y | โ | โ | Y | One of work, home, billing, delivery, other |
created_at | time | Y | Y | โ | Y | Record creation timestamp |
modified_at | time | Y | Y | โ | Y | Last modification timestamp |
last_activity_date | time | Y | Y | โ | Y | Most recent activity (note, call, meeting, deal) |
weight | number (virtual) | โ | Y | โ | โ | Action Stream sort weight. Default sort field. |
emails | array | Y | โ | โ | โ | {address, type} objects |
phones | array | Y | โ | โ | โ | {number, type} objects |
urls | array | Y | โ | โ | โ | {url, type} objects |
Notes
- Virtual fields (
status,lead_source) are display labels resolved from their underlying_idfield at query time. You cannot select, filter, or sort by them directly; use the_idfield instead. tagsuses bare-string equality for single-tag membership ({"tags": "VIP"}) andinfor multi-tag overlap ({"tags": {"in": ["VIP", "Hot"]}}). Grouping bytagsgives a per-tag breakdown: each tag is its own bucket, so a contact tagged bothVIPandHotis counted under each.count()per tag is exact; summing an unrelated field double-counts multi-tag contacts.starredis per-user. The value reflects whether the calling user has starred the contact, not whether anyone has.emails,phones,urlsare arrays of objects. Filter using dotted subfields:emails.address,emails.type(work,home,other)phones.number,phones.type(work,mobile,home,direct,fax,other)urls.url,urls.type(website,blog,twitter,linkedin,facebook,instagram,xing,other)
- Custom fields are queryable by name as
custom_fields.<name>inselect,where, andorder_by; selectcustom_fields.*(or*) to return all of them. Filterability and sortability depend on the fieldโs type. Numeric custom fields can also be aggregated ({ "sum": ["custom_fields.<name>"] }), andmin/maxwork on date custom fields.group_byanddistincton custom fields are not supported: group by a top-level field and filter on the custom field inwhereinstead. Usedescribeto discover an accountโs custom-field names and types.
Example queries
Open leads owned by me, top of stream:
{
"from": "contacts",
"where": { "owner_id": "ME()", "status_id": "lead" },
"limit": 25
}
Contacts Iโve starred:
{
"from": "contacts",
"where": { "starred": true }
}
Contacts at an Irish phone number, with no activity in the last 30 days:
{
"from": "contacts",
"where": {
"phones.number": { "like": "+353%" },
"last_activity_date": { "<": { "DAYS_AGO": [30] } }
}
}
Contacts by country:
{
"from": "contacts",
"select": ["country_code", "count()"],
"where": { "country_code": { "is not": null } },
"group_by": ["country_code"]
}