> **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 Holded

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

**Authentication:** Bearer Token
**Categories:** Accounting & Finance, CRM & Sales
**Tools:** 109: 66 read, 43 write, 0 destructive
**Users sign in with:** Access token
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=HOLDED)

## 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 Holded connection

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

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'holded'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Holded:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'holded_accounting_accounts_list',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "holded"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Holded:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="holded_accounting_accounts_list",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Holded credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## 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: 'holded_accounting_accounts_list',
  toolInput: {},
  connector: 'holded',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="holded_accounting_accounts_list",
    tool_input={},
    connection_name="holded",
    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.

### `holded_accounting_accounts_list`

List Accounting Accounts · Read-only

List accounting accounts in Holded, optionally filtered by archived, start_date, end_date, include_empty, text.
Returns a page of records (fields include id, color, number, name, description, group) plus cursor and has_more for pagination.
Use to browse or filter accounting accounts.

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

Inputs:

- `archived` (`boolean`, optional): Include archived accounts when true. Example: true.
- `end_date` (`string`, optional): Filter accounts with activity up to this date (YYYY-MM-DD). Example: 2024-12-31.
- `include_empty` (`boolean`, optional): Include accounts with no transactions when true. Example: true.
- `start_date` (`string`, optional): Filter accounts with activity from this date (YYYY-MM-DD). Example: 2024-01-01.
- `text` (`string`, optional): Case-insensitive partial search on account name or number. Example: subscriptions.

Example input: `{}`

### `holded_bank_account_get`

Get Bank Account · Read-only

Get one bank account by ID with its full details.
Returns id, name, type, currency, balance, iban, bic, and more.
Use when you already have the bank account ID; use holded_bank_accounts_list to find IDs or filter.
Needs the bank account ID from holded_bank_accounts_list.

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

Inputs:

- `id` (`string`, required): Banking account identifier. Example: 507f1f77bcf86cd799439011.

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

### `holded_bank_accounts_list`

List Bank Accounts · Read-only

List bank accounts in Holded, optionally filtered by type, archived.
Returns a page of records (fields include id, name, type, currency, balance, iban) plus cursor and has_more for pagination.
Use to browse or filter bank accounts; use holded_bank_account_get for one record by ID.

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

Inputs:

- `archived` (`boolean`, optional): Filter by archived state. `true` returns only archived accounts, `false` returns only active accounts. Omit to return both (default). Example: true.
- `cursor` (`string`, optional): Opaque cursor for pagination. Example: eyJwYWdlIjoyfQ.
- `limit` (`integer`, optional): Maximum number of banking accounts to return per page. Example: 25.
- `type` (`string`, optional): Filter banking accounts by account type. Allowed values: `bank` (bank account), `card` (credit or debit card), `gateway` (payment gateway such as Stripe or PayPal), `cash` (cash register / petty cash). Example: bank. One of: `bank`, `card`, `gateway`, `cash`.

Example input: `{}`

### `holded_bank_movements_list`

List Bank Movements · Read-only

List the raw bank statement movements of a bank account, with amount, balance after movement, value date and reconciliation status.
Returns a page of records (fields include id, banking_account_id, description, note, amount, currency) plus cursor and has_more for pagination.
Use for reconciliation and cash-flow analysis; use holded_payments_list for payments linked to documents.
Needs the bank account ID from holded_bank_accounts_list.

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

Inputs:

- `id` (`string`, required): Banking account identifier. Example: 507f1f77bcf86cd799439011.
- `cursor` (`string`, optional): Opaque cursor returned by the previous page. Example: eyJwYWdlIjoyfQ.
- `end_date` (`string`, optional): Inclusive upper bound on the movement value date (ISO 8601 date or date-time). Example: 2026-01-31.
- `limit` (`integer`, optional): Maximum number of movements per page. Defaults to 50, maximum 200. Example: 25.
- `start_date` (`string`, optional): Inclusive lower bound on the movement value date (ISO 8601 date or date-time). Example: 2026-01-01.
- `status` (`array`, optional): Reconciliation statuses to filter by: 'pending' (not reconciled), 'reconciled' (fully matched), 'partial' (partially matched), 'forced_reconciled' (manually marked). Example: ["pending"].

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

### `holded_cash_movements_list`

List Cash Movements · Read-only

List the cash movements of a bank or cash account.
Returns a page of records (fields include id, bankingAccountId, date, description, amount, currency) plus cursor and has_more for pagination.
Use for cash-type accounts, which have no bank movements; use holded_bank_movements_list for bank-fed accounts.
Needs the bank account ID from holded_bank_accounts_list.

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

Inputs:

- `id` (`string`, required): Banking account identifier. Example: 507f1f77bcf86cd799439011.
- `cursor` (`string`, optional): Opaque cursor returned by the previous page. Example: eyJwYWdlIjoyfQ.
- `end_date` (`string`, optional): Inclusive upper bound on the movement accounting date (ISO 8601 date or date-time). Example: 2026-01-31.
- `limit` (`integer`, optional): Maximum number of movements per page. Defaults to 50, maximum 200. Example: 25.
- `start_date` (`string`, optional): Inclusive lower bound on the movement accounting date (ISO 8601 date or date-time). Example: 2026-01-01.

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

### `holded_contact_get`

Get Contact · Read-only

Get one contact by ID with its full details.
Returns id, custom_id, name, code, vat_number, trade_name, is_person, and more.
Use when you already have the contact ID; use holded_contacts_list to find IDs or filter.
Needs the contact ID from holded_contacts_list.

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

Inputs:

- `contact_id` (`string`, required): Contact ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_contact_group_get`

Get Contact Group · Read-only

Get one contact group by ID with its full details.
Returns id, name, description, color.
Use when you already have the contact group ID; use holded_contact_groups_list to find IDs or filter.
Needs the contact group ID from holded_contact_groups_list.

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

Inputs:

- `contact_group_id` (`string`, required): Contact Group ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_contact_groups_list`

List Contact Groups · Read-only

List contact groups in Holded.
Returns a page of records (fields include id, name, description, color) plus cursor and has_more for pagination.
Use to browse or filter contact groups; use holded_contact_group_get for one record by ID.

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

Inputs:

- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `limit` (`integer`, optional): Maximum number of items to return. Example: 25.

Example input: `{}`

### `holded_contacts_list`

List Contacts · Read-only

List contacts in Holded, optionally filtered by phone, mobile, email, custom_id, code.
Returns a page of records (fields include id, custom_id, name, code, vat_number, trade_name) plus cursor and has_more for pagination.
Use to browse or filter contacts; use holded_contact_get for one record by ID.

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

Inputs:

- `code` (`string`, optional): Filter contacts by exact tax identification number (NIF/CIF). Example: B12345678.
- `cursor` (`string`, optional): Opaque cursor for pagination. Use the value returned in the previous response to fetch the next page. Example: eyJwYWdlIjoyfQ.
- `custom_id` (`string`, optional): Filter contacts by your external reference identifier. Example: 507f1f77bcf86cd799439011.
- `email` (`string`, optional): Filter contacts by exact email address match. Example: billing@example.com.
- `limit` (`integer`, optional): Maximum number of contacts to return per page. Defaults to 25, maximum 100. Example: 25.
- `mobile` (`string`, optional): Filter contacts by exact mobile number match. Example: +34600000000.
- `phone` (`string`, optional): Filter contacts by exact phone number match. Example: +34910000000.

Example input: `{}`

### `holded_contacts_search`

Search Contacts · Read-only

Search Holded contacts by name using prefix (autocomplete-style) matching.
Returns a page of records (fields include id, custom_id, name, code, vat_number, trade_name) plus cursor and has_more for pagination.
Use for finding a contact from part of its name; use holded_contacts_list to browse or filter by other fields.

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

Inputs:

- `name` (`string`, required): Search term matched against the contact `name` field (prefix matching, case- and diacritic-insensitive). Example: Acme Corp.
- `cursor` (`string`, optional): Opaque cursor for pagination. Use the value returned in the previous response to fetch the next page. Example: eyJwYWdlIjoyfQ.
- `limit` (`integer`, optional): Maximum number of contacts to return per page. Defaults to 25, maximum 100. Example: 25.

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

### `holded_credit_note_get`

Get Sales Credit Note · Read-only

Get one sales credit note by ID with its full details.
Returns id, document_number, contact_id, contact_name, description, date, due_date, and more.
Use when you already have the sales credit note ID; use holded_credit_notes_list to find IDs or filter.
Needs the sales credit note ID from holded_credit_notes_list.

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

Inputs:

- `credit_note_id` (`string`, required): Credit Note ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_credit_notes_list`

List Sales Credit Notes · Read-only

List sales credit notes in Holded, optionally filtered by contact_id, status, start_date, end_date, sort, and more.
Returns a page of records (fields include id, document_number, contact_id, contact_name, description, date) plus cursor and has_more for pagination.
Use to browse or filter sales credit notes; use holded_credit_note_get for one record by ID.

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

Inputs:

- `approval_status` (`string`, optional): Filter by approval status. Use "draft" for unapproved credit notes, "approved" for approved ones. Example: draft. One of: `draft`, `approved`.
- `contact_id` (`string`, optional): Filter credit notes by contact identifier. Example: 507f1f77bcf86cd799439011.
- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `end_date` (`string`, optional): Return only credit notes issued on or before this date. Accepts ISO 8601 datetime (e.g. 2026-12-31T23:59:59+00:00) or date only (e.g. 2026-12-31). A date without a time (YYYY-MM-DD) includes that whole day; a value with a time is applied exactly as sent.
- `limit` (`integer`, optional): Maximum number of credit notes to return per page. Defaults to 50, maximum 200. Example: 25.
- `sort` (`string`, optional): Sort order for results. Prefix with - for descending. Allowed values: date, -date, dueDate, -dueDate, total, -total. Example: date. One of: `date`, `-date`, `dueDate`, `-dueDate`, `total`, `-total`.
- `start_date` (`string`, optional): Return only credit notes issued on or after this date. Accepts ISO 8601 datetime (e.g. 2026-01-01T00:00:00+00:00) or date only (e.g. 2026-01-01).
- `status` (`string`, optional): Filter credit notes by payment status. "pending" matches credit notes with no payment recorded and "partial" those paid in part; both still owe a balance. "outstanding" returns the two together, and "overdue" narrows that set to a due date already past. Allowed values: pending, completed, partial, cancelled, failed, overdue, outstanding. Example: pending. One of: `pending`, `completed`, `partial`, `cancelled`, `failed`, `overdue`, `outstanding`.

Example input: `{}`

### `holded_employee_get`

Get Employee · Read-only

Get one employee by ID with its full details.
Returns id, holded_user_id, name, last_name, full_name, date_of_birth, nationality, and more.
Use when you already have the employee ID; use holded_employees_list to find IDs or filter.
Needs the employee ID from holded_employees_list.

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

Inputs:

- `employee_id` (`string`, required): Employee ID. Example: 507f1f77bcf86cd799439011.

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

### `holded_employees_list`

List Employees · Read-only

List employees in the account.
Returns a page of records (fields include id, holded_user_id, name, last_name, full_name, date_of_birth) plus cursor and has_more for pagination.
Use to browse the team; use holded_employee_get for one employee's details.

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

Inputs:

- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `limit` (`integer`, optional): Maximum number of items to return. Example: 25.
- `search` (`string`, optional): Server-side free-text filter over name, surname, email and code, ignoring case and accents (e.g. "pablo diaz" matches "Pablo Díaz"). ALWAYS use this parameter to resolve an employee the user named — pass the user's exact text. Do NOT filter by name yourself client-side (jmespath/contains): that only sees the current page and cannot fold accents, so it misses matches and picks the wrong person. This search scans ALL employees and returns every match; if more than one comes back, present them and let the user choose.

Example input: `{}`

### `holded_estimate_get`

Get Estimate · Read-only

Get one estimate by ID with its full details.
Returns id, document_number, contact_id, contact_name, description, date, due_date, and more.
Use when you already have the estimate ID; use holded_estimates_list to find IDs or filter.
Needs the estimate ID from holded_estimates_list.

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

Inputs:

- `estimate_id` (`string`, required): Estimate ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_estimates_list`

List Estimates · Read-only

List estimates in Holded, optionally filtered by contact_id, status, billing_status, start_date, end_date, and more.
Returns a page of records (fields include id, document_number, contact_id, contact_name, description, date) plus cursor and has_more for pagination.
Use to browse or filter estimates; use holded_estimate_get for one record by ID.

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

Inputs:

- `approval_status` (`string`, optional): Filter by approval status. Use "draft" for unapproved estimates, "approved" for approved ones. Example: draft. One of: `draft`, `approved`.
- `billing_status` (`string`, optional): Filter estimates by their invoicing status (the **Billed** column in Sales > Quotes). Independent of `status`. Allowed values: pending, paid, partial. Example: pending. One of: `pending`, `paid`, `partial`.
- `contact_id` (`string`, optional): Filter estimates by contact identifier. Example: 507f1f77bcf86cd799439011.
- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `end_date` (`string`, optional): Filter up to this date. Accepts ISO 8601 datetime or date only (YYYY-MM-DD). A date without a time (YYYY-MM-DD) includes that whole day; a value with a time is applied exactly as sent. Example: 2026-12-31T23:59:59+00:00.
- `limit` (`integer`, optional): Maximum number of estimates to return per page. Defaults to 50, maximum 200. Example: 25.
- `sort` (`string`, optional): Sort order for results. Prefix with - for descending. Allowed values: date, -date, dueDate, -dueDate, total, -total. Example: date. One of: `date`, `-date`, `dueDate`, `-dueDate`, `total`, `-total`.
- `start_date` (`string`, optional): Filter from this date. Accepts ISO 8601 datetime or date only (YYYY-MM-DD). Example: 2026-01-01T00:00:00+00:00.
- `status` (`string`, optional): Filter estimates by the customer's decision on the quote: "completed" is shown as **Accepted** in the app, "failed" as **Rejected**, "pending" as awaiting an answer. Independent of `billing_status`. Allowed values: pending, completed, partial, cancelled, failed, overdue. Example: pending. One of: `pending`, `completed`, `partial`, `cancelled`, `failed`, `overdue`.

