> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Insightly

The Insightly connector lets your AI agent act in each user's Insightly account. Each user connects their own Insightly username and password once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 108 tools.

**Authentication:** API Key (Basic Auth)
**Categories:** CRM & Sales
**Tools:** 108: 72 read, 28 write, 8 destructive
**Users sign in with:** API key
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=INSIGHTLY)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Insightly connection

   In **AgentKit > Connections**, create an Insightly connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'insightly_get_contact',
  toolInput: {
    id: 1,
  },
  connector: 'insightly',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="insightly_get_contact",
    tool_input={
        "id": 1,
    },
    connection_name="insightly",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `insightly_get_contact`

Get Contact · Read-only

Retrieve one contact from Insightly by ID.
Returns the full contact record (names, emails, phones, addresses, organisation link, owner and dates).
Use this when you already have the contact ID. 

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the contact to retrieve.

Example input: `{"id":1}`

### `insightly_get_current_user`

Get Current User · Read-only

Retrieve the Insightly user that owns the connected API key.
Returns the user record with USER_ID, name, email and timezone.
Use this to learn whose identity the API calls run as, for example to assign a record to yourself.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `insightly_get_custom_fields`

Get Custom Fields · Read-only

Retrieve the custom field definitions for one Insightly object type.
Returns an array of custom field metadata with FIELD_NAME, label, type, order and allowed options.
Use this to find the FIELD_NAME to send in custom_fields when creating or updating a record.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `object_name` (`string`, required): Insightly object whose custom fields to describe, for example Contacts, Organisations, Leads, Opportunities, Projects or Tasks.

Example input: `{"object_name":"<object_name>"}`

### `insightly_get_email`

Get Email · Read-only

Retrieve one logged email from Insightly by ID.
Returns the email record with sender, recipients, subject, body, links and dates.
Use this when you already have the email ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the email to retrieve.

Example input: `{"id":1}`

### `insightly_get_event`

Get Event · Read-only

Retrieve one event from Insightly by ID.
Returns the full event record (title, location, start and end times, owner).
Use this when you already have the event ID. 

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the event to retrieve.

Example input: `{"id":1}`

### `insightly_get_instance`

Get Instance · Read-only

Retrieve details about the connected Insightly instance.
Returns instance information such as name, plan and whether the latest version is enabled.
Use this to check instance capabilities before using Products, Price Books or Quotes.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `insightly_get_lead`

Get Lead · Read-only

Retrieve one lead from Insightly by ID.
Returns the full lead record (names, email, status, source, rating, owner and dates).
Use this when you already have the lead ID. 

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the lead to retrieve.

Example input: `{"id":1}`

### `insightly_get_note`

Get Note · Read-only

Retrieve one note from Insightly by ID.
Returns the note record with NOTE_ID, TITLE, BODY and dates.
Use this when you already have the note ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the note to retrieve.

Example input: `{"id":1}`

### `insightly_get_opportunity`

Get Opportunity · Read-only

Retrieve one opportunity from Insightly by ID.
Returns the full opportunity record (name, state, bid amount, probability, pipeline stage, owner and dates).
Use this when you already have the opportunity ID. 

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the opportunity to retrieve.

Example input: `{"id":1}`

### `insightly_get_opportunity_state_history`

Get Opportunity State History · Read-only

Retrieve the history of state changes and reasons for one Insightly opportunity.
Returns an array of state records with state, reason and date changed.
Use this to audit when and why an opportunity was won, lost or reopened.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the opportunity whose state history to retrieve.

Example input: `{"id":1}`

### `insightly_get_organisation`

Get Organisation · Read-only

Retrieve one organisation from Insightly by ID.
Returns the full organisation record (name, website, background, owner and dates).
Use this when you already have the organisation ID. 

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the organisation to retrieve.

Example input: `{"id":1}`

### `insightly_get_product`

Get Product · Read-only

Retrieve one product from Insightly by ID.
Returns the full product record.
Use this when you already have the PRODUCT_ID. Only available on instances using the latest Insightly version.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the product to retrieve.

Example input: `{"id":1}`

### `insightly_get_project`

Get Project · Read-only

Retrieve one project from Insightly by ID.
Returns the full project record (name, status, details, dates, owner and pipeline stage).
Use this when you already have the project ID. 

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the project to retrieve.

Example input: `{"id":1}`

### `insightly_get_quote`

Get Quote · Read-only

Retrieve one quote from Insightly by ID.
Returns the full quote record.
Use this when you already have the QUOTE_ID. Only available on instances using the latest Insightly version.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the quote to retrieve.

Example input: `{"id":1}`

### `insightly_get_task`

Get Task · Read-only

Retrieve one task from Insightly by ID.
Returns the full task record (title, status, priority, due date, owner and links).
Use this when you already have the task ID. 

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the task to retrieve.

Example input: `{"id":1}`

### `insightly_get_user`

Get User · Read-only

Retrieve one Insightly user by ID.
Returns the user record with name, email, timezone, role and active flag.
Use this when you already have a USER_ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the user to retrieve.

Example input: `{"id":1}`

### `insightly_list_contact_emails`

List Contact Emails · Read-only

List the emails linked to one contact in Insightly.
Returns an array of email records with sender, recipients, subject, body and dates.
Use this to read the email history of a contact; use insightly_search_emails to search across all records.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the contact whose emails to list.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{"id":1}`

### `insightly_list_contact_notes`

List Contact Notes · Read-only

List the notes attached to one contact in Insightly.
Returns an array of note records with NOTE_ID, TITLE, BODY and dates.
Use this to read the notes on a contact; use insightly_search_notes to find notes across all records.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the contact whose notes to list.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{"id":1}`

### `insightly_list_contact_tasks`

List Contact Tasks · Read-only

List the tasks linked to one contact in Insightly.
Returns an array of task records with title, status, due date and owner.
Use this to see open work on a contact; use insightly_search_tasks to search all tasks.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the contact whose tasks to list.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{"id":1}`

### `insightly_list_contacts`

List Contacts · Read-only

List contacts in Insightly, one page at a time.
Returns an array of contact records (names, emails, phones, addresses, organisation link, owner and dates); use skip and top to page.
Use this to browse everything. Use insightly_search_contacts to filter by a field value.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{}`

### `insightly_list_countries`

List Countries · Read-only

List the countries supported by Insightly.
Returns an array of country names.
Use this to pick a valid country value for address fields.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `insightly_list_currencies`

List Currencies · Read-only

List the currencies supported by Insightly.
Returns an array of currencies with code and symbol.
Use this to pick a valid BID_CURRENCY for an opportunity.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `insightly_list_emails`

List Emails · Read-only

List emails stored in Insightly, one page at a time.
Returns an array of email records with sender, recipients, subject, body and dates.
Use this to browse logged emails; use insightly_search_emails to filter them.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{}`

### `insightly_list_events`

List Events · Read-only

List events in Insightly, one page at a time.
Returns an array of event records (title, location, start and end times, owner); use skip and top to page.
Use this to browse everything. Use insightly_search_events to filter by a field value.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{}`

### `insightly_list_lead_emails`

List Lead Emails · Read-only

List the emails linked to one lead in Insightly.
Returns an array of email records with sender, recipients, subject, body and dates.
Use this to read the email history of a lead; use insightly_search_emails to search across all records.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the lead whose emails to list.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{"id":1}`

### `insightly_list_lead_notes`

List Lead Notes · Read-only

List the notes attached to one lead in Insightly.
Returns an array of note records with NOTE_ID, TITLE, BODY and dates.
Use this to read the notes on a lead; use insightly_search_notes to find notes across all records.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the lead whose notes to list.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{"id":1}`

### `insightly_list_lead_sources`

List Lead Sources · Read-only

List the lead sources defined in Insightly.
Returns an array of lead sources with LEAD_SOURCE_ID and name.
Use this to find the LEAD_SOURCE_ID required when creating a lead.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `insightly_list_lead_statuses`

List Lead Statuses · Read-only

List the lead statuses defined in Insightly.
Returns an array of lead statuses with LEAD_STATUS_ID and name.
Use this to find the LEAD_STATUS_ID required when creating a lead.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `insightly_list_lead_tasks`

List Lead Tasks · Read-only

