[Cotlet](https://cotlet.dev/index.md) · [Integrations](https://cotlet.dev/integrations.md) · [How it works](https://cotlet.dev/how-it-works.md) · [Use cases](https://cotlet.dev/use-cases.md) · [Security](https://cotlet.dev/security.md) · [For developers](https://cotlet.dev/for-developers.md) · [For automation agencies](https://cotlet.dev/for-agencies.md) · [Blog](https://cotlet.dev/blog.md) · [API docs](https://cotlet.dev/docs.md) · [Help center](https://cotlet.dev/help.md) · [Changelog](https://cotlet.dev/changelog.md) · [Contact](https://cotlet.dev/contact.md) · [Pricing](https://cotlet.dev/pricing.md) · [Sign up](https://cotlet.dev/signup)

# Record supplier bills in Holded as purchases

> Enter supplier bills as Holded purchases with the right supplier, document number and expense account, skipping duplicates and saving drafts.

Source: https://cotlet.dev/integrations/holded-api-mcp-server/record-supplier-bills

Supplier bills pile up in an inbox and a folder, and each one still needs a purchase in Holded with the supplier, its own document number, the lines and an expense account.

Cotlet does it in your own Holded account with list\_contacts, create\_contact, list\_purchases and create\_purchase, called by your AI agent, an n8n workflow or a script.

[Sign up free](https://cotlet.dev/app/signup?app=holded) [All Holded tools](https://cotlet.dev/integrations/holded-api-mcp-server.md)

Hosted · nothing to install or maintain

## Can Holded do this on its own?

Holded has an API for purchases on paid plans, and Zapier has a Create Purchase Invoice action (checked 14 Oct 2026). Holded has no rule that records a bill as a purchase for you, and it has no official MCP server.

## How you do it in Holded today

1. In Holded you open Expenses > Expenses and click New Purchase, or press N.
2. You select the supplier, or type a name and click + Add, then enter the document number the supplier printed on the bill. The internal number fills in from your Billing preferences.
3. You set the due date, and optionally a deduction date, which controls the tax period for the deduction.
4. You attach the file, add the concept, description, amounts, prices and taxes, and assign the expense account so the purchase reaches the ledger.
5. You click Save to approve it or Save as Draft, and Holded creates the accounting entry for the purchase.
6. Vouchers can also reach an Inbox email address you set under Settings, but turning each one into a purchase is still a manual step.

## How to record supplier bills in Holded as purchases

Prompt

```
Record these supplier bills in Holded as purchases with the expense account I named for each one. Skip any bill whose supplier document number is already in Holded and save the rest as drafts.
```

1. 01  
### Find or add the supplier  
list\_contacts looks for the supplier by name or tax ID. If none exists, the agent calls create\_contact with type supplier, using only the details on the bill.
2. 02  
### Check for a duplicate  
list\_purchases is searched for the same supplier and the same supplier document number. A bill that is already there is skipped and named in the report, so a bill sent twice is recorded once.
3. 03  
### Apply your account rules  
Each line gets the expense account from your prompt, for example "software" to the account you name. A bill that fits no rule is saved as a draft with no account and listed for you.
4. 04  
### Keep the dates apart  
The bill date, due date and deduction date are set separately, because the deduction date moves the bill into another tax period. The agent leaves the deduction date empty unless you give one.
5. 05  
### Save as draft, approve on request  
create\_purchase runs with approve false and the file attached when you supply a link. Approving is a second call that asks for your OK by default.

### What you get back

Example data

```
Bills in the batch: 9
Recorded as drafts: 6
- Fastcloud Hosting, bill 88213: 49.00 + tax 10.29 = 59.29, account Software
- Print & Pack, bill 4410: 120.00 + tax 25.20 = 145.20, account Office supplies
Skipped as duplicates: 2 (bill 88101, bill 3977)
Needs you: 1 bill with no matching account rule
Approved: 0
```

### Other ways to ask

- Record the attached supplier bills as purchases with a due date of 30 days after the bill date.
- Every Monday, list purchases from last week that are still drafts so I can approve them.
- Add Fastcloud Hosting as a supplier and record its three monthly bills with the account Software.

## What Holded allows, and what to know first

- Holded asks for the supplier's own document number and creates a separate internal number from your Billing preferences.
- Holded needs an expense account on every purchase invoice, and the accounts you can pick come from Group 6 (Purchases and Expenses).
- A deduction date on a Holded purchase controls the tax period for the deduction, not the bill date.
- Holded generates an accounting entry automatically for each purchase document.
- Holded purchases can carry a different currency, and a different currency uses today's exchange rate unless you edit it.

create\_purchase asks for your OK by default. To run it weekly without you, switch confirmation off for that tool in your dashboard.

Sources: [Holded Help: Create a purchase invoice](https://help.holded.com/en/articles/6899680-create-a-purchase) · [Holded Help: Expenditure, a start-up guide](https://help.holded.com/en/articles/6959537-expenditure-a-start-up-guide) · [Holded on Zapier: triggers and actions](https://zapier.com/apps/holded/integrations)

## Call create\_purchase from a script

curl

```
curl -X POST https://cotlet.dev/api/v1/holded/contacts/c_a7731e/purchases \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"document_number":"88213","date":"2026-10-09","due_date":"2026-11-08","items":[{"name":"Cloud hosting, October","description":"Hosting plan","units":1,"price":49,"tax":"VAT 21%","account":"Software"}],"approve":false}'
```

Example response

```
{
"purchase_id": "pu_5e17",
"supplier": "Fastcloud Hosting",
"document_number": "88213",
"status": "draft",
"subtotal": 49,
"tax_total": 10.29,
"total": 59.29,
"currency": "EUR",
"due_date": "2026-11-08"
}
```

MCP: add https://cotlet.dev/mcp/v1 with the same key; the call is holded\_write → create\_purchase. Example data.

[Schedule it in n8n, Make, Zapier or cron](https://cotlet.dev/integrations/holded-api-mcp-server.md#automations)

## Holded tools this automation uses

__Cotlet Holded tools used to record supplier bills in Holded as purchases__
| Tool | Parameters |
| ---------------- | ------------------------------------------------------------------------------------------------ |
| list\_contacts | search, type, limit, cursor |
| create\_contact | name, type, email, tax\_id |
| list\_purchases | contact\_id, document\_number, since, limit, cursor |
| create\_purchase | contact\_id, document\_number, items, date, due\_date, deduction\_date, attachment\_url, approve |

[All 12 Holded tools with descriptions](https://cotlet.dev/integrations/holded-api-mcp-server.md#tools)

## Frequently asked questions

### Is it safe to connect Holded to Cotlet?

Yes. You sign in to Holded yourself, in your own Cloud Browser in the EU, and we never save your password. Your agents only get Holded once you enable it, every background request is listed, and the browser profile is stored encrypted with AES-256-GCM, the cipher 1Password uses for its vaults. The AI model never sees a login, posts and messages wait for your OK, and Disable for agents cuts access in one click. Independent scanners grade cotlet.dev A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory; live results are on https://cotlet.dev/security.

## More Holded automations

- [Draft and send Holded invoices from a job list](https://cotlet.dev/integrations/holded-api-mcp-server/draft-and-send-invoices.md)
- [Chase unpaid Holded invoices with a reminder](https://cotlet.dev/integrations/holded-api-mcp-server/chase-unpaid-invoices.md)
- [Holded API and MCP server: every tool](https://cotlet.dev/integrations/holded-api-mcp-server.md)
- [All use cases](https://cotlet.dev/use-cases.md)

## Give your agent access to Holded.

Free 7-day trial with 2,000 credits, no card needed. Cotlet is independent and not affiliated with Holded.

[Sign up free](https://cotlet.dev/app/signup?app=holded)

---

Give your AI agents your signed-in browser.

**Product:** [Integrations](https://cotlet.dev/integrations.md) · [Use cases](https://cotlet.dev/use-cases.md) · [How it works](https://cotlet.dev/how-it-works.md) · [Pricing](https://cotlet.dev/pricing.md) · [Security](https://cotlet.dev/security.md)

**Resources:** [Blog](https://cotlet.dev/blog.md) · [API docs](https://cotlet.dev/docs.md) · [Help center](https://cotlet.dev/help.md) · [Changelog](https://cotlet.dev/changelog.md) · [GitHub](https://github.com/cotletdev/cotlet)

**Solutions:** [For developers](https://cotlet.dev/for-developers.md) · [For automation agencies](https://cotlet.dev/for-agencies.md)

**Company:** [About](https://cotlet.dev/about.md) · [AI info: company facts](https://cotlet.dev/ai-info.md) · [Contact](https://cotlet.dev/contact.md)

**Legal:** [Terms of service](https://cotlet.dev/terms) · [Privacy policy](https://cotlet.dev/privacy) · [Refund policy](https://cotlet.dev/refunds) · [Acceptable use](https://cotlet.dev/acceptable-use) · [Cookie policy](https://cotlet.dev/cookies) · [DPA](https://cotlet.dev/dpa) · [Subprocessors](https://cotlet.dev/subprocessors)

**Elsewhere:** [Status page](https://status.cotlet.dev) · [Cotlet on GitHub](https://github.com/cotletdev) · [Cotlet on X](https://x.com/cotletdev) · [Cotlet on LinkedIn](https://www.linkedin.com/company/cotletdev) · [Cotlet on Product Hunt](https://www.producthunt.com/products/cotlet) · [Cotlet on Crunchbase](https://www.crunchbase.com/organization/cotlet) · [Cotlet on SaaSHub](https://www.saashub.com/cotlet)

Cotlet is an independent service. It is not affiliated with, endorsed by or sponsored by any of the products listed on this site. Product names are trademarks of their respective owners.

## For AI agents: sign your user up

Is your user asking you to sign them up for Cotlet? You can do it for them, no account or key needed.

1. Read the fields and their allowed values: GET https://cotlet.dev/api/v1/access-requests
2. Ask the user for each value: email, apps, what you will do with them. If they leave the password to you, generate a strong one and show it to them.
3. Show the user what you will send, then POST it as JSON to https://cotlet.dev/api/v1/access-requests.

One call creates the account and sends the access request; we email the user when access is granted.
