Resource
Companies
Accounts on the CRM. Idempotent upsert by domain — calling POST twice with the same domain merges instead of duplicating.
Auto-resolution from contacts
When you POST a contact with
company_name but no company_id, we resolve / create the company by inferring its domain from the contact's email. You rarely need to call this endpoint directly — it's here for cases where the company arrives independently of a contact.List companies#
Paginated list with name + domain search
GET
/v1/crm/companiesQuery parameters
limitintegerdefault: 501–200
page_tokenstringCursor from prior page.
qstringSubstring match across
name and domain.Create / upsert#
Idempotent upsert by domain
POST
/v1/crm/companiesname is required. If you supply domain, we treat it as the identity — existing rows merge in the new fields and return created: false.Body parameters
namestringRequired.
domainstringIdentity for upsert. Strip the protocol and path.
websitestringFull URL with protocol.
industrystringFree-form. Used by AI Gist for context.
descriptionstringInternal notes; surfaced to the agent during calls.
sourcestringDefault
public_api.Request
curl -X POST https://agency.gary.club/api/public/v1/crm/companies \
-H "Authorization: Bearer gc_live_EXAMPLE_AbCdEfGhIj0123456789" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Plumbing",
"domain": "acmeplumbing.example.com",
"website": "https://acmeplumbing.example.com",
"industry": "Plumbing",
"description": "60-vehicle home services co — primary contact is the owner."
}'Response
{
"company": {
"id": "comp_EXAMPLE_aaaa",
"client_id": "00000000-0000-0000-0000-000000000000",
"name": "Acme Plumbing",
"domain": "acmeplumbing.example.com",
"website": "https://acmeplumbing.example.com",
"industry": "Plumbing",
"description": "60-vehicle home services co …",
"created_at": "2026-04-28T01:18:53.000Z",
"updated_at": "2026-04-28T01:18:53.000Z"
},
"created": true
}Read one#
Single company
GET
/v1/crm/companies/{id}Path parameters
iduuidrequiredCompany id.
Update#
Update mutable fields
PATCH
/v1/crm/companies/{id}Path parameters
iduuidrequiredBody parameters
namestringdomainstring | nullSet null to unlink.
websitestring | nullindustrystring | nullbusiness_descriptionstring | nullarchivedbooleanSoft-delete shortcut. Sets
archived_at.Archive#
Soft-archive
DELETE
/v1/crm/companies/{id}Sets archived_at to now. Existing contact links are preserved; un-archive via PATCH archived=false.
Path parameters
iduuidrequiredRelated#
- Contacts — link contacts to a company by id.
- AI Gist —
POST /v1/ai/companies/{id}/gistfor an AI summary. - Deals — deals roll up to a company.
Webhooks for companies#
company.created— new domain in the tenant.company.updated— any subsequent change to mutable fields.