List the tasks linked to one lead in Insightly.
Returns an array of task records with title, status, due date and owner.
Use this to see open work on a lead; use insightly_search_tasks to search all tasks.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the lead whose tasks to list.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{"id":1}`

### `insightly_list_leads`

List Leads · Read-only

List leads in Insightly, one page at a time.
Returns an array of lead records (names, email, status, source, rating, owner and dates); use skip and top to page.
Use this to browse everything. Use insightly_search_leads to filter by a field value.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{}`

### `insightly_list_milestones`

List Milestones · Read-only

List project milestones in Insightly.
Returns an array of milestones with MILESTONE_ID, title, due date and project.
Use this to find the MILESTONE_ID to attach a task to.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{}`

### `insightly_list_notes`

List Notes · Read-only

List notes in Insightly, one page at a time.
Returns an array of note records with NOTE_ID, TITLE, BODY and dates.
Use this to browse all notes; use insightly_search_notes to filter them.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{}`

### `insightly_list_opportunities`

List Opportunities · Read-only

List opportunities in Insightly, one page at a time.
Returns an array of opportunity records (name, state, bid amount, probability, pipeline stage, owner and dates); use skip and top to page.
Use this to browse everything. Use insightly_search_opportunities to filter by a field value.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{}`

### `insightly_list_opportunity_categories`

List Opportunity Categories · Read-only

List the opportunity categories defined in Insightly.
Returns an array of categories with CATEGORY_ID and name.
Use this to find the CATEGORY_ID for creating or updating an opportunity.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `insightly_list_opportunity_emails`

List Opportunity Emails · Read-only

List the emails linked to one opportunity in Insightly.
Returns an array of email records with sender, recipients, subject, body and dates.
Use this to read the email history of a opportunity; use insightly_search_emails to search across all records.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the opportunity whose emails to list.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{"id":1}`

### `insightly_list_opportunity_notes`

List Opportunity Notes · Read-only

List the notes attached to one opportunity in Insightly.
Returns an array of note records with NOTE_ID, TITLE, BODY and dates.
Use this to read the notes on a opportunity; use insightly_search_notes to find notes across all records.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the opportunity whose notes to list.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{"id":1}`

### `insightly_list_opportunity_products`

List Opportunity Products · Read-only

List the products (line items) attached to one Insightly opportunity.
Returns an array of line items with product, quantity, price and total.
Use this to see what an opportunity includes. Only available on instances using the latest Insightly version.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the opportunity whose products to list.

Example input: `{"id":1}`

### `insightly_list_opportunity_state_reasons`

List Opportunity State Reasons · Read-only

List the reasons available for changing an opportunity's state in Insightly.
Returns an array of reasons with STATE_REASON_ID, reason text and the state they apply to.
Use this to find the STATE_REASON_ID for insightly_update_opportunity_state.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `insightly_list_opportunity_tasks`

List Opportunity Tasks · Read-only

List the tasks linked to one opportunity in Insightly.
Returns an array of task records with title, status, due date and owner.
Use this to see open work on a opportunity; use insightly_search_tasks to search all tasks.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the opportunity whose tasks to list.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{"id":1}`

### `insightly_list_organisation_emails`

List Organisation Emails · Read-only

List the emails linked to one organisation in Insightly.
Returns an array of email records with sender, recipients, subject, body and dates.
Use this to read the email history of a organisation; use insightly_search_emails to search across all records.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the organisation whose emails to list.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{"id":1}`

### `insightly_list_organisation_notes`

List Organisation Notes · Read-only

List the notes attached to one organisation in Insightly.
Returns an array of note records with NOTE_ID, TITLE, BODY and dates.
Use this to read the notes on a organisation; use insightly_search_notes to find notes across all records.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the organisation whose notes to list.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{"id":1}`

### `insightly_list_organisation_tasks`

List Organisation Tasks · Read-only

List the tasks linked to one organisation in Insightly.
Returns an array of task records with title, status, due date and owner.
Use this to see open work on a organisation; use insightly_search_tasks to search all tasks.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the organisation whose tasks to list.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{"id":1}`

### `insightly_list_organisations`

List Organisations · Read-only

List organisations in Insightly, one page at a time.
Returns an array of organisation records (name, website, background, owner and dates); use skip and top to page.
Use this to browse everything. Use insightly_search_organisations to filter by a field value.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{}`

### `insightly_list_pipeline_stages`

List Pipeline Stages · Read-only

List the pipeline stages configured in Insightly.
Returns an array of stages with STAGE_ID, PIPELINE_ID, STAGE_NAME and order.
Use this to find stage IDs before moving an opportunity or project with the update_*_stage tools.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `insightly_list_pipelines`

List Pipelines · Read-only

List the sales and project pipelines configured in Insightly.
Returns an array of pipelines with PIPELINE_ID, name and the object type they apply to.
Use this to find pipeline IDs; use insightly_list_pipeline_stages for the stages inside them.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{}`

### `insightly_list_products`

List Products · Read-only

List products in Insightly, one page at a time.
Returns an array of product records with PRODUCT_ID, name and pricing.
Use this to browse products. Only available on instances using the latest Insightly version.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{}`

### `insightly_list_project_categories`

List Project Categories · Read-only

List the project categories defined in Insightly.
Returns an array of categories with CATEGORY_ID and name.
Use this to find the CATEGORY_ID for creating or updating a project.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `insightly_list_project_notes`

List Project Notes · Read-only

List the notes attached to one project in Insightly.
Returns an array of note records with NOTE_ID, TITLE, BODY and dates.
Use this to read the notes on a project; use insightly_search_notes to find notes across all records.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the project whose notes to list.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{"id":1}`

### `insightly_list_project_tasks`

List Project Tasks · Read-only

List the tasks linked to one project in Insightly.
Returns an array of task records with title, status, due date and owner.
Use this to see open work on a project; use insightly_search_tasks to search all tasks.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the project whose tasks to list.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{"id":1}`

### `insightly_list_projects`

List Projects · Read-only

List projects in Insightly, one page at a time.
Returns an array of project records (name, status, details, dates, owner and pipeline stage); use skip and top to page.
Use this to browse everything. Use insightly_search_projects to filter by a field value.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{}`

### `insightly_list_quotes`

List Quotes · Read-only

List quotes in Insightly, one page at a time.
Returns an array of quote records with QUOTE_ID, name and pricing.
Use this to browse quotes. Only available on instances using the latest Insightly version.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{}`

### `insightly_list_relationships`

List Relationships · Read-only

List the relationship types defined between records in Insightly.
Returns an array of relationships with RELATIONSHIP_ID and forward and reverse labels.
Use this to understand how contacts and organisations can be linked.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{}`

### `insightly_list_tags`

List Tags · Read-only

List the tags used on one type of Insightly record.
Returns an array of tag names.
Use this to see which tags exist before tagging a record with an add_*_tag tool.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `record_type` (`string`, required): Type of record whose tags to list. Use one of contacts, leads, opportunities, organisations, projects or tasks.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{"record_type":"<record_type>"}`

### `insightly_list_task_categories`

List Task Categories · Read-only

List the task categories defined in Insightly.
Returns an array of categories with CATEGORY_ID and name.
Use this to find the CATEGORY_ID for creating or updating a task.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `insightly_list_tasks`

List Tasks · Read-only

List tasks in Insightly, one page at a time.
Returns an array of task records (title, status, priority, due date, owner and links); use skip and top to page.
Use this to browse everything. Use insightly_search_tasks to filter by a field value.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{}`

### `insightly_list_teams`

List Teams · Read-only

List the teams defined in Insightly.
Returns an array of teams with TEAM_ID, name and members.
Use this to find team IDs, for example for a task's assigned team.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{}`

### `insightly_list_users`

List Users · Read-only

List the users on the Insightly instance.
Returns an array of users with USER_ID, name, email, role and active flag.
Use this to find user IDs for owner and responsible-user fields; use insightly_search_users to filter by field.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{}`

### `insightly_search_contacts`

Search Contacts · Read-only

Search contacts in Insightly by one field value and/or last-updated date.
Returns an array of matching contact records; filtering needs both field_name and field_value, and updated_after_utc can be used alone.
Use this to find contacts by a known value. Use insightly_list_contacts to browse without a filter.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `field_name` (`string`, optional): Name of the field to filter on, such as EMAIL_ADDRESS or LAST_NAME for contacts, or a custom field name such as Region__c. Must be sent together with field_value.
- `field_value` (`string`, optional): Value the field must match. Must be sent together with field_name.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{}`

