Skip to main content
The CRM API gives your scripts and AI assistants the records of Admin > Customers: companies, contacts, deals, notes and custom fields, plus import and merge. See Customers for the section itself.

Before you start

  • Customers must be enabled for your workspace. It is off by default; contact AGO to enable it. Until then, every call returns 403 with code crm_disabled and the MCP CRM tools are hidden.
  • Calls run as an active staff user. For an API key, that is the user who created the key; for OAuth, the user who granted access. Otherwise calls return 403 with code staff_principal_required. Changes appear in each record’s history under that user’s name.
  • Scopes: crm:read to read; crm:write to create, update, import, merge and erase. crm:write includes crm:read.
Create the key in Developer > API Keys. See API Key Authentication.

Endpoints

All paths start with /api/v1/crm. The lists of companies, contacts, deals and alerts and the company history accept page and page_size (at most 100) and return {"object": "list", "data": [...], "has_more": ..., "total": ...}. Other lists return {"data": [...]} without paging, and timelines page with before and limit.

Customer success

Companies also accept csm_id, arr, currency, plan, contract_start_date and renewal_date, return a health object (score, status, previous score and the reason of each component), and can be filtered by csm_id, health_status (healthy, watch, at_risk or none) and renewal_before, and sorted by health, renewal_date or -arr. Deals return kind (new_business or renewal) and can be filtered by it. Updates write only the fields you send. custom_fields is merged into the record: send null for a key to clear it. Sending null for owner_id or organization_id clears it.

Import rows

Send the rows keyed by column name, and a mapping from each column to a target. Get the targets, including your custom fields as custom:<key>, from POST /import/suggest-mapping.
The response gives a summary (created, updated, skipped, errors) and one result per row, with the reason when a row is rejected. With dry_run, nothing is saved.

Signals

Push what AGO cannot see, such as product usage or NPS answers. Name each company by company_id or by one of its email domains. Rows with an error are returned with their index and skipped; the others are saved.
A signal counts in the health score once its key is added to signal_components in /settings/health. The nps key, from 0 to 10, also drives the detractor alert. See Customers.

Errors

Errors follow the Public API format. The code says what to fix, and param names the field when one is at fault:

MCP tools

Connected AI assistants get these tools: list_crm_companies, get_crm_company, create_crm_company, update_crm_company, list_crm_contacts, get_crm_contact, create_crm_contact, update_crm_contact, get_crm_timeline, list_crm_pipelines, list_crm_deals, get_crm_deal, create_crm_deal, update_crm_deal, list_crm_fields, create_crm_field, add_crm_note, suggest_crm_import_mapping, import_crm_records, find_crm_duplicates, merge_crm_companies, merge_crm_contacts, get_crm_company_health, list_crm_portfolio, push_crm_signals, get_crm_company_brief, generate_crm_company_brief, list_crm_facts, update_crm_fact, list_crm_alerts, update_crm_alert and prepare_crm_account_review. Deleting records, erasing or exporting a contact, moving a deal on the board, recomputing health, health history, listing a company’s signals, signal keys, adding a fact, company history and the health and alert settings are available through the API only. To link a follow-up task to a company, contact or deal, use the Tasks API with target_type organization, contact or deal.