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.

FieldTypeFSAGDescription
idIDYโ€”โ€”โ€”Contact ID
first_namestringYYโ€”โ€”First name
last_namestringYYโ€”โ€”Last name
companystringYYโ€”โ€”Company name (display text)
company_idIDYโ€”โ€”YLinked company record ID
job_titlestringYYโ€”โ€”Job title
statusstring (output only)โ€”โ€”โ€”โ€”Status display name. Filter and sort by status_id instead.
status_idstringYYโ€”YStatus system_id (e.g. lead, prospect, customer)
owner_idIDYโ€”โ€”YOwner user ID
lead_sourcestring (output only)โ€”โ€”โ€”โ€”Lead source display name
lead_source_idstringYYโ€”YLead source system_id
tagsstring[]Yโ€”โ€”YTag names
starredboolean (virtual)Yโ€”โ€”โ€”Starred by the current user
backgroundstringโ€”โ€”โ€”โ€”Background text (select only)
addressstringYโ€”โ€”โ€”Primary street address
citystringYYโ€”YPrimary address city
statestringYYโ€”YPrimary address state or region
zip_codestringYโ€”โ€”โ€”Primary address postal code
country_codestringYYโ€”YISO 3166-1 alpha-2 country code
address_typestringYโ€”โ€”YOne of work, home, billing, delivery, other
created_attimeYYโ€”YRecord creation timestamp
modified_attimeYYโ€”YLast modification timestamp
last_activity_datetimeYYโ€”YMost recent activity (note, call, meeting, deal)
weightnumber (virtual)โ€”Yโ€”โ€”Action Stream sort weight. Default sort field.
emailsarrayYโ€”โ€”โ€”{address, type} objects
phonesarrayYโ€”โ€”โ€”{number, type} objects
urlsarrayYโ€”โ€”โ€”{url, type} objects

Notes

  • Virtual fields (status, lead_source) are display labels resolved from their underlying _id field at query time. You cannot select, filter, or sort by them directly; use the _id field instead.
  • tags uses bare-string equality for single-tag membership ({"tags": "VIP"}) and in for multi-tag overlap ({"tags": {"in": ["VIP", "Hot"]}}). Grouping by tags gives a per-tag breakdown: each tag is its own bucket, so a contact tagged both VIP and Hot is counted under each. count() per tag is exact; summing an unrelated field double-counts multi-tag contacts.
  • starred is per-user. The value reflects whether the calling user has starred the contact, not whether anyone has.
  • emails, phones, urls are 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> in select, where, and order_by; select custom_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>"] }), and min/max work on date custom fields. group_by and distinct on custom fields are not supported: group by a top-level field and filter on the custom field in where instead. Use describe to 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"]
}