### `insightly_search_contacts_by_tag`

Search Contacts By Tag · Read-only

Search contacts in Insightly by tag name.
Returns an array of contact records that carry the tag.
Use this when you know a tag name; use search_contacts to filter by a field value.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `tag_name` (`string`, required): Name of the tag to filter on.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{"tag_name":"<tag_name>"}`

### `insightly_search_emails`

Search Emails · Read-only

Search emails stored in Insightly by field value and/or last-updated date.
Returns an array of email records with sender, recipients, subject, body and dates.
Use this to find logged emails; use insightly_get_email for one email by ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `field_name` (`string`, optional): Name of the field to filter on, such as EMAIL_ADDRESS or LAST_NAME for contacts, or a custom field name such as Region__c. Must be sent together with field_value.
- `field_value` (`string`, optional): Value the field must match. Must be sent together with field_name.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{}`

### `insightly_search_events`

Search Events · Read-only

Search events in Insightly by one field value and/or last-updated date.
Returns an array of matching event records; filtering needs both field_name and field_value, and updated_after_utc can be used alone.
Use this to find events by a known value. Use insightly_list_events to browse without a filter.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `field_name` (`string`, optional): Name of the field to filter on, such as EMAIL_ADDRESS or LAST_NAME for contacts, or a custom field name such as Region__c. Must be sent together with field_value.
- `field_value` (`string`, optional): Value the field must match. Must be sent together with field_name.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{}`

### `insightly_search_leads`

Search Leads · Read-only

Search leads in Insightly by one field value and/or last-updated date.
Returns an array of matching lead records; filtering needs both field_name and field_value, and updated_after_utc can be used alone.
Use this to find leads by a known value. Use insightly_list_leads to browse without a filter.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `field_name` (`string`, optional): Name of the field to filter on, such as EMAIL_ADDRESS or LAST_NAME for contacts, or a custom field name such as Region__c. Must be sent together with field_value.
- `field_value` (`string`, optional): Value the field must match. Must be sent together with field_name.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{}`

### `insightly_search_leads_by_tag`

Search Leads By Tag · Read-only

Search leads in Insightly by tag name.
Returns an array of lead records that carry the tag.
Use this when you know a tag name; use search_leads to filter by a field value.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `tag_name` (`string`, required): Name of the tag to filter on.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{"tag_name":"<tag_name>"}`

### `insightly_search_notes`

Search Notes · Read-only

Search notes across all Insightly records by field value and/or last-updated date.
Returns an array of note records with NOTE_ID, TITLE, BODY and dates.
Use this to find notes without knowing the parent record; use the list_*_notes tools to read the notes of one record.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `field_name` (`string`, optional): Name of the field to filter on, such as EMAIL_ADDRESS or LAST_NAME for contacts, or a custom field name such as Region__c. Must be sent together with field_value.
- `field_value` (`string`, optional): Value the field must match. Must be sent together with field_name.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{}`

### `insightly_search_opportunities`

Search Opportunities · Read-only

Search opportunities in Insightly by one field value and/or last-updated date.
Returns an array of matching opportunity records; filtering needs both field_name and field_value, and updated_after_utc can be used alone.
Use this to find opportunities by a known value. Use insightly_list_opportunities to browse without a filter.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `field_name` (`string`, optional): Name of the field to filter on, such as EMAIL_ADDRESS or LAST_NAME for contacts, or a custom field name such as Region__c. Must be sent together with field_value.
- `field_value` (`string`, optional): Value the field must match. Must be sent together with field_name.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{}`

### `insightly_search_opportunities_by_tag`

Search Opportunities By Tag · Read-only

Search opportunities in Insightly by tag name.
Returns an array of opportunity records that carry the tag.
Use this when you know a tag name; use search_opportunities to filter by a field value.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `tag_name` (`string`, required): Name of the tag to filter on.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{"tag_name":"<tag_name>"}`

### `insightly_search_organisations`

Search Organisations · Read-only

Search organisations in Insightly by one field value and/or last-updated date.
Returns an array of matching organisation records; filtering needs both field_name and field_value, and updated_after_utc can be used alone.
Use this to find organisations by a known value. Use insightly_list_organisations to browse without a filter.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `field_name` (`string`, optional): Name of the field to filter on, such as EMAIL_ADDRESS or LAST_NAME for contacts, or a custom field name such as Region__c. Must be sent together with field_value.
- `field_value` (`string`, optional): Value the field must match. Must be sent together with field_name.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{}`

### `insightly_search_organisations_by_tag`

Search Organisations By Tag · Read-only

Search organisations in Insightly by tag name.
Returns an array of organisation records that carry the tag.
Use this when you know a tag name; use search_organisations to filter by a field value.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `tag_name` (`string`, required): Name of the tag to filter on.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{"tag_name":"<tag_name>"}`

### `insightly_search_projects`

Search Projects · Read-only

Search projects in Insightly by one field value and/or last-updated date.
Returns an array of matching project records; filtering needs both field_name and field_value, and updated_after_utc can be used alone.
Use this to find projects by a known value. Use insightly_list_projects to browse without a filter.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `field_name` (`string`, optional): Name of the field to filter on, such as EMAIL_ADDRESS or LAST_NAME for contacts, or a custom field name such as Region__c. Must be sent together with field_value.
- `field_value` (`string`, optional): Value the field must match. Must be sent together with field_name.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{}`

### `insightly_search_projects_by_tag`

Search Projects By Tag · Read-only

Search projects in Insightly by tag name.
Returns an array of project records that carry the tag.
Use this when you know a tag name; use search_projects to filter by a field value.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `tag_name` (`string`, required): Name of the tag to filter on.
- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.

Example input: `{"tag_name":"<tag_name>"}`

### `insightly_search_tasks`

Search Tasks · Read-only

Search tasks in Insightly by one field value and/or last-updated date.
Returns an array of matching task records; filtering needs both field_name and field_value, and updated_after_utc can be used alone.
Use this to find tasks by a known value. Use insightly_list_tasks to browse without a filter.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `brief` (`boolean`, optional): When true, returns only top-level fields and leaves out nested data such as links, tags and custom fields, which makes large lists faster. Omit for the full record.
- `field_name` (`string`, optional): Name of the field to filter on, such as EMAIL_ADDRESS or LAST_NAME for contacts, or a custom field name such as Region__c. Must be sent together with field_value.
- `field_value` (`string`, optional): Value the field must match. Must be sent together with field_name.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{}`

### `insightly_search_users`

Search Users · Read-only

Search Insightly users by field value and/or last-updated date.
Returns an array of matching users with USER_ID, name, email and active flag.
Use this to look up a user by email or name; use insightly_list_users to list everyone.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `field_name` (`string`, optional): Name of the field to filter on, such as EMAIL_ADDRESS or LAST_NAME for contacts, or a custom field name such as Region__c. Must be sent together with field_value.
- `field_value` (`string`, optional): Value the field must match. Must be sent together with field_name.
- `skip` (`integer`, optional): Number of records to skip, for paging. Combine with top: skip=100 and top=100 returns the second page of 100.
- `top` (`integer`, optional): Maximum number of records to return in one response. Use with skip to page through results.
- `updated_after_utc` (`string`, optional): Return only records updated on or after this UTC date-time, in the form YYYY-MM-DDTHH:MM:SSZ.

Example input: `{}`

### `insightly_add_contact_note`

Add Contact Note · Write

Add a note to one contact in Insightly.
Returns the created note record including its NOTE_ID.
Use this to log a call, meeting or comment against a contact; use insightly_update_note to edit a note later.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Numeric ID of the contact to attach the note to.
- `title` (`string`, required): Short title of the note (max 255 characters).
- `body` (`string`, optional): Text body of the note.

Example input: `{"id":1,"title":"<title>"}`

### `insightly_add_contact_tag`

Add Contact Tag · Write