Example input: `{}`

### `holded_event_get`

Get Calendar Event · Read-only

Get one calendar event by ID with its full details.
Returns id, name, contact_id, contact_name, kind, description, start_date, and more.
Use when you already have the calendar event ID; use holded_events_list to find IDs or filter.
Needs the calendar event ID from holded_events_list.

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

Inputs:

- `event_id` (`string`, required): Event ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_events_list`

List Calendar Events · Read-only

List calendar events in Holded.
Returns a page of records (fields include id, name, contact_id, contact_name, kind, description) plus cursor and has_more for pagination.
Use to browse or filter calendar events; use holded_event_get for one record by ID.

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

Inputs:

- `cursor` (`string`, optional): Pagination cursor from a previous response. Example: eyJwYWdlIjoyfQ.
- `limit` (`integer`, optional): Maximum number of items to return. Example: 25.

Example input: `{}`

### `holded_funnel_get`

Get Sales Funnel · Read-only

Get one sales funnel by ID with its full details.
Returns id, name, stages, labels, created_at, updated_at.
Use when you already have the sales funnel ID; use holded_funnels_list to find IDs or filter.
Needs the sales funnel ID from holded_funnels_list.

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

Inputs:

- `funnel_id` (`string`, required): Funnel ID. Example: 507f1f77bcf86cd799439011.

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

### `holded_funnels_list`

List Sales Funnels · Read-only

List sales funnels in Holded.
Returns a page of records (fields include id, name, stages, labels, created_at, updated_at) plus cursor and has_more for pagination.
Use to browse or filter sales funnels; use holded_funnel_get for one record by ID.

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

Inputs:

- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `limit` (`integer`, optional): Maximum number of items to return. Example: 25.

Example input: `{}`

### `holded_invoice_get`

Get Sales Invoice · Read-only

Get one sales invoice by ID with its full details.
Returns id, document_number, contact_id, contact_name, description, date, due_date, and more.
Use when you already have the sales invoice ID; use holded_invoices_list to find IDs or filter.
Needs the sales invoice ID from holded_invoices_list.

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

Inputs:

- `invoice_id` (`string`, required): Invoice ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_invoices_find_by_number`

Find Invoices by Number · Read-only

Find sales invoices by their document number.
Returns a page of records (fields include id, document_number, contact_id, contact_name, description, date) plus cursor and has_more for pagination.
Use when you know the invoice number (for example INV-0001); use holded_invoices_list to filter by contact, status or dates.

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

Inputs:

- `document_number` (`string`, required): Document number to look up. Supports prefixes (e.g. `F260`) and tolerates minor typos.
- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `limit` (`integer`, optional): Maximum number of invoices to return per page. Example: 25.

Example input: `{"document_number":"F260"}`

### `holded_invoices_list`

List Sales Invoices · Read-only

List sales invoices in Holded, optionally filtered by contact_id, status, start_date, end_date, due_date_start, and more.
Returns a page of records (fields include id, document_number, contact_id, contact_name, description, date) plus cursor and has_more for pagination.
Use to browse or filter sales invoices; use holded_invoice_get for one record by ID.

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

Inputs:

- `accounting_account_num` (`integer`, optional): Filter invoices that have at least one line booked to this accounting account, identified by its numeric PGC code (e.g. 70000000 for "Ventas de mercaderias"). Only the numeric code is accepted; a non-numeric value returns 400. Returns 404 if no accounting account with that number exists in the tenant. When called through the AI assistant, an account name is resolved to its code automatically before the request reaches this endpoint.
- `approval_status` (`string`, optional): Filter by approval status. Use "draft" for unapproved invoices, "approved" for approved ones. Example: draft. One of: `draft`, `approved`.
- `contact_id` (`string`, optional): Filter invoices by contact identifier. Example: 507f1f77bcf86cd799439011.
- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `due_date_end` (`string`, optional): Filter invoices whose DUE date is on or before this date. Accepts ISO 8601 datetime or date only (e.g. 2026-03-12). A date without a time (YYYY-MM-DD) includes that whole day; a value with a time is applied exactly as sent.
- `due_date_start` (`string`, optional): Filter invoices whose DUE date is on or after this date. Accepts ISO 8601 datetime or date only (e.g. 2026-01-01).
- `end_date` (`string`, optional): Filter invoices up to this date. Accepts ISO 8601 datetime (e.g. 2026-12-31T23:59:59+00:00) or date only (e.g. 2026-12-31). A date without a time (YYYY-MM-DD) includes that whole day; a value with a time is applied exactly as sent.
- `limit` (`integer`, optional): Maximum number of invoices to return per page. Defaults to 50, maximum 200. Example: 25.
- `sort` (`string`, optional): Sort order for results. Prefix with - for descending. Allowed values: date, -date, dueDate, -dueDate, total, -total. Example: date. One of: `date`, `-date`, `dueDate`, `-dueDate`, `total`, `-total`.
- `start_date` (`string`, optional): Filter invoices from this date. Accepts ISO 8601 datetime (e.g. 2026-01-01T00:00:00+00:00) or date only (e.g. 2026-01-01).
- `status` (`string`, optional): Filter invoices by payment status. "pending" matches invoices with no payment recorded and "partial" those collected in part; both still owe a balance. "outstanding" returns the two together, "overdue" narrows that set to a due date already past, and "completed" returns the settled ones. Allowed values: pending, completed, partial, cancelled, failed, overdue, outstanding. Example: pending. One of: `pending`, `completed`, `partial`, `cancelled`, `failed`, `overdue`, `outstanding`.

Example input: `{}`

### `holded_lead_get`

Get Lead · Read-only

Get one lead by ID with its full details.
Returns id, user_id, created_by, assigned_to, funnel_id, contact_id, contact_name, and more.
Use when you already have the lead ID; use holded_leads_list to find IDs or filter.
Needs the lead ID from holded_leads_list.

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

Inputs:

- `lead_id` (`string`, required): Lead ID. Example: 507f1f77bcf86cd799439011.

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

### `holded_leads_list`

List Leads · Read-only

List leads in Holded.
Returns a page of records (fields include id, user_id, created_by, assigned_to, funnel_id, contact_id) plus cursor and has_more for pagination.
Use to browse or filter leads; use holded_lead_get for one record by ID.

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

Inputs:

- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `limit` (`integer`, optional): Maximum number of items to return. Example: 25.

Example input: `{}`

### `holded_ledger_entries_list`

List Ledger Entries · Read-only

List ledger entries in Holded, optionally filtered by start_date, end_date, account.
Returns a page of records (fields include id, entry_number, line, date, type, description) plus cursor and has_more for pagination.
Use to browse or filter ledger entries; use holded_ledger_entry_get for one record by ID.

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

Inputs:

- `end_date` (`string`, required): Filter entries up to this date. Example: 2026-12-31.
- `start_date` (`string`, required): Filter entries from this date onward. Example: 2026-01-01.
- `account` (`integer`, optional): Filter entries by accounting account number (e.g. 70500001). Returns only entries posted to this exact account.
- `cursor` (`string`, optional): Opaque cursor for pagination. Example: eyJwYWdlIjoyfQ.
- `limit` (`integer`, optional): Maximum number of ledger entries to return per page. Defaults to 50, maximum 200. Example: 25.

Example input: `{"end_date":"<end_date>","start_date":"<start_date>"}`

### `holded_ledger_entry_get`

Get Ledger Entry · Read-only

Get one ledger entry by ID with its full details.
Returns id, date, type, entry_number, doc_description, notes, contact_id, and more.
Use when you already have the ledger entry ID; use holded_ledger_entries_list to find IDs or filter.
Needs the ledger entry ID from holded_ledger_entries_list.

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

Inputs:

- `ledger_entry_id` (`string`, required): Ledger entry ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_payment_get`

Get Payment · Read-only

Get one payment by ID with its full details.
Returns id, bank_account_id, contact_id, contact_name, amount, description, date, and more.
Use when you already have the payment ID; use holded_payments_list to find IDs or filter.
Needs the payment ID from holded_payments_list.

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

Inputs:

- `payment_id` (`string`, required): Payment ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_payment_method_get`

Get Payment Method · Read-only

Get one payment method by ID with its full details.
Returns id, name, type, status, isDefault, bankingAccountId, dueDays, and more.
Use when you already have the payment method ID; use holded_payment_methods_list to find IDs or filter.
Needs the payment method ID from holded_payment_methods_list.

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

Inputs:

- `payment_method_id` (`string`, required): Payment method identifier. Example: 507f1f77bcf86cd799439011.

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

### `holded_payment_methods_list`

List Payment Methods · Read-only

List payment methods in Holded.
Returns a page of records (fields include id, name, type, status, isDefault, bankingAccountId) plus cursor and has_more for pagination.
Use to browse or filter payment methods; use holded_payment_method_get for one record by ID.

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

Inputs:

- `cursor` (`string`, optional): Opaque cursor for pagination. Pass the value returned in the previous response to fetch the next page. Example: eyJwYWdlIjoyfQ.
- `limit` (`integer`, optional): Maximum number of payment methods to return per page. Defaults to 50, maximum 200. Example: 25.

Example input: `{}`

### `holded_payments_list`

List Payments · Read-only

List payments in Holded, optionally filtered by start_date, end_date, document_id, document_type, banking_account_id.
Returns a page of records (fields include id, bank_account_id, contact_id, contact_name, amount, description) plus cursor and has_more for pagination.
Use to browse or filter payments; use holded_payment_get for one record by ID.

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

Inputs:

- `banking_account_id` (`string`, optional): Filter payments linked to this banking account. Example: 507f1f77bcf86cd799439011.
- `cursor` (`string`, optional): Opaque cursor for pagination. Example: eyJwYWdlIjoyfQ.
- `document_id` (`string`, optional): Filter payments linked to this document. Combine with document_type to match a specific document. Example: 507f1f77bcf86cd799439011.
- `document_type` (`string`, optional): Filter payments by document type. Can be used alone, or combined with document_id to match a specific document. Example: invoice.
- `end_date` (`string`, optional): Filter payments up to this date. Accepts ISO 8601 datetime (e.g. 2024-12-31T23:59:59+00:00) or date only (e.g. 2024-12-31).
- `limit` (`integer`, optional): Maximum number of payments to return per page. Example: 25.
- `start_date` (`string`, optional): Filter payments from this date onward. Accepts ISO 8601 datetime (e.g. 2024-01-01T00:00:00+00:00) or date only (e.g. 2024-01-01).

Example input: `{}`

### `holded_price_list_get`

Get Price List · Read-only

Get one price list by ID with its full details.
Returns id, name, description.
Use when you already have the price list ID; use holded_price_lists_list to find IDs or filter.
Needs the price list ID from holded_price_lists_list.

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

Inputs:

- `price_list_id` (`string`, required): Price List ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_price_lists_list`

List Price Lists · Read-only

List price lists in Holded.
Returns a page of records (fields include id, name, description) plus cursor and has_more for pagination.
Use to browse or filter price lists; use holded_price_list_get for one record by ID.

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

Inputs: none.

Example input: `{}`

### `holded_product_get`

Get Product · Read-only

Get one product by ID with its full details.
Returns id, kind, name, description, type_id, price, taxes, and more.
Use when you already have the product ID; use holded_products_list to find IDs or filter.
Needs the product ID from holded_products_list.

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

Inputs:

- `product_id` (`string`, required): Product ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_product_stock_get`

Get Product Stock · Read-only

Get the stock levels of a product, in total and per warehouse.
Returns product_id, has_stock, total, available, reserved, in_transit, warehouses, and more.
Use to check availability; use holded_warehouse_stock_get to see all products held in one warehouse.
Needs the product ID from holded_products_list.

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

Inputs:

- `product_id` (`string`, required): Product ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_products_list`

List Products · Read-only

List products in Holded, optionally filtered by name.
Returns a page of records (fields include id, kind, name, description, type_id, price) plus cursor and has_more for pagination.
Use to browse or filter products; use holded_product_get for one record by ID.

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

Inputs:

- `cursor` (`string`, optional): Opaque cursor for pagination. Example: eyJwYWdlIjoyfQ.
- `limit` (`integer`, optional): Number of products per page. Defaults to 50, maximum 200. Example: 25.
- `name` (`string`, optional): Search products by name across your whole catalog. Optional. Example: Acme Corp.

Example input: `{}`

### `holded_proforma_get`

Get Proforma · Read-only

Get one proforma invoice by ID with its full details.
Returns id, document_number, contact_id, contact_name, description, date, due_date, and more.
Use when you already have the proforma invoice ID; use holded_proformas_list to find IDs or filter.
Needs the proforma invoice ID from holded_proformas_list.

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

Inputs:

- `proforma_id` (`string`, required): Proforma ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_proformas_list`

List Proformas · Read-only

List proforma invoices in Holded, optionally filtered by contact_id, status, start_date, end_date, sort.
Returns a page of records (fields include id, document_number, contact_id, contact_name, description, date) plus cursor and has_more for pagination.
Use to browse or filter proforma invoices; use holded_proforma_get for one record by ID.

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

Inputs:

- `contact_id` (`string`, optional): Filter proformas by contact identifier. Example: 507f1f77bcf86cd799439011.
- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `end_date` (`string`, optional): Filter up to this date. Accepts ISO 8601 datetime or date only (YYYY-MM-DD). A date without a time (YYYY-MM-DD) includes that whole day; a value with a time is applied exactly as sent. Example: 2026-12-31T23:59:59+00:00.
- `limit` (`integer`, optional): Maximum number of proformas to return per page. Defaults to 50, maximum 200. Example: 25.
- `sort` (`string`, optional): Sort order for results. Prefix with - for descending. Allowed values: date, -date, dueDate, -dueDate, total, -total. Example: date. One of: `date`, `-date`, `dueDate`, `-dueDate`, `total`, `-total`.
- `start_date` (`string`, optional): Filter from this date. Accepts ISO 8601 datetime or date only (YYYY-MM-DD). Example: 2026-01-01T00:00:00+00:00.
- `status` (`string`, optional): Filter proformas by status. Allowed values: pending, completed, partial, cancelled, failed, overdue. Example: pending. One of: `pending`, `completed`, `partial`, `cancelled`, `failed`, `overdue`.

