Create invoice
Create a sales invoice as a draft, or approve it right away.
MCP tool holded_write → create_invoice
Creates one sales invoice for a contact. With approve false, the default, it is saved as a draft you can still edit. With approve true it is approved, and an approved Holded invoice cannot be edited or deleted, only voided. The number comes from your Invoicing preferences, and the date defaults to today. Due date is one date. Taxes use the tax names in your account. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| contact_id string required | string | Contact ID from list_contacts. |
| items array required | array | Lines of the document. Each line has name, description, units, price and tax (the tax as named in Holded). Optional discount in percent per line. Use a product from list_products or a new name. |
| date date | date | Invoice date. Default: today. |
| due_date date | date | Due date. |
| message string | string | Text shown at the bottom of the invoice. |
| approve boolean | boolean | true approves the invoice, false saves a draft. Default: false. |
tools/call
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "holded_write",
"arguments": {
"operation": "create_invoice",
"arguments": {
"contact_id": "c_5f2a91",
"items": [
{
"name": "Consulting",
"description": "Landing page review, week 42",
"units": 10,
"price": 80,
"tax": "VAT 21%"
}
],
"due_date": "2026-11-14",
"approve": false
}
}
}
} Example response
{
"content": [
{
"type": "text",
"text": "{ ... same JSON as structuredContent ... }"
}
],
"structuredContent": {
"invoice_id": "inv_7d31",
"number": "INV-0045",
"status": "draft",
"contact": "Northwind Studio",
"subtotal": 800,
"tax_total": 168,
"total": 968,
"currency": "EUR",
"due_date": "2026-11-14"
},
"isError": false
}