Add a tag to one contact in Insightly.
Returns the tag that was added.
Use this to label a contact; use insightly_list_tags to see existing tag names.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Numeric ID of the contact to tag.
- `tag_name` (`string`, required): Name of the tag to add. The tag is created if it does not exist yet.

Example input: `{"id":1,"tag_name":"<tag_name>"}`

### `insightly_add_lead_note`

Add Lead Note · Write

Add a note to one lead in Insightly.
Returns the created note record including its NOTE_ID.
Use this to log a call, meeting or comment against a lead; use insightly_update_note to edit a note later.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Numeric ID of the lead to attach the note to.
- `title` (`string`, required): Short title of the note (max 255 characters).
- `body` (`string`, optional): Text body of the note.

Example input: `{"id":1,"title":"<title>"}`

### `insightly_add_lead_tag`

Add Lead Tag · Write

Add a tag to one lead in Insightly.
Returns the tag that was added.
Use this to label a lead; use insightly_list_tags to see existing tag names.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Numeric ID of the lead to tag.
- `tag_name` (`string`, required): Name of the tag to add. The tag is created if it does not exist yet.

Example input: `{"id":1,"tag_name":"<tag_name>"}`

### `insightly_add_opportunity_note`

Add Opportunity Note · Write

Add a note to one opportunity in Insightly.
Returns the created note record including its NOTE_ID.
Use this to log a call, meeting or comment against a opportunity; use insightly_update_note to edit a note later.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Numeric ID of the opportunity to attach the note to.
- `title` (`string`, required): Short title of the note (max 255 characters).
- `body` (`string`, optional): Text body of the note.

Example input: `{"id":1,"title":"<title>"}`

### `insightly_add_opportunity_tag`

Add Opportunity Tag · Write

Add a tag to one opportunity in Insightly.
Returns the tag that was added.
Use this to label a opportunity; use insightly_list_tags to see existing tag names.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Numeric ID of the opportunity to tag.
- `tag_name` (`string`, required): Name of the tag to add. The tag is created if it does not exist yet.

Example input: `{"id":1,"tag_name":"<tag_name>"}`

### `insightly_add_organisation_note`

Add Organisation Note · Write

Add a note to one organisation in Insightly.
Returns the created note record including its NOTE_ID.
Use this to log a call, meeting or comment against a organisation; use insightly_update_note to edit a note later.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Numeric ID of the organisation to attach the note to.
- `title` (`string`, required): Short title of the note (max 255 characters).
- `body` (`string`, optional): Text body of the note.

Example input: `{"id":1,"title":"<title>"}`

### `insightly_add_organisation_tag`

Add Organisation Tag · Write

Add a tag to one organisation in Insightly.
Returns the tag that was added.
Use this to label a organisation; use insightly_list_tags to see existing tag names.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Numeric ID of the organisation to tag.
- `tag_name` (`string`, required): Name of the tag to add. The tag is created if it does not exist yet.

Example input: `{"id":1,"tag_name":"<tag_name>"}`

### `insightly_add_project_note`

Add Project Note · Write

Add a note to one project in Insightly.
Returns the created note record including its NOTE_ID.
Use this to log a call, meeting or comment against a project; use insightly_update_note to edit a note later.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Numeric ID of the project to attach the note to.
- `title` (`string`, required): Short title of the note (max 255 characters).
- `body` (`string`, optional): Text body of the note.

Example input: `{"id":1,"title":"<title>"}`

### `insightly_add_project_tag`

Add Project Tag · Write

Add a tag to one project in Insightly.
Returns the tag that was added.
Use this to label a project; use insightly_list_tags to see existing tag names.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `id` (`integer`, required): Numeric ID of the project to tag.
- `tag_name` (`string`, required): Name of the tag to add. The tag is created if it does not exist yet.

Example input: `{"id":1,"tag_name":"<tag_name>"}`

### `insightly_create_contact`

Create Contact · Write

Create a new contact in Insightly.
Returns the created contact record including its new CONTACT_ID.
Use this to add a contact; use update_contact to change an existing one.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `first_name` (`string`, required): First (given) name of the person (max 255 characters).
- `address_mail_city` (`string`, optional): The city of the mailing address (max 255 characters).
- `address_mail_country` (`string`, optional): The country of the mailing address (max 255 characters).
- `address_mail_postcode` (`string`, optional): The postcode of the mailing address (max 128 characters).
- `address_mail_state` (`string`, optional): The state of the mailing address (max 255 characters).
- `address_mail_street` (`string`, optional): The street of the mailing address (max 255 characters).
- `address_other_city` (`string`, optional): The city of the other address (max 255 characters).
- `address_other_country` (`string`, optional): The country of the other address (max 255 characters).
- `address_other_postcode` (`string`, optional): The postcode of the other address (max 128 characters).
- `address_other_state` (`string`, optional): The state of the other address (max 255 characters).
- `address_other_street` (`string`, optional): The street of the other address (max 255 characters).
- `assistant_name` (`string`, optional): Name of the person's assistant (max 255 characters).
- `background` (`string`, optional): Free-text background or description of the record (max 4000 characters).
- `custom_fields` (`array`, optional): Custom field values to set. Each entry names a custom field (the FIELD_NAME from insightly_get_custom_fields, such as CUSTOM_FIELD_1__c) and gives its value. Example: [{"FIELD_NAME": "Region__c", "FIELD_VALUE": "EMEA"}].
- `date_of_birth` (`string`, optional): Date of birth as a UTC date-time string in the form YYYY-MM-DD HH:MM:SS.
- `email_address` (`string`, optional): Primary email address (max 255 characters).
- `email_opted_out` (`boolean`, optional): Set true if the person has opted out of marketing email.
- `last_name` (`string`, optional): Last (family) name of the person (max 255 characters).
- `organisation_id` (`integer`, optional): Numeric ID of the Insightly organisation this record belongs to. Find IDs with insightly_search_organisations.
- `owner_user_id` (`integer`, optional): Numeric Insightly user ID of the user who owns the record. Find user IDs with insightly_list_users.
- `phone` (`string`, optional): Primary business phone number (max 255 characters).
- `phone_assistant` (`string`, optional): Phone number of the person's assistant (max 255 characters).
- `phone_fax` (`string`, optional): Fax number (max 255 characters).
- `phone_home` (`string`, optional): Home phone number (max 255 characters).
- `phone_mobile` (`string`, optional): Mobile phone number (max 255 characters).
- `phone_other` (`string`, optional): Other phone number (max 255 characters).
- `salutation` (`string`, optional): Courtesy title shown before the name, such as Mr, Ms or Dr (max 50 characters).
- `social_facebook` (`string`, optional): Facebook profile URL (max 255 characters).
- `social_linkedin` (`string`, optional): LinkedIn profile URL (max 255 characters).
- `social_twitter` (`string`, optional): Twitter/X profile URL or handle (max 255 characters).
- `title` (`string`, optional): Job title of the person, or the title of the record (max 255 characters).

Example input: `{"first_name":"<first_name>"}`

### `insightly_create_event`

Create Event · Write

Create a new event in Insightly.
Returns the created event record including its new EVENT_ID.
Use this to add a event; use update_event to change an existing one.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `end_date_utc` (`string`, required): Event end date-time in UTC in the form YYYY-MM-DD HH:MM:SS.
- `start_date_utc` (`string`, required): Event start date-time in UTC in the form YYYY-MM-DD HH:MM:SS.
- `all_day` (`boolean`, optional): Set true for an all-day event.
- `custom_fields` (`array`, optional): Custom field values to set. Each entry names a custom field (the FIELD_NAME from insightly_get_custom_fields, such as CUSTOM_FIELD_1__c) and gives its value. Example: [{"FIELD_NAME": "Region__c", "FIELD_VALUE": "EMEA"}].
- `details` (`string`, optional): Free-text details or description (max 4000 characters).
- `location` (`string`, optional): Location of the event (max 255 characters).
- `owner_user_id` (`integer`, optional): Numeric Insightly user ID of the user who owns the record. Find user IDs with insightly_list_users.
- `reminder_date_utc` (`string`, optional): Reminder date-time in UTC in the form YYYY-MM-DD HH:MM:SS.
- `title` (`string`, optional): Job title of the person, or the title of the record (max 255 characters).