Example input: `{}`

### `holded_project_get`

Get Project · Read-only

Get one project by ID with its full details.
Returns id, name, description, type, icon, color, key, and more.
Use when you already have the project ID; use holded_projects_list to find IDs or filter.
Needs the project ID from holded_projects_list.

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

Inputs:

- `project_id` (`string`, required): Project ID. Example: 507f1f77bcf86cd799439011.

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

### `holded_project_summary_get`

Get Project Summary · Read-only

Get the summary of a project by its ID.
Returns an empty success response.
Use for a quick project overview; use holded_project_get for its full details.
Needs the project ID from holded_projects_list.

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

Inputs:

- `project_id` (`string`, required): Project ID. Example: 507f1f77bcf86cd799439011.

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

### `holded_project_time_entries_list`

List Project Time Entries · Read-only

List the time tracking entries of one project.
Returns a page of records (fields include id, duration, user_name, description, cost_per_hour, user_id) plus cursor and has_more for pagination.
Use for one project's logged hours; use holded_project_times_list for all projects.
Needs the project ID from holded_projects_list.

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

Inputs:

- `project_id` (`string`, required): Project ID. Example: 507f1f77bcf86cd799439011.
- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `endDate` (`string`, optional): Filter entries on or before this date (ISO 8601, YYYY-MM-DD). Example: 2025-12-31.
- `limit` (`integer`, optional): Maximum number of items to return. Example: 25.
- `startDate` (`string`, optional): Filter entries on or after this date (ISO 8601, YYYY-MM-DD). Example: 2025-01-01.

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

### `holded_project_times_list`

List All Project Time Entries · Read-only

List time tracking entries across all projects.
Returns a page of records (fields include id, duration, user_name, description, cost_per_hour, user_id) plus cursor and has_more for pagination.
Use for account-wide time reports; use holded_project_time_entries_list for a single project.

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

Inputs:

- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `limit` (`integer`, optional): Maximum number of items to return. Example: 25.

Example input: `{}`

### `holded_projects_list`

List Projects · Read-only

List projects in Holded, optionally filtered by status.
Returns a page of records (fields include id, name, description, type, icon, color) plus cursor and has_more for pagination.
Use to browse or filter projects; use holded_project_get for one record by ID.

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

Inputs:

- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `limit` (`integer`, optional): Maximum number of items to return. Example: 25.
- `status` (`string`, optional): Filter projects by status. Use "active" or "in_progress" to retrieve only active/in-progress projects. Allowed values: active, in_progress, completed, cancelled, waiting, budgeted. Example: active. One of: `active`, `in_progress`, `completed`, `cancelled`, `waiting`, `budgeted`.

Example input: `{}`

### `holded_purchase_get`

Get Purchase Invoice · Read-only

Get one purchase invoice by ID with its full details.
Returns id, document_number, contact_id, contact_name, description, date, due_date, and more.
Use when you already have the purchase invoice ID; use holded_purchases_list to find IDs or filter.
Needs the purchase invoice ID from holded_purchases_list.

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

Inputs:

- `purchase_id` (`string`, required): Purchase ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_purchase_order_get`

Get Purchase Order · Read-only

Get one purchase order by ID with its full details.
Returns id, document_number, contact_id, contact_name, description, date, due_date, and more.
Use when you already have the purchase order ID; use holded_purchase_orders_list to find IDs or filter.
Needs the purchase order ID from holded_purchase_orders_list.

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

Inputs:

- `purchase_order_id` (`string`, required): Purchase Order ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_purchase_orders_list`

List Purchase Orders · Read-only

List purchase orders in Holded, optionally filtered by contact_id, status, start_date, end_date, sort.
Returns a page of records (fields include id, document_number, contact_id, contact_name, description, date) plus cursor and has_more for pagination.
Use to browse or filter purchase orders; use holded_purchase_order_get for one record by ID.

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

Inputs:

- `contact_id` (`string`, optional): Filter by contact identifier. Example: 507f1f77bcf86cd799439011.
- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `end_date` (`string`, optional): Return only purchase orders issued on or before this date. Accepts ISO 8601 datetime or date only (YYYY-MM-DD). A date without a time (YYYY-MM-DD) includes that whole day; a value with a time is applied exactly as sent. Example: 2026-12-31T23:59:59+00:00.
- `limit` (`integer`, optional): Maximum number of purchase orders to return per page. Defaults to 50, maximum 200. Example: 25.
- `sort` (`string`, optional): Sort field and direction. Prefix with - for descending order. Allowed values: date, -date, dueDate, -dueDate, total, -total. Example: date. One of: `date`, `-date`, `dueDate`, `-dueDate`, `total`, `-total`.
- `start_date` (`string`, optional): Return only purchase orders issued on or after this date. Accepts ISO 8601 datetime or date only (YYYY-MM-DD). Example: 2026-01-01T00:00:00+00:00.
- `status` (`string`, optional): Filter by payment status. Allowed values: pending, completed, partial, cancelled, failed, overdue. Example: pending. One of: `pending`, `completed`, `partial`, `cancelled`, `failed`, `overdue`.

Example input: `{}`

### `holded_purchases_list`

List Purchase Invoices · Read-only

List purchase invoices in Holded, optionally filtered by contact_id, status, start_date, end_date, due_date_start, and more.
Returns a page of records (fields include id, document_number, contact_id, contact_name, description, date) plus cursor and has_more for pagination.
Use to browse or filter purchase invoices; use holded_purchase_get for one record by ID.

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

Inputs:

- `approval_status` (`string`, optional): Filter by approval status. Use "draft" for unapproved purchases, "approved" for approved ones. Example: draft. One of: `draft`, `approved`.
- `contact_id` (`string`, optional): Filter by contact identifier. Example: 507f1f77bcf86cd799439011.
- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `due_date_end` (`string`, optional): Return only purchases whose DUE date is on or before this date. Combine with status=pending to list overdue purchases (set this to the cut-off date). Accepts ISO 8601 datetime or date only (YYYY-MM-DD). A date without a time (YYYY-MM-DD) includes that whole day; a value with a time is applied exactly as sent. Example: 2026-03-12.
- `due_date_start` (`string`, optional): Return only purchases whose DUE date is on or after this date. Accepts ISO 8601 datetime or date only (YYYY-MM-DD). Example: 2026-01-01T00:00:00+00:00.
- `end_date` (`string`, optional): Return only purchases issued on or before this date. Accepts ISO 8601 datetime or date only (YYYY-MM-DD). A date without a time (YYYY-MM-DD) includes that whole day; a value with a time is applied exactly as sent. Example: 2026-12-31T23:59:59+00:00.
- `limit` (`integer`, optional): Maximum number of purchases to return per page. Defaults to 50, maximum 200. Example: 25.
- `sort` (`string`, optional): Sort field and direction. Prefix with - for descending order. Allowed values: date, -date, dueDate, -dueDate, total, -total. Example: date. One of: `date`, `-date`, `dueDate`, `-dueDate`, `total`, `-total`.
- `start_date` (`string`, optional): Return only purchases issued on or after this date. Accepts ISO 8601 datetime or date only (YYYY-MM-DD). Example: 2026-01-01T00:00:00+00:00.
- `status` (`string`, optional): Filter by payment status. "pending" matches purchases with no payment recorded and "partial" those paid in part; both still owe a balance. "outstanding" returns the two together, "overdue" narrows that set to a due date already past, and "completed" returns the settled ones. Allowed values: pending, completed, partial, cancelled, failed, overdue, outstanding. Example: pending. One of: `pending`, `completed`, `partial`, `cancelled`, `failed`, `overdue`, `outstanding`.

Example input: `{}`

### `holded_remittance_get`

Get Remittance · Read-only

Get one remittance by ID with its full details.
Returns id, type, treasury_id, description, date, mode, iban, and more.
Use when you already have the remittance ID; use holded_remittances_list to find IDs or filter.
Needs the remittance ID from holded_remittances_list.

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

Inputs:

- `remittance_id` (`string`, required): Remittance ID. Example: 507f1f77bcf86cd799439011.

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

### `holded_remittances_list`

List Remittances · Read-only

List remittances in Holded, optionally filtered by type, status, start_date, end_date, bank_id, and more.
Returns a page of records (fields include id, type, treasury_id, description, date, mode) plus cursor and has_more for pagination.
Use to browse or filter remittances; use holded_remittance_get for one record by ID.

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

Inputs:

- `bank_id` (`string`, optional): Filter by treasury bank account identifier. Example: 507f1f77bcf86cd799439011.
- `creditor_iban` (`string`, optional): Filter by creditor IBAN. Example: ES9121000418450200051332.
- `creditor_id` (`string`, optional): Filter by SEPA creditor identifier. Example: 507f1f77bcf86cd799439011.
- `creditor_swift` (`string`, optional): Filter by creditor SWIFT/BIC code (8 or 11 alphanumeric characters). Example: CAIXESBB.
- `cursor` (`string`, optional): Opaque cursor for pagination. Example: eyJwYWdlIjoyfQ.
- `end_date` (`string`, optional): Inclusive upper bound on the remittance date (ISO 8601 date, e.g. 2026-12-31).
- `issuer_id` (`string`, optional): Filter by issuer identifier. Example: 507f1f77bcf86cd799439011.
- `limit` (`integer`, optional): Maximum number of remittances to return per page. Defaults to 25, maximum 100. Example: 25.
- `start_date` (`string`, optional): Inclusive lower bound on the remittance date (ISO 8601 date, e.g. 2026-01-01).
- `status` (`string`, optional): Filter by processing status. Allowed values: pending, completed, processing. Example: pending. One of: `pending`, `completed`, `processing`.
- `type` (`string`, optional): Filter by remittance direction. `inbound` returns collection remittances received from customers. `outbound` returns payment remittances issued to suppliers. Example: inbound. One of: `inbound`, `outbound`.

Example input: `{}`

### `holded_sales_channels_list`

List Sales Channels · Read-only

List sales channels in Holded.
Returns a page of records (fields include id, name, color, account_num, archived, description) plus cursor and has_more for pagination.
Use to browse or filter sales channels.

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

Inputs: none.

Example input: `{}`

### `holded_sales_order_get`

Get Sales Order · Read-only

Get one sales order by ID with its full details.
Returns id, document_number, contact_id, contact_name, description, date, due_date, and more.
Use when you already have the sales order ID; use holded_sales_orders_list to find IDs or filter.
Needs the sales order ID from holded_sales_orders_list.

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

Inputs:

- `sales_order_id` (`string`, required): Sales Order ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_sales_orders_list`

List Sales Orders · Read-only

List sales orders in Holded, optionally filtered by contact_id, status, start_date, end_date, sort.
Returns a page of records (fields include id, document_number, contact_id, contact_name, description, date) plus cursor and has_more for pagination.
Use to browse or filter sales orders; use holded_sales_order_get for one record by ID.

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

Inputs:

- `contact_id` (`string`, optional): Filter by contact identifier. Example: 507f1f77bcf86cd799439011.
- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `end_date` (`string`, optional): Filter up to this date. Accepts ISO 8601 datetime (e.g. 2026-12-31T23:59:59+00:00) or date only (e.g. 2026-12-31). A date without a time (YYYY-MM-DD) includes that whole day; a value with a time is applied exactly as sent.
- `limit` (`integer`, optional): Maximum number of sales orders to return per page. Defaults to 50, maximum 200. Example: 25.
- `sort` (`string`, optional): Sort field and direction. Allowed values: date, -date, dueDate, -dueDate, total, -total. Example: date. One of: `date`, `-date`, `dueDate`, `-dueDate`, `total`, `-total`.
- `start_date` (`string`, optional): Filter from this date. Accepts ISO 8601 datetime (e.g. 2026-01-01T00:00:00+00:00) or date only (e.g. 2026-01-01).
- `status` (`string`, optional): Filter by sales order status. Allowed values: pending, completed, partial, cancelled, failed, overdue. Example: pending. One of: `pending`, `completed`, `partial`, `cancelled`, `failed`, `overdue`.

Example input: `{}`

### `holded_sales_receipt_get`

Get Sales Receipt · Read-only

Get one sales receipt by ID with its full details.
Returns id, document_number, contact_id, contact_name, description, date, due_date, and more.
Use when you already have the sales receipt ID; use holded_sales_receipts_list to find IDs or filter.
Needs the sales receipt ID from holded_sales_receipts_list.

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

Inputs:

- `sales_receipt_id` (`string`, required): Sales Receipt ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_sales_receipts_list`

List Sales Receipts · Read-only

List sales receipts in Holded, optionally filtered by contact_id, status, start_date, end_date, sort, and more.
Returns a page of records (fields include id, document_number, contact_id, contact_name, description, date) plus cursor and has_more for pagination.
Use to browse or filter sales receipts; use holded_sales_receipt_get for one record by ID.

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

Inputs:

- `approval_status` (`string`, optional): Filter by approval status. Use "draft" for unapproved sales receipts, "approved" for approved ones. Example: draft. One of: `draft`, `approved`.
- `contact_id` (`string`, optional): Filter by contact identifier. Example: 507f1f77bcf86cd799439011.
- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `end_date` (`string`, optional): Filter up to this date. Accepts ISO 8601 datetime (e.g. 2026-12-31T23:59:59+00:00) or date only (e.g. 2026-12-31). A date without a time (YYYY-MM-DD) includes that whole day; a value with a time is applied exactly as sent.
- `limit` (`integer`, optional): Maximum number of sales receipts to return per page. Defaults to 50, maximum 200. Example: 25.
- `sort` (`string`, optional): Sort field and direction. Allowed values: date, -date, dueDate, -dueDate, total, -total. Example: date. One of: `date`, `-date`, `dueDate`, `-dueDate`, `total`, `-total`.
- `start_date` (`string`, optional): Filter from this date. Accepts ISO 8601 datetime (e.g. 2026-01-01T00:00:00+00:00) or date only (e.g. 2026-01-01).
- `status` (`string`, optional): Filter by sales receipt status. "pending" matches sales receipts with no payment recorded and "partial" those paid in part; both still owe a balance. "outstanding" returns the two together, and "overdue" narrows that set to a due date already past. Allowed values: pending, completed, partial, cancelled, failed, overdue, outstanding. Example: pending. One of: `pending`, `completed`, `partial`, `cancelled`, `failed`, `overdue`, `outstanding`.

Example input: `{}`

### `holded_service_get`

Get Service · Read-only

Get one service by ID with its full details.
Returns id, name, code, description, price, cost, tags, and more.
Use when you already have the service ID; use holded_services_list to find IDs or filter.
Needs the service ID from holded_services_list.

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

Inputs:

- `service_id` (`string`, required): Service ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_services_list`

List Services · Read-only

List services in Holded, optionally filtered by include_archived.
Returns a page of records (fields include id, name, code, description, price, cost) plus cursor and has_more for pagination.
Use to browse or filter services; use holded_service_get for one record by ID.

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

Inputs:

- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `include_archived` (`boolean`, optional): Whether to include archived services in the results. Example: true.
- `limit` (`integer`, optional): Maximum number of services to return per page. Defaults to 25, maximum 100. Example: 25.

Example input: `{}`

### `holded_tags_list`

List Tags · Read-only

List tags in Holded.
Returns a page of records (fields include name) plus cursor and has_more for pagination.
Use to browse or filter tags.

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

Inputs: none.

Example input: `{}`

### `holded_task_get`

Get Task · Read-only

Get one task by ID with its full details.
Returns id, project_id, list_id, name, description, index, status, and more.
Use when you already have the task ID; use holded_tasks_list to find IDs or filter.
Needs the task ID from holded_tasks_list.

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

Inputs:

- `task_id` (`string`, required): Task ID. Example: 507f1f77bcf86cd799439011.

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

### `holded_tasks_list`

List Tasks · Read-only

List tasks in Holded.
Returns a page of records (fields include id, project_id, list_id, name, description, index) plus cursor and has_more for pagination.
Use to browse or filter tasks; use holded_task_get for one record by ID.

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

Inputs:

- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `limit` (`integer`, optional): Maximum number of items to return. Example: 25.

Example input: `{}`

### `holded_taxes_list`

List Taxes · Read-only

List taxes in Holded.
Returns a page of records (fields include id, name, amount, scope, key, group) plus cursor and has_more for pagination.
Use to browse or filter taxes.

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

Inputs: none.

Example input: `{}`

### `holded_time_offs_list`

List Time-Off Requests · Read-only

List time-off requests (holidays, absences, sick leave) across all employees within a start-date range.
Returns a page of records (fields include id, employee_id, time_off_type_id, time_off_type_name, start_date, end_date) plus cursor and has_more for pagination.
Use for team absence overviews; both start_date_from and start_date_to are required.

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

Inputs:

- `start_date_from` (`string`, required): Start date lower bound (YYYY-MM-DD). Example: 2026-01-01.
- `start_date_to` (`string`, required): Start date upper bound (YYYY-MM-DD). Example: 2026-12-31.
- `cursor` (`string`, optional): Cursor. Example: eyJwYWdlIjoyfQ.
- `limit` (`integer`, optional): Limit. Example: 50.
- `status` (`string`, optional): Filter by status. Allowed values: pending, accepted, rejected, cancelled. Example: pending. One of: `pending`, `accepted`, `rejected`, `cancelled`.
- `team_id` (`string`, optional): Filter by team. Example: 507f1f77bcf86cd799439014.
- `time_off_type_id` (`string`, optional): Filter by absence / time off type (e.g. holiday, sick leave, vacation).

Example input: `{"start_date_from":"<start_date_from>","start_date_to":"<start_date_to>"}`

### `holded_warehouse_get`

Get Warehouse · Read-only

Get one warehouse by ID with its full details.
Returns id, user_id, name, notes, email, phone, mobile, and more.
Use when you already have the warehouse ID; use holded_warehouses_list to find IDs or filter.
Needs the warehouse ID from holded_warehouses_list.

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

Inputs:

- `warehouse_id` (`string`, required): Warehouse ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_warehouse_stock_get`

Get Warehouse Stock · Read-only

List the products and quantities stored in one warehouse.
Returns a page of records (fields include product_id, variant_id, stock) plus cursor and has_more for pagination.
Use to audit a single warehouse; use holded_product_stock_get for one product across all warehouses.
Needs the warehouse ID from holded_warehouses_list.

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

Inputs:

- `warehouse_id` (`string`, required): Warehouse ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_warehouses_list`

List Warehouses · Read-only

List warehouses in Holded.
Returns a page of records (fields include id, user_id, name, notes, email, phone) plus cursor and has_more for pagination.
Use to browse or filter warehouses; use holded_warehouse_get for one record by ID.

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

Inputs: none.

Example input: `{}`

### `holded_waybill_get`

Get Waybill · Read-only

Get one waybill by ID with its full details.
Returns id, document_number, contact_id, contact_name, description, date, due_date, and more.
Use when you already have the waybill ID; use holded_waybills_list to find IDs or filter.
Needs the waybill ID from holded_waybills_list.

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

Inputs:

- `waybill_id` (`string`, required): Waybill ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_waybills_list`

List Waybills · Read-only

List waybills in Holded, optionally filtered by contact_id, status, start_date, end_date, sort.
Returns a page of records (fields include id, document_number, contact_id, contact_name, description, date) plus cursor and has_more for pagination.
Use to browse or filter waybills; use holded_waybill_get for one record by ID.

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

Inputs:

- `contact_id` (`string`, optional): Filter by contact identifier. Example: 507f1f77bcf86cd799439011.
- `cursor` (`string`, optional): Pagination cursor returned by the previous response. Omit to start from the first page. Example: eyJwYWdlIjoyfQ.
- `end_date` (`string`, optional): Filter waybills issued on or before this date. Accepts ISO 8601 datetime or date only (YYYY-MM-DD). A date without a time (YYYY-MM-DD) includes that whole day; a value with a time is applied exactly as sent. Example: 2026-12-31T23:59:59+00:00.
- `limit` (`integer`, optional): Maximum number of waybills to return per page. Defaults to 50, maximum 200. Example: 25.
- `sort` (`string`, optional): Sort order for results. Prefix with - for descending. Allowed values: date, -date, dueDate, -dueDate, total, -total. Example: date. One of: `date`, `-date`, `dueDate`, `-dueDate`, `total`, `-total`.
- `start_date` (`string`, optional): Filter waybills issued on or after this date. Accepts ISO 8601 datetime or date only (YYYY-MM-DD). Example: 2026-01-01T00:00:00+00:00.
- `status` (`string`, optional): Filter by waybill status. Allowed values: pending, completed, partial, cancelled, failed, overdue. Example: pending. One of: `pending`, `completed`, `partial`, `cancelled`, `failed`, `overdue`.

Example input: `{}`

### `holded_accounting_account_create`

Create Accounting Account · Write

Create an account in the chart of accounts, using a group prefix and optionally a specific number.
Returns the id of the affected record.
Use to add ledger accounts; prefix is the 1-4 digit group code, not the full account number.

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

Inputs:

- `name` (`string`, required): Display name for the accounting account. Example: Acme Corp.
- `prefix` (`integer`, required): Chart-of-accounts group code (1–4 digits). The full account number is auto-assigned within this group when `number` is absent. Must be 1–4 digits. Example: 4300.
- `color` (`string`, optional): Hex color code for UI display. Example: blue.
- `description` (`string`, optional): Optional description of the account purpose. Example: Consulting services for Q1.
- `number` (`integer`, optional): Exact account number to assign (e.g. 70000013). Must start with `prefix`. When provided the number is used as-is and must be unique; otherwise the next available number in the group is assigned.

Example input: `{"name":"<name>","prefix":4300}`

### `holded_contact_create`

Create Contact · Write

Create a contact in Holded.
Returns the id of the affected record.
Use to add a new contact; use the matching list tool first to avoid duplicates.

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

Inputs:

- `name` (`string`, required): Contact full name or company name. Example: Acme Corp.
- `bill_address` (`object`, optional): Billing address. Example: {"address": "Calle Mayor 1", "city": "Madrid", "postal_code": "28013", "country_code": "ES"}.
- `client_record` (`integer`, optional): Number of the accounting account (chart of accounts) used when this contact acts as a client. Example: 430000.
- `code` (`string`, optional): Tax identification number (NIF, CIF, etc.). Example: B12345678.
- `custom_fields` (`array`, optional): User-defined custom fields. Example: [{"field": "Example field", "value": "5000"}].
- `defaults` (`object`, optional): Default settings applied to documents created for this contact. Example: {"payment_method_id": "507f1f77bcf86cd799439011"}.
- `email` (`string`, optional): Primary email address. Example: billing@example.com.
- `iban` (`string`, optional): IBAN bank account number. Example: ES9121000418450200051332.
- `is_person` (`boolean`, optional): True if the contact is an individual, false if a company. Example: true.
- `mobile` (`string`, optional): Mobile phone number. Example: +34600000000.
- `phone` (`string`, optional): Landline phone number. Example: +34910000000.
- `sepa_date` (`string`, optional): Date the SEPA direct debit mandate was signed. Example: 2026-01-15.
- `sepa_ref` (`string`, optional): SEPA mandate reference for direct debit collections. Example: MANDATE-001.
- `supplier_record` (`integer`, optional): Number of the accounting account (chart of accounts) used when this contact acts as a supplier. Example: 400000.
- `swift` (`string`, optional): SWIFT/BIC code of the bank. Example: CAIXESBBXXX.
- `tags` (`array`, optional): Tags attached to the contact. Example: ["priority","2026"].
- `trade_name` (`string`, optional): Commercial or trade name, if different from legal name. Example: Acme Corp.
- `type` (`string`, optional): Contact classification. Allowed values: client, debtor, supplier, creditor, lead. Example: client. One of: `client`, `debtor`, `supplier`, `creditor`, `lead`.
- `vat_number` (`string`, optional): EU VAT number. Example: ESB12345678.
- `website` (`string`, optional): Website URL. Example: https://www.example.com.

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

### `holded_contact_update`

Update Contact · Write

Update an existing contact; only the fields you pass are changed.
Returns status.
Use to edit a contact; use the create tool for new records.
Needs the contact ID from holded_contacts_list.

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

Inputs:

- `contact_id` (`string`, required): Contact ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.
- `name` (`string`, required): Contact full name or company name. Example: Acme Corp.
- `bill_address` (`object`, optional): Billing address. Example: {"address": "Calle Mayor 1", "city": "Madrid", "postal_code": "28013", "country_code": "ES"}.
- `client_record` (`integer`, optional): Number of the accounting account (chart of accounts) used when this contact acts as a client. Example: 430000.
- `code` (`string`, optional): Tax identification number (NIF, CIF, etc.). Example: B12345678.
- `contact_persons` (`array`, optional): Linked contact persons (by their contact ID). Example: [{"person_id": "507f1f77bcf86cd799439011"}].
- `custom_fields` (`array`, optional): User-defined custom fields. Example: [{"field": "Example field", "value": "5000"}].
- `defaults` (`object`, optional): Default settings applied to documents created for this contact. Example: {"payment_method_id": "507f1f77bcf86cd799439011"}.
- `email` (`string`, optional): Primary email address. Example: billing@example.com.
- `iban` (`string`, optional): IBAN bank account number. Example: ES9121000418450200051332.
- `is_person` (`boolean`, optional): True if the contact is an individual, false if a company. Example: true.
- `mobile` (`string`, optional): Mobile phone number. Example: +34600000000.
- `phone` (`string`, optional): Landline phone number. Example: +34910000000.
- `sepa_date` (`string`, optional): Date the SEPA direct debit mandate was signed. Example: 2026-01-15.
- `sepa_ref` (`string`, optional): SEPA mandate reference for direct debit collections. Example: MANDATE-001.
- `supplier_record` (`integer`, optional): Number of the accounting account (chart of accounts) used when this contact acts as a supplier. Example: 400000.
- `swift` (`string`, optional): SWIFT/BIC code of the bank. Example: CAIXESBBXXX.
- `tags` (`array`, optional): Tags attached to the contact. Example: ["priority","2026"].
- `trade_name` (`string`, optional): Commercial or trade name, if different from legal name. Example: Acme Corp.
- `type` (`string`, optional): Contact classification. Allowed values: client, debtor, supplier, creditor, lead. Example: client. One of: `client`, `debtor`, `supplier`, `creditor`, `lead`.
- `vat_number` (`string`, optional): EU VAT number. Example: ESB12345678.
- `website` (`string`, optional): Website URL. Example: https://www.example.com.

Example input: `{"contact_id":"<contact_id>","name":"<name>"}`

### `holded_credit_note_create`

Create Sales Credit Note · Write

Create a sales credit note in Holded.
Returns the id of the affected record.
Use to create a new sales credit note for a contact; use holded_document_convert to derive one from an existing document instead.
Needs a contact ID from holded_contacts_list or holded_contact_create.

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

Inputs:

- `contact_id` (`string`, required): Identifier of an existing contact. Example: 507f1f77bcf86cd799439011.
- `items` (`array`, required): Line items to include. Example: [{"name": "Consulting services", "units": 1, "price": 100}].
- `body` (`string`, optional): Rich-text content printed on the credit note. Example: Thank you for your business..
- `contact_name` (`string`, optional): Name of the contact. Example: Acme Corp.
- `currency` (`string`, optional): ISO 4217 currency code. Example: EUR.
- `currency_change` (`number`, optional): Exchange rate. Example: 1.08.
- `custom_fields` (`array`, optional): Custom field values. Example: [{"field": "Example field", "value": "5000"}].
- `date` (`string`, optional): Issue date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `description` (`string`, optional): Free-text description. Example: Consulting services for Q1.
- `design_id` (`string`, optional): Identifier of the design template to apply to the document. Example: 507f1f77bcf86cd799439011.
- `discount` (`number`, optional): Global discount percentage. Example: 10.
- `due_date` (`string`, optional): Due date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `language` (`string`, optional): ISO 639-1 language code. Example: es.
- `notes` (`string`, optional): Internal notes visible only to your team. Example: Payment due within 30 days.
- `number` (`string`, optional): Custom document number. Use only if you do not want to assign the number via one of the numbering series created in Holded (e.g. to replicate exactly the number from another platform). The value is saved as-is, without correlativity validation. If this field is sent, number_line_id is ignored.  Warning: do not use a value that matches the format of an existing numbering series. The series keeps its own counter regardless of manually assigned numbers -- e.g. if a series is at number 24 and you manually create a document with 27, the series will keep issuing 25, 26, and when it reaches 27 it will try to create a number that already exists: the request will fail and the series will have lost its correlativity and order. If you need custom numbering, use a prefix or format that does not match any active series, or manage every document in that series with number_line_id.
- `number_line_id` (`string`, optional): Identifier of the numbering series used to automatically assign the next correlative number. This is the recommended option, as it preserves the document order and correlativity. If both fields are sent, number takes priority and number_line_id is ignored. Example: 507f1f77bcf86cd799439011.
- `payment_method_id` (`string`, optional): Identifier of the default payment method. Example: 507f1f77bcf86cd799439011.
- `sales_channel_id` (`string`, optional): Identifier of the sales channel. Example: 507f1f77bcf86cd799439011.
- `tags` (`array`, optional): Tags to attach. Example: ["priority","2026"].
- `warehouse_id` (`string`, optional): Identifier of the warehouse. Example: 507f1f77bcf86cd799439011.

Example input: `{"contact_id":"<contact_id>","items":[{"name":"Consulting services","units":1,"price":100}]}`

### `holded_document_convert`

Convert Document · Write

Convert an existing document into a new document of another type, for example an estimate into an invoice.
Returns the id of the affected record.
Use to progress a document through the sales or purchase flow while keeping the link to its source; the source document is unchanged.
Needs the source document ID from the matching list tool; not every type pair is supported.

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

Inputs:

- `source_id` (`string`, required): Identifier of the source document. Example: 507f1f77bcf86cd799439011.
- `source_type` (`string`, required): Type of the source document to convert from. Allowed values: invoice, creditnote, estimate, salesorder, salesreceipt, purchase, order, proform, waybill. Example: invoice. One of: `invoice`, `creditnote`, `estimate`, `salesorder`, `salesreceipt`, `purchase`, `order`, `proform`, `waybill`.
- `target_type` (`string`, required): Type of the target document to convert to. Allowed values: invoice, creditnote, estimate, salesorder, salesreceipt, purchase, order, proform, waybill. Example: invoice. One of: `invoice`, `creditnote`, `estimate`, `salesorder`, `salesreceipt`, `purchase`, `order`, `proform`, `waybill`.
- `date` (`string`, optional): Issue date for the new document in ISO 8601 format. Example: 2024-01-15.
- `description` (`string`, optional): Description for the new document. Example: Consulting services for Q1.
- `draft` (`boolean`, optional): Whether to create the new document as a draft. Example: true.
- `due_date` (`string`, optional): Due date for the new document in ISO 8601 format. Example: 2024-02-15.
- `notes` (`string`, optional): Internal notes for the new document. Example: Payment due within 30 days.
- `number_line_id` (`string`, optional): Identifier of the numbering series to use. Example: 507f1f77bcf86cd799439011.

Example input: `{"source_id":"<source_id>","source_type":"invoice","target_type":"invoice"}`

### `holded_estimate_accept`

Accept Estimate · Write

Mark an estimate as accepted and record who accepted it.
Returns an empty success response.
Use when a customer accepts a quote; follow with holded_document_convert to turn it into an invoice or sales order.
Needs the estimate ID from holded_estimates_list.

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

Inputs:

- `estimate_id` (`string`, required): Estimate ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.
- `comment` (`string`, optional): Optional comment from the client. Example: Approved by the client.
- `name` (`string`, optional): Name of the person accepting the estimate. Example: Acme Corp.

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

### `holded_estimate_create`

Create Estimate · Write

Create a estimate in Holded.
Returns the id of the affected record.
Use to create a new estimate for a contact; use holded_document_convert to derive one from an existing document instead.
Needs a contact ID from holded_contacts_list or holded_contact_create.

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

Inputs:

- `contact_id` (`string`, required): Identifier of an existing contact. Example: 507f1f77bcf86cd799439011.
- `items` (`array`, required): Line items to include. Example: [{"name": "Consulting services", "units": 1, "price": 100}].
- `contact_name` (`string`, optional): Name of the contact. Example: Acme Corp.
- `currency` (`string`, optional): ISO 4217 currency code. Example: EUR.
- `currency_change` (`number`, optional): Exchange rate. Example: 1.08.
- `custom_fields` (`array`, optional): Custom field values. Example: [{"field": "Example field", "value": "5000"}].
- `date` (`string`, optional): Issue date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `description` (`string`, optional): Free-text description. Example: Consulting services for Q1.
- `design_id` (`string`, optional): Identifier of the design template to apply to the document. Example: 507f1f77bcf86cd799439011.
- `discount` (`number`, optional): Global discount percentage. Example: 10.
- `due_date` (`string`, optional): Expiry date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `language` (`string`, optional): ISO 639-1 language code. Example: es.
- `notes` (`string`, optional): Internal notes visible only to your team. Example: Payment due within 30 days.
- `number` (`string`, optional): Custom document number. Use only if you do not want to assign the number via one of the numbering series created in Holded (e.g. to replicate exactly the number from another platform). The value is saved as-is, without correlativity validation. If this field is sent, number_line_id is ignored.  Warning: do not use a value that matches the format of an existing numbering series. The series keeps its own counter regardless of manually assigned numbers -- e.g. if a series is at number 24 and you manually create a document with 27, the series will keep issuing 25, 26, and when it reaches 27 it will try to create a number that already exists: the request will fail and the series will have lost its correlativity and order. If you need custom numbering, use a prefix or format that does not match any active series, or manage every document in that series with number_line_id.
- `number_line_id` (`string`, optional): Identifier of the numbering series used to automatically assign the next correlative number. This is the recommended option, as it preserves the document order and correlativity. If both fields are sent, number takes priority and number_line_id is ignored. Example: 507f1f77bcf86cd799439011.
- `payment_method_id` (`string`, optional): Identifier of the default payment method. Example: 507f1f77bcf86cd799439011.
- `sales_channel_id` (`string`, optional): Identifier of the sales channel. Example: 507f1f77bcf86cd799439011.
- `show_total` (`boolean`, optional): Whether to show the total row in the PDF. Example: true.
- `tags` (`array`, optional): Tags to attach. Example: ["priority","2026"].
- `tax_included` (`boolean`, optional): Whether prices are tax-included. Example: true.

Example input: `{"contact_id":"<contact_id>","items":[{"name":"Consulting services","units":1,"price":100}]}`

### `holded_estimate_send`

Send Estimate by Email · Write

Email an estimate to the recipient addresses you provide, using the account's email template.
Returns an empty success response.
Use to deliver a quote to a customer; omitted subject and message fall back to the account template.
Needs the estimate ID from holded_estimates_list or holded_estimate_create.

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

Inputs:

- `emails` (`array`, required): List of recipient email addresses. Example: ["billing@example.com"].
- `estimate_id` (`string`, required): Estimate ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.
- `bcc` (`array`, optional): List of BCC email addresses. Example: ["archive@example.com"].
- `cc` (`array`, optional): List of CC email addresses. Example: ["accounting@example.com"].
- `mail_template_id` (`string`, optional): Identifier of the email template to use. Example: 507f1f77bcf86cd799439011.
- `message` (`string`, optional): Custom email body message. Example: Please find the document attached..
- `subject` (`string`, optional): Custom email subject line. Example: Your invoice from Acme Corp.

Example input: `{"emails":["billing@example.com"],"estimate_id":"<estimate_id>"}`

### `holded_estimate_update`

Update Estimate · Write

Update an existing estimate; only the fields you pass are changed.
Returns the id of the affected record.
Use to edit a estimate; use the create tool for new records.
Needs the estimate ID from holded_estimates_list.

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

Inputs:

- `estimate_id` (`string`, required): Estimate ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.
- `date` (`string`, optional): Issue date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `design_id` (`string`, optional): Identifier of the design template to apply to the document. Example: 507f1f77bcf86cd799439011.
- `due_date` (`string`, optional): Payment due date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `items` (`array`, optional): Line items to include. Example: [{"name": "Consulting services", "units": 1, "price": 100}].
- `show_total` (`boolean`, optional): Whether to show the total row in the PDF. Example: true.
- `tax_included` (`boolean`, optional): Whether prices are tax-included. Example: true.

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

### `holded_event_create`

Create Calendar Event · Write

Create a calendar event in Holded.
Returns the id of the affected record.
Use to add a new calendar event; use the matching list tool first to avoid duplicates.

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

Inputs:

- `name` (`string`, required): Event name. Example: Acme Corp.
- `start_date` (`string`, required): Start date and time of the event in local time, without timezone offset (e.g. 2026-04-01T09:00:00 for 9am). Date only also accepted (e.g. 2026-04-01).
- `contact_id` (`string`, optional): Associated contact ID. Example: 507f1f77bcf86cd799439011.
- `contact_name` (`string`, optional): Contact display name. Example: Acme Corp.
- `description` (`string`, optional): Event description. Example: Consulting services for Q1.
- `duration` (`integer`, optional): Duration in seconds (used if end_date is not provided, default 3600). Example: 3600.
- `end_date` (`string`, optional): End date and time of the event in local time, without timezone offset (e.g. 2026-04-01T10:00:00 for 10am). Preferred over duration. Date only also accepted (e.g. 2026-04-01).
- `kind` (`string`, optional): Activity type key (e.g. call, meeting, task).
- `lead_id` (`string`, optional): Associated deal/lead ID. Example: 507f1f77bcf86cd799439011.
- `location` (`string`, optional): Event location. Example: Madrid office.
- `participants` (`array`, optional): List of participants/invitees to add to the event. Example: [{"email": "billing@example.com", "name": "Consulting services"}].
- `status` (`integer`, optional): Event status (0 = pending, 1 = completed). Example: 1.
- `tags` (`array`, optional): List of tag names. Example: ["priority","2026"].
- `user_id` (`string`, optional): Owner user ID. Example: 507f1f77bcf86cd799439011.

Example input: `{"name":"<name>","start_date":"<start_date>"}`

### `holded_invoice_approve`

Approve Sales Invoice · Write

Approve a sales invoice by setting its approval date.
Returns an empty success response.
Use after creating a draft invoice; use holded_invoice_cancel to void one instead.
Needs the invoice ID from holded_invoices_list or holded_invoice_create.

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

Inputs:

