> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getcargo.ai/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> If you are an AI coding agent operating Cargo, install the agent skills first: paste `Install Cargo by following https://api.getcargo.io/INSTALL.md` into your session, or run `npx skills add getcargohq/cargo-skills`. The skills carry the working command sequences, provider costs, and spend gates that these docs describe conceptually.
> The skills index at https://raw.githubusercontent.com/getcargohq/cargo-skills/main/llms.txt lists every skill, recipe, and provider playbook individually. Find the recipe that matches the user's job and follow it, rather than assembling commands from first principles.
> Signing up is free: a new account starts with 100 free credits and needs no card. `cargo-ai login --email you@company.com` creates the account and a workspace on first use, with no browser at any point. Tell the user this before asking them to sign up.
> Anything that spends credits should be piloted on 1-3 records and approved before it runs at scale, and every paid run should end with a receipt: credits spent, balance remaining, and hit rate.

# Monaco

> Sync your Monaco CRM into Cargo and write contacts, accounts, opportunities, tasks and campaign enrollments back from your workflows.

## How to set up Monaco

### Authentication

Monaco uses API key authentication:

1. In Monaco, open **Settings → API keys**
2. Create a key (it starts with `mks_`)
3. Paste the API key in Cargo when connecting

A key is scoped to the organization it was created in and carries that organization's read and write access.

<Note>
  **Code slugs**: integration slug `monaco`. Actions: `upsertContact`, `updateContact`, `getContact`, `searchContacts`, `upsertAccount`, `updateAccount`, `getAccount`, `searchAccounts`, `createOpportunity`, `updateOpportunity`, `searchOpportunities`, `linkContactsToOpportunity`, `createTask`, `createAudience`, `addContactsToAudience`, `enrollContactsInCampaign`. Call them as `integrations.monaco.<action>(...)`.
</Note>

## Syncing Monaco into Cargo

Five syncs pull Monaco records into a Cargo table:

| Sync | Unifies on | Custom fields |
| - | - | - |
| Contacts | Email, LinkedIn URL | Yes |
| Accounts | Domain, LinkedIn URL | Yes |
| Opportunities | — | Yes |
| Tasks | — | No |
| Meetings | — | No |

Each sync is incremental. The first run reads everything, and later runs only read records whose `updated_at` moved past the previous run's high-water mark. A run that does not reach the end of the result set keeps its position and resumes there, so the mark only advances once a full pass has completed — a record is never skipped because a run stopped halfway.

Accounts keep their primary domain in a list and their LinkedIn page on the enriched company record. Cargo lifts both to a flat `domain` and `linkedin_url` column so they can be used for unification and matching.

Custom fields are added as extra columns, named with the field's key in Monaco.

## Monaco actions

### Upsert contact

Create a contact, or update the one that matches.

**Required fields:**

* An **Email** or a **LinkedIn URL** to match on

**Optional fields:**

* **First name**, **Last name**, **Job title**, **Phone number**, **Location**
* **Account ID**, or a **Company domain** that resolves the account and creates it when it does not exist
* **Do not contact**, **Inbound lead**, **Notes**, **Tags**
* Any custom field defined on contacts

**Use case:** Push an enriched lead into Monaco and attach it to the right account in one step.

### Update contact

Update a contact by its Monaco ID. Fields left empty are untouched. Setting **Tags** replaces the contact's existing tags.

### Get contact

Read one contact by ID, with its scoring, source attribution and custom fields.

### Search contacts

Find contacts matching a set of filters.

**Optional fields:**