Example input: `{"end_date_utc":"<end_date_utc>","start_date_utc":"<start_date_utc>"}`

### `insightly_create_lead`

Create Lead · Write

Create a new lead in Insightly.
Returns the created lead record including its new LEAD_ID.
Use this to add a lead; use update_lead to change an existing one.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `last_name` (`string`, required): Last (family) name of the person (max 255 characters).
- `lead_source_id` (`integer`, required): Numeric ID of the lead source. Find IDs with insightly_list_lead_sources.
- `lead_status_id` (`integer`, required): Numeric ID of the lead status. Find IDs with insightly_list_lead_statuses.
- `address_city` (`string`, optional): Address city.
- `address_country` (`string`, optional): Address country.
- `address_postcode` (`string`, optional): Address postcode.
- `address_state` (`string`, optional): Address state.
- `address_street` (`string`, optional): Address street.
- `custom_fields` (`array`, optional): Custom field values to set. Each entry names a custom field (the FIELD_NAME from insightly_get_custom_fields, such as CUSTOM_FIELD_1__c) and gives its value. Example: [{"FIELD_NAME": "Region__c", "FIELD_VALUE": "EMEA"}].
- `email` (`string`, optional): Email address of the lead (max 255 characters).
- `email_opted_out` (`boolean`, optional): Set true if the person has opted out of marketing email.
- `employee_count` (`integer`, optional): Number of employees at the lead's company.
- `fax` (`string`, optional): Fax number (max 255 characters).
- `first_name` (`string`, optional): First (given) name of the person (max 255 characters).
- `industry` (`string`, optional): Industry of the lead's company (max 128 characters).
- `lead_description` (`string`, optional): Free-text description of the lead (max 4000 characters).
- `lead_rating` (`integer`, optional): Numeric rating of the lead, such as 1 (cold) to 5 (hot).
- `mobile` (`string`, optional): Mobile phone number (max 255 characters).
- `organisation_name` (`string`, optional): Name of the organisation or company (max 255 characters).
- `owner_user_id` (`integer`, optional): Numeric Insightly user ID of the user who owns the record. Find user IDs with insightly_list_users.
- `phone` (`string`, optional): Primary business phone number (max 255 characters).
- `responsible_user_id` (`integer`, optional): Numeric Insightly user ID of the user responsible for the record. Find user IDs with insightly_list_users.
- `salutation` (`string`, optional): Courtesy title shown before the name, such as Mr, Ms or Dr (max 50 characters).
- `title` (`string`, optional): Job title of the person, or the title of the record (max 255 characters).
- `website` (`string`, optional): Website URL (max 255 characters).

Example input: `{"last_name":"<last_name>","lead_source_id":1,"lead_status_id":1}`

### `insightly_create_opportunity`

Create Opportunity · Write

Create a new opportunity in Insightly.
Returns the created opportunity record including its new OPPORTUNITY_ID.
Use this to add a opportunity; use update_opportunity to change an existing one.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `opportunity_name` (`string`, required): Name of the opportunity (max 255 characters).
- `actual_close_date` (`string`, optional): Date the opportunity actually closed, as a UTC date-time string in the form YYYY-MM-DD HH:MM:SS.
- `bid_amount` (`number`, optional): Monetary value of the opportunity bid, as a number.
- `bid_currency` (`string`, optional): Three-letter currency code for the bid amount (max 20 characters). List supported codes with insightly_list_currencies.
- `bid_duration` (`integer`, optional): Duration of the bid, expressed in units of the bid type (for example hours when the type is Per Hour).
- `bid_type` (`string`, optional): How the bid is priced, for example Fixed Bid or Per Hour (max 20 characters).
- `category_id` (`integer`, optional): Numeric ID of the record category. Find IDs with the matching category list tool (insightly_list_opportunity_categories, insightly_list_project_categories or insightly_list_task_categories).
- `custom_fields` (`array`, optional): Custom field values to set. Each entry names a custom field (the FIELD_NAME from insightly_get_custom_fields, such as CUSTOM_FIELD_1__c) and gives its value. Example: [{"FIELD_NAME": "Region__c", "FIELD_VALUE": "EMEA"}].
- `forecast_close_date` (`string`, optional): Expected close date, as a UTC date-time string in the form YYYY-MM-DD HH:MM:SS.
- `image_url` (`string`, optional): URL of an image or logo for the record.
- `opportunity_details` (`string`, optional): Free-text details about the opportunity (max 4000 characters).
- `opportunity_state` (`string`, optional): Current state of the opportunity, for example OPEN, WON, LOST, ABANDONED or SUSPENDED (max 20 characters).
- `organisation_id` (`integer`, optional): Numeric ID of the Insightly organisation this record belongs to. Find IDs with insightly_search_organisations.
- `owner_user_id` (`integer`, optional): Numeric Insightly user ID of the user who owns the record. Find user IDs with insightly_list_users.
- `probability` (`integer`, optional): Probability of winning the opportunity as a whole-number percentage from 0 to 100.
- `responsible_user_id` (`integer`, optional): Numeric Insightly user ID of the user responsible for the record. Find user IDs with insightly_list_users.

Example input: `{"opportunity_name":"<opportunity_name>"}`

### `insightly_create_organisation`

Create Organisation · Write

Create a new organisation in Insightly.
Returns the created organisation record including its new ORGANISATION_ID.
Use this to add a organisation; use update_organisation to change an existing one.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `organisation_name` (`string`, required): Name of the organisation or company (max 255 characters).
- `address_billing_city` (`string`, optional): Address billing city.
- `address_billing_country` (`string`, optional): Address billing country.
- `address_billing_postcode` (`string`, optional): Address billing postcode.
- `address_billing_state` (`string`, optional): Address billing state.
- `address_billing_street` (`string`, optional): Address billing street.
- `address_ship_city` (`string`, optional): Address ship city.
- `address_ship_country` (`string`, optional): Address ship country.
- `address_ship_postcode` (`string`, optional): Address ship postcode.
- `address_ship_state` (`string`, optional): Address ship state.
- `address_ship_street` (`string`, optional): Address ship street.
- `background` (`string`, optional): Free-text background or description of the record (max 4000 characters).
- `custom_fields` (`array`, optional): Custom field values to set. Each entry names a custom field (the FIELD_NAME from insightly_get_custom_fields, such as CUSTOM_FIELD_1__c) and gives its value. Example: [{"FIELD_NAME": "Region__c", "FIELD_VALUE": "EMEA"}].
- `image_url` (`string`, optional): URL of an image or logo for the record.
- `owner_user_id` (`integer`, optional): Numeric Insightly user ID of the user who owns the record. Find user IDs with insightly_list_users.
- `phone` (`string`, optional): Primary business phone number (max 255 characters).
- `phone_fax` (`string`, optional): Fax number (max 255 characters).
- `social_facebook` (`string`, optional): Facebook profile URL (max 255 characters).
- `social_linkedin` (`string`, optional): LinkedIn profile URL (max 255 characters).
- `social_twitter` (`string`, optional): Twitter/X profile URL or handle (max 255 characters).
- `website` (`string`, optional): Website URL (max 255 characters).

Example input: `{"organisation_name":"<organisation_name>"}`

### `insightly_create_project`

Create Project · Write

Create a new project in Insightly.
Returns the created project record including its new PROJECT_ID.
Use this to add a project; use update_project to change an existing one.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `project_name` (`string`, required): Name of the project (max 255 characters).
- `status` (`string`, required): Status of the record, for example NOT STARTED, IN PROGRESS, COMPLETED or DEFERRED (max 20 characters).
- `category_id` (`integer`, optional): Numeric ID of the record category. Find IDs with the matching category list tool (insightly_list_opportunity_categories, insightly_list_project_categories or insightly_list_task_categories).
- `completed_date` (`string`, optional): Completion date as a UTC date-time string in the form YYYY-MM-DD HH:MM:SS.
- `custom_fields` (`array`, optional): Custom field values to set. Each entry names a custom field (the FIELD_NAME from insightly_get_custom_fields, such as CUSTOM_FIELD_1__c) and gives its value. Example: [{"FIELD_NAME": "Region__c", "FIELD_VALUE": "EMEA"}].
- `image_url` (`string`, optional): URL of an image or logo for the record.
- `owner_user_id` (`integer`, optional): Numeric Insightly user ID of the user who owns the record. Find user IDs with insightly_list_users.
- `project_details` (`string`, optional): Free-text details about the project (max 4000 characters).
- `responsible_user_id` (`integer`, optional): Numeric Insightly user ID of the user responsible for the record. Find user IDs with insightly_list_users.
- `started_date` (`string`, optional): Start date as a UTC date-time string in the form YYYY-MM-DD HH:MM:SS.