- `invoice_id` (`string`, required): Invoice ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_invoice_cancel`

Cancel Sales Invoice · Write

Cancel (void) a sales invoice so it can no longer be edited or paid.
Returns an empty success response.
Use only when the user asks to cancel or void an invoice; the call fails with 422 if the invoice is already paid or voided.
Needs the invoice ID from holded_invoices_list.

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

Inputs:

- `invoice_id` (`string`, required): Invoice ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.

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

### `holded_invoice_create`

Create Sales Invoice · Write

Create a sales invoice in Holded.
Returns the id of the affected record.
Use to create a new sales invoice for a contact; use holded_document_convert to derive one from an existing document instead.
Needs a contact ID from holded_contacts_list or holded_contact_create.

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

Inputs:

- `contact_id` (`string`, required): Identifier of an existing contact. Example: 507f1f77bcf86cd799439011.
- `items` (`array`, required): Line items to include in the invoice. Example: [{"name": "Consulting services", "units": 1, "price": 100}].
- `body` (`string`, optional): Rich-text content printed on the invoice. Example: Thank you for your business..
- `contact_name` (`string`, optional): Name of the contact. Example: Acme Corp.
- `currency` (`string`, optional): ISO 4217 currency code. Example: EUR.
- `currency_change` (`number`, optional): Exchange rate to apply when the currency differs from your account currency. Example: 1.08.
- `custom_fields` (`array`, optional): Custom field values to set on the invoice. Example: [{"field": "Example field", "value": "5000"}].
- `date` (`string`, optional): Issue date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `description` (`string`, optional): Free-text description of the invoice. Example: Consulting services for Q1.
- `design_id` (`string`, optional): Identifier of the design template to apply to the document. Example: 507f1f77bcf86cd799439011.
- `discount` (`number`, optional): Global discount percentage to apply. Example: 10.
- `due_date` (`string`, optional): Payment due date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `language` (`string`, optional): ISO 639-1 language code for the invoice. Example: es.
- `notes` (`string`, optional): Internal notes visible only to your team. Example: Payment due within 30 days.
- `number` (`string`, optional): Custom document number. Use only if you do not want to assign the number via one of the numbering series created in Holded (e.g. to replicate exactly the number from another platform). The value is saved as-is, without correlativity validation. If this field is sent, number_line_id is ignored.  Warning: do not use a value that matches the format of an existing numbering series. The series keeps its own counter regardless of manually assigned numbers -- e.g. if a series is at number 24 and you manually create a document with 27, the series will keep issuing 25, 26, and when it reaches 27 it will try to create a number that already exists: the request will fail and the series will have lost its correlativity and order. If you need custom numbering, use a prefix or format that does not match any active series, or manage every document in that series with number_line_id.
- `number_line_id` (`string`, optional): Identifier of the numbering series used to automatically assign the next correlative number. This is the recommended option, as it preserves the document order and correlativity. If both fields are sent, number takes priority and number_line_id is ignored. Example: 507f1f77bcf86cd799439011.
- `payment_method_id` (`string`, optional): Identifier of the default payment method. Example: 507f1f77bcf86cd799439011.
- `sales_channel_id` (`string`, optional): Identifier of the sales channel. Example: 507f1f77bcf86cd799439011.
- `tags` (`array`, optional): Tags to attach to the invoice. Example: ["priority","2026"].
- `warehouse_id` (`string`, optional): Identifier of the warehouse for stock movements. Example: 507f1f77bcf86cd799439011.

Example input: `{"contact_id":"<contact_id>","items":[{"name":"Consulting services","units":1,"price":100}]}`

### `holded_invoice_payment_create`

Register Invoice Payment · Write

Record a payment against a sales invoice, reducing its pending balance.
Returns an empty success response.
Use to mark a full or partial payment received; use holded_payment_create for a standalone payment movement.
Needs the invoice ID from holded_invoices_list.

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

Inputs:

- `invoice_id` (`string`, required): Invoice ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.
- `amount` (`string`, optional): Amount. Example: 100.00.
- `date` (`string`, optional): Payment date in ISO 8601 format. Example: 2026-01-15.
- `description` (`string`, optional): Free-text description of the payment. Example: Consulting services for Q1.
- `treasury_id` (`string`, optional): Identifier of the treasury account. If omitted, the account default treasury is used. Example: 507f1f77bcf86cd799439011.

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

### `holded_invoice_send`

Send Sales Invoice by Email · Write

Email a sales invoice to the recipient addresses you provide, using the account's email template.
Returns an empty success response.
Use to deliver an invoice to a customer; omitted subject and message fall back to the account template.
Needs the invoice ID from holded_invoices_list or holded_invoice_create.

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

Inputs:

- `emails` (`array`, required): List of recipient email addresses. Example: ["billing@example.com"].
- `invoice_id` (`string`, required): Invoice ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.
- `bcc` (`array`, optional): List of BCC email addresses. Example: ["archive@example.com"].
- `cc` (`array`, optional): List of CC email addresses. Example: ["accounting@example.com"].
- `mail_template_id` (`string`, optional): Identifier of the email template to use. Example: 507f1f77bcf86cd799439011.
- `message` (`string`, optional): Custom email body message. Example: Please find the document attached..
- `subject` (`string`, optional): Custom email subject line. Example: Your invoice from Acme Corp.

Example input: `{"emails":["billing@example.com"],"invoice_id":"<invoice_id>"}`

### `holded_invoice_update`

Update Sales Invoice · Write

Update an existing sales invoice; only the fields you pass are changed.
Returns the id of the affected record.
Use to edit a sales invoice; use the create tool for new records.
Needs the sales invoice ID from holded_invoices_list.

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

Inputs:

- `invoice_id` (`string`, required): Invoice ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.
- `body` (`string`, optional): Rich-text content printed on the invoice. Example: Thank you for your business..
- `contact_id` (`string`, optional): Identifier of an existing contact. Example: 507f1f77bcf86cd799439011.
- `contact_name` (`string`, optional): Name of the contact. Example: Acme Corp.
- `currency` (`string`, optional): ISO 4217 currency code. Example: EUR.
- `currency_change` (`number`, optional): Exchange rate to apply when the currency differs from your account currency. Example: 1.08.
- `custom_fields` (`array`, optional): Custom field values to set on the invoice. Example: [{"field": "Example field", "value": "5000"}].
- `date` (`string`, optional): Issue date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `description` (`string`, optional): Free-text description of the invoice. Example: Consulting services for Q1.
- `design_id` (`string`, optional): Identifier of the design template to apply to the document. Example: 507f1f77bcf86cd799439011.
- `discount` (`number`, optional): Global discount percentage to apply. Example: 10.
- `due_date` (`string`, optional): Payment due date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `items` (`array`, optional): Line items to include in the invoice. Example: [{"name": "Consulting services", "units": 1, "price": 100}].
- `language` (`string`, optional): ISO 639-1 language code for the invoice. Example: es.
- `notes` (`string`, optional): Internal notes visible only to your team. Example: Payment due within 30 days.
- `number_line_id` (`string`, optional): Identifier of the numbering series to use. Example: 507f1f77bcf86cd799439011.
- `payment_method_id` (`string`, optional): Identifier of the default payment method. Example: 507f1f77bcf86cd799439011.
- `sales_channel_id` (`string`, optional): Identifier of the sales channel. Example: 507f1f77bcf86cd799439011.
- `tags` (`array`, optional): Tags to attach to the invoice. Example: ["priority","2026"].
- `warehouse_id` (`string`, optional): Identifier of the warehouse for stock movements. Example: 507f1f77bcf86cd799439011.

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

### `holded_lead_create`

Create Lead · Write

Create a lead in a sales funnel.
Returns the id of the affected record.
Use to register a new sales opportunity.
Needs a funnel ID from holded_funnels_list.

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

Inputs:

- `contact_id` (`string`, required): Contact ID. Example: 507f1f77bcf86cd799439011.
- `funnel_id` (`string`, required): Funnel ID. Example: 507f1f77bcf86cd799439011.
- `name` (`string`, required): Lead name. Example: Acme Corp.
- `assigned_to` (`string`, optional): Assigned user ID. Example: 507f1f77bcf86cd799439011.
- `custom_fields` (`array`, optional): Custom fields. Example: [{"field": "Industry", "value": "Software"}].
- `due_date` (`string`, optional): Due date (YYYY-MM-DD). Example: 2024-01-15.
- `potential` (`number`, optional): Deal potential. Example: 50.
- `stage_id` (`string`, optional): Stage ID. Example: 507f1f77bcf86cd799439011.
- `value` (`number`, optional): Deal value. Example: 5000.

Example input: `{"contact_id":"<contact_id>","funnel_id":"<funnel_id>","name":"<name>"}`

### `holded_lead_note_create`

Create Lead Note · Write

Add a note to an existing lead.
Returns the id of the affected record.
Use to log context on a lead; use holded_lead_get to read the lead.
Needs the lead ID from holded_leads_list.

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

Inputs:

- `description` (`string`, required): Note body (required — the legacy note store rejects an empty description). Example: Consulting services for Q1.
- `lead_id` (`string`, required): Lead ID. Example: 507f1f77bcf86cd799439011.
- `title` (`string`, required): Note title. Example: Follow-up call.

Example input: `{"description":"<description>","lead_id":"<lead_id>","title":"<title>"}`

### `holded_lead_stage_update`

Update Lead Stage · Write

Move a lead to another stage of its sales funnel.
Returns the id of the affected record.
Use to progress a lead; use holded_lead_update to change other lead fields.
Needs the lead ID from holded_leads_list and a stage ID from holded_funnel_get.

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

Inputs:

- `lead_id` (`string`, required): Lead ID. Example: 507f1f77bcf86cd799439011.
- `stage_id` (`string`, required): New stage ID. Example: 507f1f77bcf86cd799439011.

Example input: `{"lead_id":"<lead_id>","stage_id":"<stage_id>"}`

### `holded_lead_update`

Update Lead · Write

Update an existing lead; only the fields you pass are changed.
Returns the id of the affected record.
Use to edit a lead; use the create tool for new records.
Needs the lead ID from holded_leads_list.

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

Inputs:

- `lead_id` (`string`, required): Lead ID. Example: 507f1f77bcf86cd799439011.
- `assigned_to` (`string`, optional): Assigned user ID. Example: 507f1f77bcf86cd799439011.
- `contact_id` (`string`, optional): Contact ID. Example: 507f1f77bcf86cd799439011.
- `custom_fields` (`array`, optional): Custom fields. Example: [{"field": "Industry", "value": "Software"}].
- `due_date` (`string`, optional): Due date (YYYY-MM-DD). Example: 2024-01-15.
- `funnel_id` (`string`, optional): Funnel ID. Example: 507f1f77bcf86cd799439011.
- `name` (`string`, optional): Lead name. Example: Acme Corp.
- `potential` (`number`, optional): Deal potential. Example: 50.
- `stage_id` (`string`, optional): Stage ID. Example: 507f1f77bcf86cd799439011.
- `status` (`string`, optional): Lead status. Allowed values: open, won, lost. Example: open. One of: `open`, `won`, `lost`.
- `value` (`number`, optional): Deal value. Example: 5000.

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

### `holded_ledger_entry_create`

Create Ledger Entry · Write

Create a manual ledger (journal) entry with debit and credit lines.
Returns the id of the affected record.
Use for manual accounting adjustments; use holded_ledger_entries_list to review existing entries.

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

Inputs:

- `date` (`string`, required): Ledger entry date in ISO 8601 format. Example: 2024-01-15.
- `lines` (`array`, required): Lines. Example: [{"account": 70000000, "debit": "100.00", "credit": "0"}].
- `contact_id` (`string`, optional): Contact identifier linked to this entry. Example: 507f1f77bcf86cd799439011.
- `notes` (`string`, optional): Free-text notes for the ledger entry. Example: Payment due within 30 days.

Example input: `{"date":"<date>","lines":[{"account":70000000,"debit":"100.00","credit":"0"}]}`

### `holded_payment_create`

Create Payment · Write

Create a standalone payment movement: money paid out to a supplier or collected from a customer.
Returns the id of the affected record.
Use for payments not tied to one document; use holded_invoice_payment_create to pay a specific sales invoice.
Optionally needs a bank account ID from holded_bank_accounts_list and a contact ID from holded_contacts_list.

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

Inputs:

- `amount` (`string`, required): Absolute payment amount as decimal string (must be greater than zero). Example: 1500.50.
- `date` (`string`, required): Payment date in ISO 8601 format (YYYY-MM-DD). Example: 2026-05-13.
- `type` (`string`, required): Movement direction: "payment" for outgoing money, "collection" for incoming money. Example: payment. One of: `payment`, `collection`.
- `bank_account_id` (`string`, optional): Treasury account identifier. Example: 507f1f77bcf86cd799439011.
- `contact_id` (`string`, optional): Contact identifier. Example: 507f1f77bcf86cd799439011.
- `description` (`string`, optional): Payment description. Example: Consulting services for Q1.

Example input: `{"amount":"<amount>","date":"<date>","type":"payment"}`

### `holded_product_create`

Create Product · Write

Create a product in Holded.
Returns the id of the affected record.
Use to add a new product; use the matching list tool first to avoid duplicates.

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

Inputs:

- `for_purchase` (`boolean`, required): Whether the product is available for purchase. Example: true.
- `for_sale` (`boolean`, required): Whether the product is available for sale. Example: true.
- `has_stock` (`boolean`, required): Whether stock tracking is enabled. Example: true.
- `kind` (`string`, required): Product kind: 'simple' for standard products, 'variants' for products with attributes (color/size), 'lots' for batch-tracked products, 'serialnumbers' for individually tracked products, 'pack' for product bundles. Example: simple. One of: `simple`, `lots`, `pack`, `variants`, `serialnumbers`.
- `name` (`string`, required): Product name. Example: Acme Corp.
- `barcode` (`string`, optional): Barcode value. Example: 8412345678901.
- `cost` (`string`, optional): Unit cost price as a decimal string. Example: 49.99.
- `description` (`string`, optional): Product description. Example: Consulting services for Q1.
- `exp_account_id` (`string`, optional): Expense/purchases accounting account identifier for this product. Example: 507f1f77bcf86cd799439011.
- `pack_items` (`array`, optional): Items included in this pack product. Example: [{"units": 1}].
- `price` (`string`, optional): Unit sale price as a decimal string. Example: 99.95.
- `purchase_price` (`string`, optional): Unit purchase price as a decimal string. Example: 20.00.
- `sales_channel_id` (`string`, optional): Sales channel identifier for this product. Example: 507f1f77bcf86cd799439011.
- `show_end_date` (`boolean`, optional): Show lot end date in documents. Only for LOTS products. Example: 2026-01-15.
- `show_start_date` (`boolean`, optional): Show lot start date in documents. Only for LOTS products. Example: 2026-01-15.
- `sku` (`string`, optional): Stock keeping unit code. Example: SKU-1001.
- `stock` (`number`, optional): Initial stock quantity. Example: 10.
- `tags` (`array`, optional): List of tag names. Example: ["priority","2026"].
- `taxes` (`array`, optional): Tax keys applied to this product. Accepts the human tax name (e.g. "IVA 21%") or the internal key (e.g. "s_iva_21"); resolved automatically.
- `variants` (`array`, optional): Variants of the product (for variants, lots and serial numbers product types). Example: [{"price": "100", "sku": "SKU-1001"}].
- `warehouse_id` (`string`, optional): Default warehouse identifier for this product. Example: 507f1f77bcf86cd799439011.
- `weight` (`number`, optional): Weight in account default unit. Example: 1.5.

Example input: `{"for_purchase":true,"for_sale":true,"has_stock":true,"kind":"simple","name":"<name>"}`

### `holded_product_stock_update`

Update Product Stock · Write

Adjust a product's stock in one warehouse by a positive or negative variation.
Returns an empty success response.
Use to correct or move inventory; the change is recorded as a stock movement.
Needs the product ID from holded_products_list and a warehouse ID from holded_warehouses_list.

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

Inputs:

- `product_id` (`string`, required): Product ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.
- `stock_variation` (`number`, required): Stock quantity to add (positive) or remove (negative). Example: 5.
- `warehouse_id` (`string`, required): Warehouse ID. Example: 507f1f77bcf86cd799439011.
- `description` (`string`, optional): Reason for stock change. Example: Consulting services for Q1.
- `variant_id` (`string`, optional): Variant ID (null for simple products). Example: 507f1f77bcf86cd799439011.

Example input: `{"product_id":"<product_id>","stock_variation":5,"warehouse_id":"<warehouse_id>"}`

### `holded_product_update`

Update Product · Write

Update an existing product; only the fields you pass are changed.
Returns the id of the affected record.
Use to edit a product; use the create tool for new records.
Needs the product ID from holded_products_list.

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

Inputs:

- `archived` (`boolean`, required): Whether the product is archived. Example: true.
- `for_purchase` (`boolean`, required): Whether the product is available for purchase. Example: true.
- `for_sale` (`boolean`, required): Whether the product is available for sale. Example: true.
- `name` (`string`, required): Product name. Example: Acme Corp.
- `product_id` (`string`, required): Product ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.
- `barcode` (`string`, optional): Barcode value. Example: 8412345678901.
- `cost` (`string`, optional): Unit cost price as a decimal string. Example: 29.99.
- `description` (`string`, optional): Product description. Example: Consulting services for Q1.
- `exp_account_id` (`string`, optional): Expense/purchases accounting account identifier for this product. Example: 507f1f77bcf86cd799439011.
- `pack_items` (`array`, optional): Items included in this pack product. Sending this field replaces all existing pack items. Example: [{"units": 1}].
- `price` (`string`, optional): Unit sale price as a decimal string. Example: 49.99.
- `purchase_price` (`string`, optional): Unit purchase price as a decimal string. Example: 19.99.
- `sales_channel_id` (`string`, optional): Sales channel identifier for this product. Example: 507f1f77bcf86cd799439011.
- `show_end_date` (`boolean`, optional): Show lot end date in documents. Only for LOTS products. Example: 2026-01-15.
- `show_start_date` (`boolean`, optional): Show lot start date in documents. Only for LOTS products. Example: 2026-01-15.
- `sku` (`string`, optional): Stock keeping unit code. Example: SKU-1001.
- `tags` (`array`, optional): List of tag names. Example: ["priority","2026"].
- `taxes` (`array`, optional): Tax keys applied to this product. Accepts the human tax name (e.g. "IVA 21%") or the internal key (e.g. "s_iva_21"); resolved automatically.
- `variants` (`array`, optional): Variants of the product (for variants, lots and serial numbers product types). Sending this field replaces all existing variants. Example: [{"price": "100", "sku": "SKU-1001", "id": "507f1f77bcf86cd799439011"}].
- `warehouse_id` (`string`, optional): Default warehouse identifier for this product. Example: 507f1f77bcf86cd799439011.
- `weight` (`number`, optional): Weight in account default unit. Example: 1.5.

Example input: `{"archived":true,"for_purchase":true,"for_sale":true,"name":"<name>","product_id":"<product_id>"}`

### `holded_proforma_create`

Create Proforma · Write

Create a proforma invoice in Holded.
Returns the id of the affected record.
Use to create a new proforma invoice for a contact; use holded_document_convert to derive one from an existing document instead.
Needs a contact ID from holded_contacts_list or holded_contact_create.

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

Inputs:

- `contact_id` (`string`, required): Identifier of an existing contact. Example: 507f1f77bcf86cd799439011.
- `items` (`array`, required): Line items to include. Example: [{"name": "Consulting services", "units": 1, "price": 100}].
- `contact_name` (`string`, optional): Name of the contact. Example: Acme Corp.
- `currency` (`string`, optional): ISO 4217 currency code. Example: EUR.
- `currency_change` (`number`, optional): Exchange rate. Example: 1.08.
- `custom_fields` (`array`, optional): Custom field values. Example: [{"field": "Example field", "value": "5000"}].
- `date` (`string`, optional): Issue date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `description` (`string`, optional): Free-text description. Example: Consulting services for Q1.
- `design_id` (`string`, optional): Identifier of the design template to apply to the document. Example: 507f1f77bcf86cd799439011.
- `discount` (`number`, optional): Global discount percentage. Example: 10.
- `due_date` (`string`, optional): Due date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `language` (`string`, optional): ISO 639-1 language code. Example: es.
- `notes` (`string`, optional): Internal notes visible only to your team. Example: Payment due within 30 days.
- `number` (`string`, optional): Custom document number. Use only if you do not want to assign the number via one of the numbering series created in Holded (e.g. to replicate exactly the number from another platform). The value is saved as-is, without correlativity validation. If this field is sent, number_line_id is ignored.  Warning: do not use a value that matches the format of an existing numbering series. The series keeps its own counter regardless of manually assigned numbers -- e.g. if a series is at number 24 and you manually create a document with 27, the series will keep issuing 25, 26, and when it reaches 27 it will try to create a number that already exists: the request will fail and the series will have lost its correlativity and order. If you need custom numbering, use a prefix or format that does not match any active series, or manage every document in that series with number_line_id.
- `number_line_id` (`string`, optional): Identifier of the numbering series used to automatically assign the next correlative number. This is the recommended option, as it preserves the document order and correlativity. If both fields are sent, number takes priority and number_line_id is ignored. Example: 507f1f77bcf86cd799439011.
- `sales_channel_id` (`string`, optional): Identifier of the sales channel. Example: 507f1f77bcf86cd799439011.
- `tags` (`array`, optional): Tags to attach. Example: ["priority","2026"].
- `warehouse_id` (`string`, optional): Identifier of the warehouse. Example: 507f1f77bcf86cd799439011.

Example input: `{"contact_id":"<contact_id>","items":[{"name":"Consulting services","units":1,"price":100}]}`

### `holded_project_create`

Create Project · Write

Create a project in Holded.
Returns the id of the affected record.
Use to add a new project; use the matching list tool first to avoid duplicates.

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

Inputs:

- `name` (`string`, required): Project name. Example: Acme Corp.
- `contact_id` (`string`, optional): Contact ID. Example: 507f1f77bcf86cd799439011.
- `description` (`string`, optional): Project description. Example: Consulting services for Q1.
- `due_date` (`string`, optional): Due date in ISO 8601. Example: 2026-01-15.

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

### `holded_project_time_create`

Create Project Time Entry · Write

Log a time tracking entry on a project.
Returns the id of the affected record.
Use to record hours worked against a project.
Needs the project ID from holded_projects_list.

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

Inputs:

- `duration` (`integer`, required): Duration in seconds. Example: 3600.
- `project_id` (`string`, required): Project ID. Example: 507f1f77bcf86cd799439011.
- `category` (`string`, optional): Category. Example: Development.
- `cost_per_hour` (`string`, optional): Cost per hour. Example: 45.00.
- `date` (`string`, optional): Date in ISO 8601. Example: 2026-01-15.
- `description` (`string`, optional): Description. Example: Consulting services for Q1.
- `task_id` (`string`, optional): Task ID. Example: 507f1f77bcf86cd799439011.
- `user_id` (`string`, optional): User id of the person whose time this is. Required on direct API calls; when omitted, the assistant resolves the acting user automatically. Set it explicitly to log time for another account team member. Example: 507f1f77bcf86cd799439011.

Example input: `{"duration":3600,"project_id":"<project_id>"}`

### `holded_project_update`

Update Project · Write

Update an existing project; only the fields you pass are changed.
Returns the id of the affected record.
Use to edit a project; use the create tool for new records.
Needs the project ID from holded_projects_list.

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

Inputs:

- `project_id` (`string`, required): Project ID. Example: 507f1f77bcf86cd799439011.
- `allow_notifications` (`boolean`, optional): Whether notifications are enabled. Example: true.
- `billable` (`boolean`, optional): Whether the project is billable. Example: true.
- `contact_id` (`string`, optional): Contact ID. Example: 507f1f77bcf86cd799439011.
- `description` (`string`, optional): Project description. Example: Consulting services for Q1.
- `due_date` (`string`, optional): Due date in ISO 8601. Example: 2026-01-15.
- `lists` (`array`, optional): Project lists. Example: [{"id": "507f1f77bcf86cd799439011", "key": "value", "name": "Consulting services"}].
- `name` (`string`, optional): Project name. Example: Acme Corp.
- `start_date` (`string`, optional): Start date in ISO 8601 format (YYYY-MM-DD). Example: 2026-01-01.
- `status` (`integer`, optional): Project status (0–4). Example: 1.
- `tags` (`array`, optional): List of tags. Example: ["priority","2026"].

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

### `holded_purchase_create`

Create Purchase Invoice · Write

Create a purchase invoice in Holded.
Returns the id of the affected record.
Use to create a new purchase invoice for a contact; use holded_document_convert to derive one from an existing document instead.
Needs a contact ID from holded_contacts_list or holded_contact_create.

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

Inputs:

- `contact_id` (`string`, required): Identifier of an existing contact. Example: 507f1f77bcf86cd799439011.
- `items` (`array`, required): Line items to include. Example: [{"name": "Consulting services", "units": 1, "price": 100}].
- `contact_name` (`string`, optional): Name of the contact. Example: Acme Corp.
- `currency` (`string`, optional): ISO 4217 currency code. Example: EUR.
- `currency_change` (`number`, optional): Exchange rate. Example: 1.08.
- `custom_fields` (`array`, optional): Custom field values. Example: [{"field": "Example field", "value": "5000"}].
- `date` (`string`, optional): Issue date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `description` (`string`, optional): Free-text description. Example: Consulting services for Q1.
- `discount` (`number`, optional): Global discount percentage. Example: 10.
- `due_date` (`string`, optional): Payment due date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `language` (`string`, optional): ISO 639-1 language code. Example: es.
- `notes` (`string`, optional): Internal notes visible only to your team. Example: Payment due within 30 days.
- `number` (`string`, optional): Custom document number (e.g. the supplier's invoice reference).
- `payment_method_id` (`string`, optional): Identifier of the default payment method. Example: 507f1f77bcf86cd799439011.
- `tags` (`array`, optional): Tags to attach. Example: ["priority","2026"].
- `warehouse_id` (`string`, optional): Identifier of the warehouse. Example: 507f1f77bcf86cd799439011.

Example input: `{"contact_id":"<contact_id>","items":[{"name":"Consulting services","units":1,"price":100}]}`

### `holded_purchase_order_create`

Create Purchase Order · Write

Create a purchase order in Holded.
Returns the id of the affected record.
Use to create a new purchase order for a contact; use holded_document_convert to derive one from an existing document instead.
Needs a contact ID from holded_contacts_list or holded_contact_create.

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

Inputs:

- `contact_id` (`string`, required): Identifier of an existing contact. Example: 507f1f77bcf86cd799439011.
- `items` (`array`, required): Line items to include. Example: [{"name": "Consulting services", "units": 1, "price": 100}].
- `contact_name` (`string`, optional): Name of the contact. Example: Acme Corp.
- `currency` (`string`, optional): ISO 4217 currency code. Example: EUR.
- `currency_change` (`number`, optional): Exchange rate. Example: 1.08.
- `custom_fields` (`array`, optional): Custom field values. Example: [{"field": "Example field", "value": "5000"}].
- `date` (`string`, optional): Issue date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `description` (`string`, optional): Free-text description. Example: Consulting services for Q1.
- `discount` (`number`, optional): Global discount percentage. Example: 10.
- `due_date` (`string`, optional): Payment due date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `language` (`string`, optional): ISO 639-1 language code. Example: es.
- `notes` (`string`, optional): Internal notes visible only to your team. Example: Payment due within 30 days.
- `number` (`string`, optional): Custom document number (e.g. the supplier's order reference).
- `tags` (`array`, optional): Tags to attach. Example: ["priority","2026"].
- `warehouse_id` (`string`, optional): Identifier of the warehouse. Example: 507f1f77bcf86cd799439011.

Example input: `{"contact_id":"<contact_id>","items":[{"name":"Consulting services","units":1,"price":100}]}`

### `holded_purchase_order_update`

Update Purchase Order · Write

Update an existing purchase order; only the fields you pass are changed.
Returns the id of the affected record.
Use to edit a purchase order; use the create tool for new records.
Needs the purchase order ID from holded_purchase_orders_list.

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

Inputs:

- `purchase_order_id` (`string`, required): Purchase Order ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.
- `date` (`string`, optional): Issue date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `due_date` (`string`, optional): Payment due date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `items` (`array`, optional): Line items to include. Example: [{"name": "Consulting services", "units": 1, "price": 100}].
- `number` (`string`, optional): Custom document number (e.g. the supplier's order reference).

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

### `holded_purchase_payment_create`

Register Purchase Payment · Write

Record a payment against a purchase invoice, reducing its pending balance.
Returns the id of the affected record.
Use to mark a supplier invoice as paid in full or in part; use holded_payment_create for a standalone payment movement.
Needs the purchase invoice ID from holded_purchases_list.

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

Inputs:

- `amount` (`string`, required): Payment amount. Example: 100.00.
- `purchase_id` (`string`, required): Purchase ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.
- `date` (`string`, optional): Payment date in ISO 8601 format. Example: 2026-01-15.
- `description` (`string`, optional): Free-text description of the payment. Example: Consulting services for Q1.
- `treasury_id` (`string`, optional): Identifier of the treasury account. If omitted, the account default treasury is used. Example: 507f1f77bcf86cd799439011.

Example input: `{"amount":"<amount>","purchase_id":"<purchase_id>"}`

### `holded_purchase_update`

Update Purchase Invoice · Write

Update an existing purchase invoice; only the fields you pass are changed.
Returns the id of the affected record.
Use to edit a purchase invoice; use the create tool for new records.
Needs the purchase invoice ID from holded_purchases_list.

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

Inputs:

- `purchase_id` (`string`, required): Purchase ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.
- `date` (`string`, optional): Issue date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `due_date` (`string`, optional): Payment due date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `items` (`array`, optional): Line items to include. Example: [{"name": "Consulting services", "units": 1, "price": 100}].
- `number` (`string`, optional): Custom document number (e.g. the supplier's invoice reference).

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

### `holded_sales_order_create`

Create Sales Order · Write

Create a sales order in Holded.
Returns the id of the affected record.
Use to create a new sales order for a contact; use holded_document_convert to derive one from an existing document instead.
Needs a contact ID from holded_contacts_list or holded_contact_create.

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

Inputs:

- `contact_id` (`string`, required): Identifier of an existing contact. Example: 507f1f77bcf86cd799439011.
- `items` (`array`, required): Line items to include. Example: [{"name": "Consulting services", "units": 1, "price": 100}].
- `contact_name` (`string`, optional): Name of the contact. Example: Acme Corp.
- `currency` (`string`, optional): ISO 4217 currency code. Example: EUR.
- `currency_change` (`number`, optional): Exchange rate. Example: 1.08.
- `custom_fields` (`array`, optional): Custom field values. Example: [{"field": "Example field", "value": "5000"}].
- `date` (`string`, optional): Issue date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `description` (`string`, optional): Free-text description. Example: Consulting services for Q1.
- `design_id` (`string`, optional): Identifier of the design template to apply to the document. Example: 507f1f77bcf86cd799439011.
- `discount` (`number`, optional): Global discount percentage. Example: 10.
- `due_date` (`string`, optional): Expected delivery date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `language` (`string`, optional): ISO 639-1 language code. Example: es.
- `notes` (`string`, optional): Internal notes visible only to your team. Example: Payment due within 30 days.
- `number` (`string`, optional): Custom document number. Use only if you do not want to assign the number via one of the numbering series created in Holded (e.g. to replicate exactly the number from another platform). The value is saved as-is, without correlativity validation. If this field is sent, number_line_id is ignored.  Warning: do not use a value that matches the format of an existing numbering series. The series keeps its own counter regardless of manually assigned numbers -- e.g. if a series is at number 24 and you manually create a document with 27, the series will keep issuing 25, 26, and when it reaches 27 it will try to create a number that already exists: the request will fail and the series will have lost its correlativity and order. If you need custom numbering, use a prefix or format that does not match any active series, or manage every document in that series with number_line_id.
- `number_line_id` (`string`, optional): Identifier of the numbering series used to automatically assign the next correlative number. This is the recommended option, as it preserves the document order and correlativity. If both fields are sent, number takes priority and number_line_id is ignored. Example: 507f1f77bcf86cd799439011.
- `sales_channel_id` (`string`, optional): Identifier of the sales channel. Example: 507f1f77bcf86cd799439011.
- `tags` (`array`, optional): Tags to attach. Example: ["priority","2026"].
- `warehouse_id` (`string`, optional): Identifier of the warehouse. Example: 507f1f77bcf86cd799439011.

Example input: `{"contact_id":"<contact_id>","items":[{"name":"Consulting services","units":1,"price":100}]}`

### `holded_sales_order_update`

Update Sales Order · Write

Update an existing sales order; only the fields you pass are changed.
Returns the id of the affected record.
Use to edit a sales order; use the create tool for new records.
Needs the sales order ID from holded_sales_orders_list.

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

Inputs:

- `sales_order_id` (`string`, required): Sales Order ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.
- `date` (`string`, optional): Issue date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `design_id` (`string`, optional): Identifier of the design template to apply to the document. Example: 507f1f77bcf86cd799439011.
- `due_date` (`string`, optional): Payment due date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `items` (`array`, optional): Line items to include. Example: [{"name": "Consulting services", "units": 1, "price": 100}].

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

### `holded_sales_receipt_create`

Create Sales Receipt · Write

Create a sales receipt in Holded.
Returns the id of the affected record.
Use to create a new sales receipt for a contact; use holded_document_convert to derive one from an existing document instead.
Needs a contact ID from holded_contacts_list or holded_contact_create.

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

Inputs:

- `items` (`array`, required): Line items to include. Example: [{"name": "Consulting services", "units": 1, "price": 100}].
- `body` (`string`, optional): Body text of the sales receipt. Example: Thank you for your business..
- `contact_id` (`string`, optional): Identifier of an existing contact. Optional — when omitted the receipt is created without a linked contact. Example: 507f1f77bcf86cd799439011.
- `contact_name` (`string`, optional): Name of the contact. Example: Acme Corp.
- `currency` (`string`, optional): ISO 4217 currency code. Example: EUR.
- `currency_change` (`number`, optional): Exchange rate. Example: 1.08.
- `custom_fields` (`array`, optional): Custom field values. Example: [{"field": "Example field", "value": "5000"}].
- `date` (`string`, optional): Issue date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `description` (`string`, optional): Free-text description. Example: Consulting services for Q1.
- `design_id` (`string`, optional): Identifier of the design template to apply to the document. Example: 507f1f77bcf86cd799439011.
- `discount` (`number`, optional): Global discount percentage. Example: 10.
- `due_date` (`string`, optional): Expected delivery date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `language` (`string`, optional): ISO 639-1 language code. Example: es.
- `notes` (`string`, optional): Internal notes visible only to your team. Example: Payment due within 30 days.
- `number` (`string`, optional): Custom document number. Use only if you do not want to assign the number via one of the numbering series created in Holded (e.g. to replicate exactly the number from another platform). The value is saved as-is, without correlativity validation. If this field is sent, number_line_id is ignored.  Warning: do not use a value that matches the format of an existing numbering series. The series keeps its own counter regardless of manually assigned numbers -- e.g. if a series is at number 24 and you manually create a document with 27, the series will keep issuing 25, 26, and when it reaches 27 it will try to create a number that already exists: the request will fail and the series will have lost its correlativity and order. If you need custom numbering, use a prefix or format that does not match any active series, or manage every document in that series with number_line_id.
- `number_line_id` (`string`, optional): Identifier of the numbering series used to automatically assign the next correlative number. This is the recommended option, as it preserves the document order and correlativity. If both fields are sent, number takes priority and number_line_id is ignored. Example: 507f1f77bcf86cd799439011.
- `payment_method_id` (`string`, optional): Identifier of the default payment method. Example: 507f1f77bcf86cd799439011.
- `sales_channel_id` (`string`, optional): Identifier of the sales channel. Example: 507f1f77bcf86cd799439011.
- `tags` (`array`, optional): Tags to attach. Example: ["priority","2026"].
- `warehouse_id` (`string`, optional): Identifier of the warehouse. Example: 507f1f77bcf86cd799439011.

Example input: `{"items":[{"name":"Consulting services","units":1,"price":100}]}`

### `holded_service_create`

Create Service · Write

Create a service in Holded.
Returns the id of the affected record.
Use to add a new service; use the matching list tool first to avoid duplicates.

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

Inputs:

- `name` (`string`, required): Service name. Example: Consulting.
- `code` (`string`, optional): Internal reference code. Example: B12345678.
- `color` (`string`, optional): Display color. Example: blue.
- `cost` (`number`, optional): Unit cost price. Example: 50.
- `description` (`string`, optional): Service description. Example: Consulting service.
- `duration` (`number`, optional): Duration in minutes. Example: 3600.
- `price` (`number`, optional): Unit sale price. Example: 100.
- `sales_channel_id` (`string`, optional): Sales channel identifier. Example: 507f1f77bcf86cd799439011.
- `tags` (`array`, optional): List of tag names. Example: ["priority","2026"].
- `tax` (`number`, optional): Tax percentage. Example: 21.
- `taxes` (`array`, optional): List of tax identifiers to apply. Example: ["s_iva_21"].

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

### `holded_service_update`

Update Service · Write

Update an existing service; only the fields you pass are changed.
Returns the id of the affected record.
Use to edit a service; use the create tool for new records.
Needs the service ID from holded_services_list.

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

Inputs:

- `service_id` (`string`, required): Service ID (24-char hex ObjectId). Example: 507f1f77bcf86cd799439011.
- `code` (`string`, optional): Code. Example: B12345678.
- `color` (`string`, optional): Color. Example: blue.
- `cost` (`number`, optional): Cost. Example: 50.
- `description` (`string`, optional): Description. Example: Consulting service.
- `duration` (`number`, optional): Duration. Example: 3600.
- `name` (`string`, optional): Name. Example: Consulting.
- `price` (`number`, optional): Price. Example: 100.
- `sales_channel_id` (`string`, optional): Sales channel id. Example: 507f1f77bcf86cd799439011.
- `tags` (`array`, optional): Tags. Example: ["priority","2026"].
- `tax` (`number`, optional): Tax. Example: 21.
- `taxes` (`array`, optional): Array of tax keys to apply. Retrieve valid keys from GET /api/v2/taxes before setting this field. Example: ["s_iva_21"].

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

### `holded_tag_create`

Create Tag · Write

Create a tag that can be attached to contacts and documents.
Returns name.
Use before tagging records; use holded_tags_list to check existing tags first.

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

Inputs:

- `name` (`string`, required): Name. Example: Acme Corp.

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

### `holded_task_create`

Create Task · Write

Create a task in a project.
Returns the id of the affected record.
Use to add work items to a project.
Needs a project ID from holded_projects_list.

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

Inputs:

- `name` (`string`, required): Task name. Example: Acme Corp.
- `project_id` (`string`, required): Project ID. Example: 507f1f77bcf86cd799439011.
- `assigned_to` (`array`, optional): Assigned user IDs. Example: ["507f1f77bcf86cd799439011"].
- `description` (`string`, optional): Task description. Example: Consulting services for Q1.
- `due_date` (`string`, optional): Due date in ISO 8601. Example: 2026-01-15.
- `priority` (`integer`, optional): Task priority. Example: 1.
- `status` (`string`, optional): Task status. Example: pending.

Example input: `{"name":"<name>","project_id":"<project_id>"}`

### `holded_task_update`

Update Task · Write

Update an existing task; only the fields you pass are changed.
Returns the id of the affected record.
Use to edit a task; use the create tool for new records.
Needs the task ID from holded_tasks_list.

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

Inputs:

- `task_id` (`string`, required): Task ID. Example: 507f1f77bcf86cd799439011.
- `assigned_to` (`array`, optional): Assigned user IDs. Example: ["507f1f77bcf86cd799439011"].
- `description` (`string`, optional): Task description. Example: Consulting services for Q1.
- `due_date` (`string`, optional): Due date in ISO 8601. Example: 2026-01-15.
- `name` (`string`, optional): Task name. Example: Acme Corp.
- `priority` (`integer`, optional): Task priority. Example: 1.
- `project_id` (`string`, optional): Project ID. Example: 507f1f77bcf86cd799439011.
- `status` (`string`, optional): Task status. Example: pending.

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

### `holded_waybill_create`

Create Waybill · Write

Create a waybill in Holded.
Returns the id of the affected record.
Use to create a new waybill for a contact; use holded_document_convert to derive one from an existing document instead.
Needs a contact ID from holded_contacts_list or holded_contact_create.

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

Inputs:

- `contact_id` (`string`, required): Identifier of an existing contact. Example: 507f1f77bcf86cd799439011.
- `items` (`array`, required): Line items to include. Example: [{"name": "Consulting services", "units": 1, "price": 100}].
- `contact_name` (`string`, optional): Name of the contact. Example: Acme Corp.
- `currency` (`string`, optional): ISO 4217 currency code. Example: EUR.
- `currency_change` (`number`, optional): Exchange rate. Example: 1.08.
- `custom_fields` (`array`, optional): Custom field values. Example: [{"field": "Example field", "value": "5000"}].
- `date` (`string`, optional): Issue date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `description` (`string`, optional): Free-text description. Example: Consulting services for Q1.
- `design_id` (`string`, optional): Identifier of the design template to apply to the document. Example: 507f1f77bcf86cd799439011.
- `discount` (`number`, optional): Global discount percentage. Example: 10.
- `due_date` (`string`, optional): Due date in ISO 8601 format. Accepts date (YYYY-MM-DD) or datetime (e.g. 2026-01-15T00:00:00+00:00).
- `is_valued` (`boolean`, optional): Whether the PDF shows line prices and totals. Defaults to the account's waybill preference when omitted. Example: true.
- `language` (`string`, optional): ISO 639-1 language code. Example: es.
- `notes` (`string`, optional): Internal notes visible only to your team. Example: Payment due within 30 days.
- `number` (`string`, optional): Custom document number. Use only if you do not want to assign the number via one of the numbering series created in Holded (e.g. to replicate exactly the number from another platform). The value is saved as-is, without correlativity validation. If this field is sent, number_line_id is ignored.  Warning: do not use a value that matches the format of an existing numbering series. The series keeps its own counter regardless of manually assigned numbers -- e.g. if a series is at number 24 and you manually create a document with 27, the series will keep issuing 25, 26, and when it reaches 27 it will try to create a number that already exists: the request will fail and the series will have lost its correlativity and order. If you need custom numbering, use a prefix or format that does not match any active series, or manage every document in that series with number_line_id.
- `number_line_id` (`string`, optional): Identifier of the numbering series used to automatically assign the next correlative number. This is the recommended option, as it preserves the document order and correlativity. If both fields are sent, number takes priority and number_line_id is ignored. Example: 507f1f77bcf86cd799439011.
- `sales_channel_id` (`string`, optional): Identifier of the sales channel. Example: 507f1f77bcf86cd799439011.
- `tags` (`array`, optional): Tags to attach. Example: ["priority","2026"].
- `warehouse_id` (`string`, optional): Identifier of the warehouse. Example: 507f1f77bcf86cd799439011.

Example input: `{"contact_id":"<contact_id>","items":[{"name":"Consulting services","units":1,"price":100}]}`

## Related

Other Accounting & Finance connectors ([all 37](/agentkit/connectors/?category=accounting-finance)):

- [QuickBooks](/agentkit/connectors/quickbooks/): Scalekit connector, OAuth, 117 tools
- [Xero](/agentkit/connectors/xero/): Scalekit connector, OAuth, 94 tools
- [Stripe](/agentkit/connectors/stripe/): Scalekit connector, Access token, 178 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 |