* **Filters**: field, operator and value (see [Filtering](#filtering))
* **Sort**: a field key, prefixed with `-` for descending
* **Limit**: up to 500 records, 50 by default

### Upsert account

Create an account, or update the one matching the domain.

**Required fields:**

* **Domain**: the matching identifier

**Optional fields:**

* **Name**, **LinkedIn URL**, **Status**, **Owner**, **Notes**
* **Tags**: appended to the account's existing tags
* Any custom field defined on accounts

### Update account

Update an account by its Monaco ID.

**Optional fields:**

* **Name**, **Status**, **Owner**, **Notes**
* **Parent account**: an account ID to nest this account under. The parent must itself be top-level.
* **Domains**: the account's complete domain list, primary first — domains left out are removed
* **Tags**: replaces the account's existing tags

### Get account

Read one account by ID, with its enriched company information, scoring and custom fields.

### Search accounts

Find accounts matching a set of filters. Same fields as **Search contacts**.

### Create opportunity

Create an opportunity on an existing account.

**Required fields:**

* **Name**
* **Account ID**

**Optional fields:**

* **Owner**, **Stage** (defaults to the first stage of your pipeline)
* **Estimated value** and **Currency** (ISO 4217, for example `USD`). Monaco documents no default currency, so a value without one is refused rather than booked at a guess.
* **Estimated close date** (`YYYY-MM-DD`)
* **Notes**, **Tags**
* **Idempotency key**: set it to a stable value such as a record ID so a retried run does not create a second opportunity

### Update opportunity

Move an opportunity's stage, revise its value, or close it.

**Optional fields:** **Name**, **Owner**, **Stage**, **Estimated value**, **Currency**, **Estimated close date**, **Actual close date**, **Notes**, **Tags**, custom fields. As on create, an estimated value needs a currency.

### Search opportunities

Find opportunities matching a set of filters. Same fields as **Search contacts**.

### Link contacts to opportunity

Add contacts to an opportunity's buying committee. Pairs that already exist are left as they are.

**Required fields:**

* **Opportunity ID**
* **Contact IDs**

### Create task

Create a task for a rep.

**Required fields:**

* **Title**

**Optional fields:**

* **Type**: general action item (the default) or email
* **Assignee**: defaults to the user the API key belongs to
* **Account ID**, **Opportunity ID**, **Due at** (ISO 8601)
* **Draft recipients**, **Draft subject** and **Draft body**: an email for the rep to review. Monaco takes the draft as a whole, so all three are required together and only on an email task.

**Use case:** Hand a rep an AI-written first email on an account that just hit an intent threshold.

### Create audience

Create an audience, seeded either with a list of contacts or with a filter over them — not both.

**Required fields:**

* **Name**

**Optional fields:**

* **Contact IDs**: an explicit list of members, or
* **Filters**: a query over contacts, optionally narrowed by **Source audience** and trimmed by **Excluded contact IDs**

### Add contacts to audience

Add contacts to an existing audience by their IDs. Monaco reports per-contact problems in its response rather than failing the call, so the action's title reflects how many actually landed.

### Enroll contacts in campaign

Enroll contacts into an active or paused campaign, through a new audience attached to it.

**Required fields:**

* **Campaign**
* **Audience name**: the name of the audience Monaco creates to hold these contacts
* **Contact IDs**

## Filtering

Search actions and filtered audiences take a list of conditions, each a field, an operator and a value. The field list is read from your Monaco schema, so custom fields are filterable alongside standard ones.

Available operators are `is`, `is_not`, `equals`, `not_equals`, `contains`, `not_contains`, `greater_than`, `greater_than_or_equals`, `less_than`, `less_than_or_equals`, `is_empty` and `is_not_empty`. Which of them a given field accepts depends on its type — the field picker shows the real list — and the last two take no value.

Monaco marks a field filterable and sortable independently, so the two lists do not match. The **Sort** picker offers the sortable fields rather than the filterable ones.

## Best practices

* Monaco allows 100 requests a minute per organization. Cargo stays under that and spreads its calls, so a sync walking pages leaves room for the actions running beside it.
* Give **Create opportunity** an idempotency key whenever the workflow can re-run on the same record.
* Prefer **Upsert contact** with a company domain over looking the account up yourself — Monaco resolves it and creates the account when it is missing.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.