Example input: `{"project_name":"<project_name>","status":"<status>"}`

### `insightly_create_task`

Create Task · Write

Create a new task in Insightly.
Returns the created task record including its new TASK_ID.
Use this to add a task; use update_task to change an existing one.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `completed` (`boolean`, required): Whether the task is already completed. Send false for a new open task.
- `owner_user_id` (`integer`, required): Numeric Insightly user ID of the user who owns the record. Find user IDs with insightly_list_users.
- `title` (`string`, required): Job title of the person, or the title of the record (max 255 characters).
- `assigned_team_id` (`integer`, optional): Numeric ID of the team assigned to the task. Find IDs with insightly_list_teams.
- `category_id` (`integer`, optional): Numeric ID of the record category. Find IDs with the matching category list tool (insightly_list_opportunity_categories, insightly_list_project_categories or insightly_list_task_categories).
- `custom_fields` (`array`, optional): Custom field values to set. Each entry names a custom field (the FIELD_NAME from insightly_get_custom_fields, such as CUSTOM_FIELD_1__c) and gives its value. Example: [{"FIELD_NAME": "Region__c", "FIELD_VALUE": "EMEA"}].
- `details` (`string`, optional): Free-text details or description (max 4000 characters).
- `due_date` (`string`, optional): Due date as a UTC date-time string in the form YYYY-MM-DD HH:MM:SS.
- `email_id` (`integer`, optional): Numeric ID of the email this task is linked to.
- `milestone_id` (`integer`, optional): Numeric ID of the project milestone this task belongs to. Find IDs with insightly_list_milestones.
- `opportunity_id` (`integer`, optional): Numeric ID of the opportunity this task belongs to. Find IDs with insightly_search_opportunities.
- `owner_visible` (`boolean`, optional): Whether the task is visible only to its owner.
- `parent_task_id` (`integer`, optional): Numeric ID of the parent task when creating a subtask.
- `percent_complete` (`integer`, optional): Task progress as a whole-number percentage from 0 to 100.
- `priority` (`integer`, optional): Task priority as a number: 1 is low, 2 is normal and 3 is high.
- `project_id` (`integer`, optional): Numeric ID of the project this task belongs to. Find IDs with insightly_search_projects.
- `recurrence` (`string`, optional): Recurrence rule for the task (max 20 characters).
- `reminder_date_utc` (`string`, optional): Reminder date-time in UTC in the form YYYY-MM-DD HH:MM:SS.
- `responsible_user_id` (`integer`, optional): Numeric Insightly user ID of the user responsible for the record. Find user IDs with insightly_list_users.
- `start_date` (`string`, optional): Start date as a UTC date-time string in the form YYYY-MM-DD HH:MM:SS.
- `status` (`string`, optional): Status of the record, for example NOT STARTED, IN PROGRESS, COMPLETED or DEFERRED (max 20 characters).

Example input: `{"completed":true,"owner_user_id":1,"title":"<title>"}`

### `insightly_update_contact`

Update Contact · Write

Update an existing contact in Insightly by ID.
Returns the updated contact record.
Use this to change a contact you already have an ID for; use create_contact to add a new one. Fields that are left empty are not sent.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `first_name` (`string`, required): First (given) name of the person (max 255 characters).
- `id` (`integer`, required): Numeric ID of the contact to update.
- `address_mail_city` (`string`, optional): The city of the mailing address (max 255 characters).
- `address_mail_country` (`string`, optional): The country of the mailing address (max 255 characters).
- `address_mail_postcode` (`string`, optional): The postcode of the mailing address (max 128 characters).
- `address_mail_state` (`string`, optional): The state of the mailing address (max 255 characters).
- `address_mail_street` (`string`, optional): The street of the mailing address (max 255 characters).
- `address_other_city` (`string`, optional): The city of the other address (max 255 characters).
- `address_other_country` (`string`, optional): The country of the other address (max 255 characters).
- `address_other_postcode` (`string`, optional): The postcode of the other address (max 128 characters).
- `address_other_state` (`string`, optional): The state of the other address (max 255 characters).
- `address_other_street` (`string`, optional): The street of the other address (max 255 characters).
- `assistant_name` (`string`, optional): Name of the person's assistant (max 255 characters).
- `background` (`string`, optional): Free-text background or description of the record (max 4000 characters).
- `custom_fields` (`array`, optional): Custom field values to set. Each entry names a custom field (the FIELD_NAME from insightly_get_custom_fields, such as CUSTOM_FIELD_1__c) and gives its value. Example: [{"FIELD_NAME": "Region__c", "FIELD_VALUE": "EMEA"}].
- `date_of_birth` (`string`, optional): Date of birth as a UTC date-time string in the form YYYY-MM-DD HH:MM:SS.
- `email_address` (`string`, optional): Primary email address (max 255 characters).
- `email_opted_out` (`boolean`, optional): Set true if the person has opted out of marketing email.
- `last_name` (`string`, optional): Last (family) name of the person (max 255 characters).
- `organisation_id` (`integer`, optional): Numeric ID of the Insightly organisation this record belongs to. Find IDs with insightly_search_organisations.
- `owner_user_id` (`integer`, optional): Numeric Insightly user ID of the user who owns the record. Find user IDs with insightly_list_users.
- `phone` (`string`, optional): Primary business phone number (max 255 characters).
- `phone_assistant` (`string`, optional): Phone number of the person's assistant (max 255 characters).
- `phone_fax` (`string`, optional): Fax number (max 255 characters).
- `phone_home` (`string`, optional): Home phone number (max 255 characters).
- `phone_mobile` (`string`, optional): Mobile phone number (max 255 characters).
- `phone_other` (`string`, optional): Other phone number (max 255 characters).
- `salutation` (`string`, optional): Courtesy title shown before the name, such as Mr, Ms or Dr (max 50 characters).
- `social_facebook` (`string`, optional): Facebook profile URL (max 255 characters).
- `social_linkedin` (`string`, optional): LinkedIn profile URL (max 255 characters).
- `social_twitter` (`string`, optional): Twitter/X profile URL or handle (max 255 characters).
- `title` (`string`, optional): Job title of the person, or the title of the record (max 255 characters).

Example input: `{"first_name":"<first_name>","id":1}`

### `insightly_update_event`

Update Event · Write

Update an existing event in Insightly by ID.
Returns the updated event record.
Use this to change a event you already have an ID for; use create_event to add a new one. Fields that are left empty are not sent.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `end_date_utc` (`string`, required): Event end date-time in UTC in the form YYYY-MM-DD HH:MM:SS.
- `id` (`integer`, required): Numeric ID of the event to update.
- `start_date_utc` (`string`, required): Event start date-time in UTC in the form YYYY-MM-DD HH:MM:SS.
- `all_day` (`boolean`, optional): Set true for an all-day event.
- `custom_fields` (`array`, optional): Custom field values to set. Each entry names a custom field (the FIELD_NAME from insightly_get_custom_fields, such as CUSTOM_FIELD_1__c) and gives its value. Example: [{"FIELD_NAME": "Region__c", "FIELD_VALUE": "EMEA"}].
- `details` (`string`, optional): Free-text details or description (max 4000 characters).
- `location` (`string`, optional): Location of the event (max 255 characters).
- `owner_user_id` (`integer`, optional): Numeric Insightly user ID of the user who owns the record. Find user IDs with insightly_list_users.
- `reminder_date_utc` (`string`, optional): Reminder date-time in UTC in the form YYYY-MM-DD HH:MM:SS.
- `title` (`string`, optional): Job title of the person, or the title of the record (max 255 characters).

Example input: `{"end_date_utc":"<end_date_utc>","id":1,"start_date_utc":"<start_date_utc>"}`

### `insightly_update_lead`

Update Lead · Write

Update an existing lead in Insightly by ID.
Returns the updated lead record.
Use this to change a lead you already have an ID for; use create_lead to add a new one. Fields that are left empty are not sent.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the lead to update.
- `last_name` (`string`, required): Last (family) name of the person (max 255 characters).
- `lead_source_id` (`integer`, required): Numeric ID of the lead source. Find IDs with insightly_list_lead_sources.
- `lead_status_id` (`integer`, required): Numeric ID of the lead status. Find IDs with insightly_list_lead_statuses.
- `address_city` (`string`, optional): Address city.
- `address_country` (`string`, optional): Address country.
- `address_postcode` (`string`, optional): Address postcode.
- `address_state` (`string`, optional): Address state.
- `address_street` (`string`, optional): Address street.
- `custom_fields` (`array`, optional): Custom field values to set. Each entry names a custom field (the FIELD_NAME from insightly_get_custom_fields, such as CUSTOM_FIELD_1__c) and gives its value. Example: [{"FIELD_NAME": "Region__c", "FIELD_VALUE": "EMEA"}].
- `email` (`string`, optional): Email address of the lead (max 255 characters).
- `email_opted_out` (`boolean`, optional): Set true if the person has opted out of marketing email.
- `employee_count` (`integer`, optional): Number of employees at the lead's company.
- `fax` (`string`, optional): Fax number (max 255 characters).
- `first_name` (`string`, optional): First (given) name of the person (max 255 characters).
- `industry` (`string`, optional): Industry of the lead's company (max 128 characters).
- `lead_description` (`string`, optional): Free-text description of the lead (max 4000 characters).
- `lead_rating` (`integer`, optional): Numeric rating of the lead, such as 1 (cold) to 5 (hot).
- `mobile` (`string`, optional): Mobile phone number (max 255 characters).
- `organisation_name` (`string`, optional): Name of the organisation or company (max 255 characters).
- `owner_user_id` (`integer`, optional): Numeric Insightly user ID of the user who owns the record. Find user IDs with insightly_list_users.
- `phone` (`string`, optional): Primary business phone number (max 255 characters).
- `responsible_user_id` (`integer`, optional): Numeric Insightly user ID of the user responsible for the record. Find user IDs with insightly_list_users.
- `salutation` (`string`, optional): Courtesy title shown before the name, such as Mr, Ms or Dr (max 50 characters).
- `title` (`string`, optional): Job title of the person, or the title of the record (max 255 characters).
- `website` (`string`, optional): Website URL (max 255 characters).

Example input: `{"id":1,"last_name":"<last_name>","lead_source_id":1,"lead_status_id":1}`

### `insightly_update_note`

Update Note · Write

Update the title and body of an existing Insightly note.
Returns the updated note record.
Use this to edit a note you already have an ID for; use the add_*_note tools to create one.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the note to update.
- `title` (`string`, required): Title of the note (max 255 characters).
- `body` (`string`, optional): Text body of the note.

Example input: `{"id":1,"title":"<title>"}`

### `insightly_update_opportunity`

Update Opportunity · Write

Update an existing opportunity in Insightly by ID.
Returns the updated opportunity record.
Use this to change a opportunity you already have an ID for; use create_opportunity to add a new one. Fields that are left empty are not sent.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the opportunity to update.
- `opportunity_name` (`string`, required): Name of the opportunity (max 255 characters).
- `actual_close_date` (`string`, optional): Date the opportunity actually closed, as a UTC date-time string in the form YYYY-MM-DD HH:MM:SS.
- `bid_amount` (`number`, optional): Monetary value of the opportunity bid, as a number.
- `bid_currency` (`string`, optional): Three-letter currency code for the bid amount (max 20 characters). List supported codes with insightly_list_currencies.
- `bid_duration` (`integer`, optional): Duration of the bid, expressed in units of the bid type (for example hours when the type is Per Hour).
- `bid_type` (`string`, optional): How the bid is priced, for example Fixed Bid or Per Hour (max 20 characters).
- `category_id` (`integer`, optional): Numeric ID of the record category. Find IDs with the matching category list tool (insightly_list_opportunity_categories, insightly_list_project_categories or insightly_list_task_categories).
- `custom_fields` (`array`, optional): Custom field values to set. Each entry names a custom field (the FIELD_NAME from insightly_get_custom_fields, such as CUSTOM_FIELD_1__c) and gives its value. Example: [{"FIELD_NAME": "Region__c", "FIELD_VALUE": "EMEA"}].
- `forecast_close_date` (`string`, optional): Expected close date, as a UTC date-time string in the form YYYY-MM-DD HH:MM:SS.
- `image_url` (`string`, optional): URL of an image or logo for the record.
- `opportunity_details` (`string`, optional): Free-text details about the opportunity (max 4000 characters).
- `opportunity_state` (`string`, optional): Current state of the opportunity, for example OPEN, WON, LOST, ABANDONED or SUSPENDED (max 20 characters).
- `organisation_id` (`integer`, optional): Numeric ID of the Insightly organisation this record belongs to. Find IDs with insightly_search_organisations.
- `owner_user_id` (`integer`, optional): Numeric Insightly user ID of the user who owns the record. Find user IDs with insightly_list_users.
- `probability` (`integer`, optional): Probability of winning the opportunity as a whole-number percentage from 0 to 100.
- `responsible_user_id` (`integer`, optional): Numeric Insightly user ID of the user responsible for the record. Find user IDs with insightly_list_users.

Example input: `{"id":1,"opportunity_name":"<opportunity_name>"}`

### `insightly_update_opportunity_stage`

Update Opportunity Stage · Write

Move an Insightly opportunity to a different pipeline stage.
Returns the pipeline stage change that was applied.
Use this to advance a opportunity through its pipeline; use insightly_list_pipeline_stages to find stage IDs. Use insightly_update_opportunity_state to mark it won or lost.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the opportunity to move to another pipeline stage.
- `stage_id` (`integer`, required): Numeric ID of the pipeline stage to move to. Find IDs with insightly_list_pipeline_stages.

Example input: `{"id":1,"stage_id":1}`

### `insightly_update_opportunity_state`

Update Opportunity State · Write

Change the state of an Insightly opportunity, for example to WON or LOST, with an optional reason.
Returns the new state record with the date of the change.
Use this to close or reopen an opportunity; use insightly_update_opportunity_stage to move it between pipeline stages.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the opportunity whose state to change.
- `state` (`string`, required): New state of the opportunity, for example OPEN, WON, LOST, ABANDONED or SUSPENDED.
- `state_reason_id` (`integer`, optional): Numeric ID of the reason for the state change. Find IDs with insightly_list_opportunity_state_reasons.

Example input: `{"id":1,"state":"<state>"}`

### `insightly_update_organisation`

Update Organisation · Write

Update an existing organisation in Insightly by ID.
Returns the updated organisation record.
Use this to change a organisation you already have an ID for; use create_organisation to add a new one. Fields that are left empty are not sent.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the organisation to update.
- `organisation_name` (`string`, required): Name of the organisation or company (max 255 characters).
- `address_billing_city` (`string`, optional): Address billing city.
- `address_billing_country` (`string`, optional): Address billing country.
- `address_billing_postcode` (`string`, optional): Address billing postcode.
- `address_billing_state` (`string`, optional): Address billing state.
- `address_billing_street` (`string`, optional): Address billing street.
- `address_ship_city` (`string`, optional): Address ship city.
- `address_ship_country` (`string`, optional): Address ship country.
- `address_ship_postcode` (`string`, optional): Address ship postcode.
- `address_ship_state` (`string`, optional): Address ship state.
- `address_ship_street` (`string`, optional): Address ship street.
- `background` (`string`, optional): Free-text background or description of the record (max 4000 characters).
- `custom_fields` (`array`, optional): Custom field values to set. Each entry names a custom field (the FIELD_NAME from insightly_get_custom_fields, such as CUSTOM_FIELD_1__c) and gives its value. Example: [{"FIELD_NAME": "Region__c", "FIELD_VALUE": "EMEA"}].
- `image_url` (`string`, optional): URL of an image or logo for the record.
- `owner_user_id` (`integer`, optional): Numeric Insightly user ID of the user who owns the record. Find user IDs with insightly_list_users.
- `phone` (`string`, optional): Primary business phone number (max 255 characters).
- `phone_fax` (`string`, optional): Fax number (max 255 characters).
- `social_facebook` (`string`, optional): Facebook profile URL (max 255 characters).
- `social_linkedin` (`string`, optional): LinkedIn profile URL (max 255 characters).
- `social_twitter` (`string`, optional): Twitter/X profile URL or handle (max 255 characters).
- `website` (`string`, optional): Website URL (max 255 characters).

Example input: `{"id":1,"organisation_name":"<organisation_name>"}`

### `insightly_update_project`

Update Project · Write

Update an existing project in Insightly by ID.
Returns the updated project record.
Use this to change a project you already have an ID for; use create_project to add a new one. Fields that are left empty are not sent.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the project to update.
- `project_name` (`string`, required): Name of the project (max 255 characters).
- `status` (`string`, required): Status of the record, for example NOT STARTED, IN PROGRESS, COMPLETED or DEFERRED (max 20 characters).
- `category_id` (`integer`, optional): Numeric ID of the record category. Find IDs with the matching category list tool (insightly_list_opportunity_categories, insightly_list_project_categories or insightly_list_task_categories).
- `completed_date` (`string`, optional): Completion date as a UTC date-time string in the form YYYY-MM-DD HH:MM:SS.
- `custom_fields` (`array`, optional): Custom field values to set. Each entry names a custom field (the FIELD_NAME from insightly_get_custom_fields, such as CUSTOM_FIELD_1__c) and gives its value. Example: [{"FIELD_NAME": "Region__c", "FIELD_VALUE": "EMEA"}].
- `image_url` (`string`, optional): URL of an image or logo for the record.
- `owner_user_id` (`integer`, optional): Numeric Insightly user ID of the user who owns the record. Find user IDs with insightly_list_users.
- `project_details` (`string`, optional): Free-text details about the project (max 4000 characters).
- `responsible_user_id` (`integer`, optional): Numeric Insightly user ID of the user responsible for the record. Find user IDs with insightly_list_users.
- `started_date` (`string`, optional): Start date as a UTC date-time string in the form YYYY-MM-DD HH:MM:SS.

Example input: `{"id":1,"project_name":"<project_name>","status":"<status>"}`

### `insightly_update_project_stage`

Update Project Stage · Write

Move an Insightly project to a different pipeline stage.
Returns the pipeline stage change that was applied.
Use this to advance a project through its pipeline; use insightly_list_pipeline_stages to find stage IDs.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the project to move to another pipeline stage.
- `stage_id` (`integer`, required): Numeric ID of the pipeline stage to move to. Find IDs with insightly_list_pipeline_stages.

Example input: `{"id":1,"stage_id":1}`

### `insightly_update_task`

Update Task · Write

Update an existing task in Insightly by ID.
Returns the updated task record.
Use this to change a task you already have an ID for; use create_task to add a new one. Fields that are left empty are not sent.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `completed` (`boolean`, required): Whether the task is already completed. Send false for a new open task.
- `id` (`integer`, required): Numeric ID of the task to update.
- `owner_user_id` (`integer`, required): Numeric Insightly user ID of the user who owns the record. Find user IDs with insightly_list_users.
- `title` (`string`, required): Job title of the person, or the title of the record (max 255 characters).
- `assigned_team_id` (`integer`, optional): Numeric ID of the team assigned to the task. Find IDs with insightly_list_teams.
- `category_id` (`integer`, optional): Numeric ID of the record category. Find IDs with the matching category list tool (insightly_list_opportunity_categories, insightly_list_project_categories or insightly_list_task_categories).
- `custom_fields` (`array`, optional): Custom field values to set. Each entry names a custom field (the FIELD_NAME from insightly_get_custom_fields, such as CUSTOM_FIELD_1__c) and gives its value. Example: [{"FIELD_NAME": "Region__c", "FIELD_VALUE": "EMEA"}].
- `details` (`string`, optional): Free-text details or description (max 4000 characters).
- `due_date` (`string`, optional): Due date as a UTC date-time string in the form YYYY-MM-DD HH:MM:SS.
- `email_id` (`integer`, optional): Numeric ID of the email this task is linked to.
- `milestone_id` (`integer`, optional): Numeric ID of the project milestone this task belongs to. Find IDs with insightly_list_milestones.
- `opportunity_id` (`integer`, optional): Numeric ID of the opportunity this task belongs to. Find IDs with insightly_search_opportunities.
- `owner_visible` (`boolean`, optional): Whether the task is visible only to its owner.
- `parent_task_id` (`integer`, optional): Numeric ID of the parent task when creating a subtask.
- `percent_complete` (`integer`, optional): Task progress as a whole-number percentage from 0 to 100.
- `priority` (`integer`, optional): Task priority as a number: 1 is low, 2 is normal and 3 is high.
- `project_id` (`integer`, optional): Numeric ID of the project this task belongs to. Find IDs with insightly_search_projects.
- `recurrence` (`string`, optional): Recurrence rule for the task (max 20 characters).
- `reminder_date_utc` (`string`, optional): Reminder date-time in UTC in the form YYYY-MM-DD HH:MM:SS.
- `responsible_user_id` (`integer`, optional): Numeric Insightly user ID of the user responsible for the record. Find user IDs with insightly_list_users.
- `start_date` (`string`, optional): Start date as a UTC date-time string in the form YYYY-MM-DD HH:MM:SS.
- `status` (`string`, optional): Status of the record, for example NOT STARTED, IN PROGRESS, COMPLETED or DEFERRED (max 20 characters).

Example input: `{"completed":true,"id":1,"owner_user_id":1,"title":"<title>"}`

### `insightly_delete_contact`

Delete Contact · Destructive

Delete a contact from Insightly by ID.
Returns an empty success response when the delete is accepted.
Use this only when the contact should be removed; the delete cannot be undone from the API.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the contact to delete.

Example input: `{"id":1}`

### `insightly_delete_event`

Delete Event · Destructive

Delete a event from Insightly by ID.
Returns an empty success response when the delete is accepted.
Use this only when the event should be removed; the delete cannot be undone from the API.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the event to delete.

Example input: `{"id":1}`

### `insightly_delete_lead`

Delete Lead · Destructive

Delete a lead from Insightly by ID.
Returns an empty success response when the delete is accepted.
Use this only when the lead should be removed; the delete cannot be undone from the API.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the lead to delete.

Example input: `{"id":1}`

### `insightly_delete_note`

Delete Note · Destructive

Delete a note from Insightly by ID.
Returns an empty success response when the delete is accepted.
Use this only when the note should be removed.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the note to delete.

Example input: `{"id":1}`

### `insightly_delete_opportunity`

Delete Opportunity · Destructive

Delete a opportunity from Insightly by ID.
Returns an empty success response when the delete is accepted.
Use this only when the opportunity should be removed; the delete cannot be undone from the API.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the opportunity to delete.

Example input: `{"id":1}`

### `insightly_delete_organisation`

Delete Organisation · Destructive

Delete a organisation from Insightly by ID.
Returns an empty success response when the delete is accepted.
Use this only when the organisation should be removed; the delete cannot be undone from the API.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the organisation to delete.

Example input: `{"id":1}`

### `insightly_delete_project`

Delete Project · Destructive

Delete a project from Insightly by ID.
Returns an empty success response when the delete is accepted.
Use this only when the project should be removed; the delete cannot be undone from the API.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the project to delete.

Example input: `{"id":1}`

### `insightly_delete_task`

Delete Task · Destructive

Delete a task from Insightly by ID.
Returns an empty success response when the delete is accepted.
Use this only when the task should be removed; the delete cannot be undone from the API.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`integer`, required): Numeric ID of the task to delete.

Example input: `{"id":1}`

## Related

Other CRM & Sales connectors ([all 97](/agentkit/connectors/?category=crm-sales)):

- [HubSpot](/agentkit/connectors/hubspot/): Scalekit connector, OAuth, 457 tools
- [Salesforce](/agentkit/connectors/salesforce/): Scalekit connector, OAuth, 74 tools
- [Close](/agentkit/connectors/close/): Scalekit connector, OAuth, 103 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
