canonical: https://jentic.com/apis/holded.com/holded

# Holded API

Holded is an ERP platform for small and medium businesses that bundles invoicing, CRM, project management, team operations, and accounting in one product. The API exposes contacts, products, treasuries (cash and bank accounts), and the related accounting and invoicing resources, so an agent can read and update the same records that the Holded UI does. It is intended for businesses that already operate inside Holded and want to automate finance, CRM, or operational workflows on top of their data.

## For AI agents

Manage contacts, products, treasuries, and invoicing inside a Holded ERP account through the public REST API.

## Scope

Does not handle payment processing, payroll, or banking transaction execution - use for Holded ERP record management (contacts, products, treasuries, invoicing) only.

## Capabilities

- Manage Holded contacts (clients, suppliers) with CRUD operations
- Maintain a product catalog with pricing, codes, and attributes
- Read and create treasuries to represent bank and cash accounts
- Connect CRM records to invoicing for end-to-end revenue tracking
- Coordinate accounting, invoicing, projects, and team data through one API surface

## Use cases

### CRM and Contact Sync

Sales tools and forms keep contact data fresh by pushing to Holded contacts. The API supports list, get, create, update, and delete on contacts so agents can dedupe and merge against existing records. This avoids the duplicate-client problem that plagues teams that maintain CRM records by hand.

Example prompt: Create a Holded contact for 'Acme Inc' with email billing@acme.com and verify no duplicate already exists by name match.

### Product Catalog Automation

E-commerce and operations teams keep their Holded product catalog in sync with their PIM or store backend. The API exposes product list, get, create, and update operations so price and code changes propagate without manual entry. Catalog drift between systems disappears.

Example prompt: Create a Holded product with name 'Widget Pro', code WP-001, and price 49.99 EUR.

### Treasury and Cash Visibility

Finance leads need a daily view of cash across multiple bank and cash accounts. GET `/api/treasuries` lists all configured treasuries, and POST creates new accounts as banking relationships expand. Agents pull this for end-of-day cash dashboards or alerts on low balances.

Example prompt: List all Holded treasuries and return the account names alongside their treasury ids.

### Agent-Run ERP Operations

An AI ops agent connected via Jentic handles routine ERP work: it creates contacts from inbound forms, adds products from spreadsheets, and reconciles treasuries against bank feeds. The Holded key header stays in your Jentic One instance so the agent never holds the credential. End-to-end setup is under an hour because operation schemas load on demand.

Example prompt: From a CSV of new clients, create matching Holded contacts for any not already in the system and report which were created.

## Key endpoints

| Method | Path | Description |
| --- | --- | --- |
| GET | `/api/contacts` | List contacts |
| POST | `/api/contacts` | Create contact |
| GET | `/api/products` | List products |
| POST | `/api/products` | Create product |
| GET | `/api/treasuries` | List treasuries |

## Key resources

- **Contacts** — Clients and suppliers used in CRM and invoicing
- **Products** — Product catalog with pricing and codes
- **Treasuries** — Bank and cash account definitions
- **Invoicing** — Invoice issuance and management
- **CRM** — Customer relationship records
- **Projects** — Project tracking inside Holded
- **Team** — Team and user records
- **Accounting** — Accounting and ledger data

## Why Jentic

- **Setup:** Wiring Holded by hand means setting up its apiKey header auth, keeping the api.holded.com host straight across contacts, products, and treasury endpoints, and handling errors yourself. Through Jentic you install once, import the Holded API from the API Directory, store the key once, and your agent calls it.
- **Permission scoping:** Holded takes the ERP resource in the request body and URL, so scope your agent to the operations it needs, such as reading contacts or creating a product. You decide which calls are in the allowed set, so write operations like creating invoices are excluded unless you add them.
- **Credential handling:** Your Holded key header is stored once, encrypted, by your own Jentic One instance and injected at execution time. It never enters the agent's prompt, logs, or context.
- **Discovery method:** Agents search Jentic by intent such as 'create a contact in Holded' or 'list products', and Jentic returns the matching Holded operation with its input schema so the agent calls the right endpoint without browsing the reference docs.

## Related APIs

- **Xero Accounting API** — Xero is a widely used accounting platform with deep API coverage
- **Stripe API** — Stripe collects payments that flow into Holded invoices and treasuries
- **Quaderno API** — Tax compliance API used alongside ERP invoicing for multi-jurisdiction VAT

## FAQ

### What authentication does the Holded API use?

Holded uses an API key sent in the 'key' header on every request. Through Jentic, the key is stored encrypted in your Jentic One instance and added to the Authorization header at execution time, so the agent never reads the raw value.

### Can I create and update products with the Holded API?

Yes. POST `/api/products` creates a product with name, code, and price; PUT `/api/products/{id}` updates fields on an existing product; DELETE `/api/products/{id}` removes one. Use GET `/api/products` to enumerate the catalog before deciding which operation to call.

### What are the rate limits for the Holded API?

Holded does not publish hard rate limits in its OpenAPI spec. Treat the API as moderate-volume - keep request rates below a few per second per account and back off on 429 responses, especially when batch-syncing contact or product data.

### How do I create a Holded contact through Jentic?

Search Jentic for 'create holded contact', load POST `/api/contacts`, and execute with name, email, and any classification fields. Run pip install jentic and use the async SearchRequest, LoadRequest, ExecutionRequest pattern.

### Does the Holded API expose treasuries (bank accounts)?

Yes. GET `/api/treasuries` lists existing treasuries (cash and bank account definitions), GET `/api/treasuries/{id}` retrieves a single one, and POST `/api/treasuries` creates new treasuries. Use these to map Holded accounts to external bank feeds.

### Can I limit what my agent is allowed to do with the Holded API?

Yes. Because Jentic One is self-hosted, you define the rules that decide which Holded operations and credentials your agent may use. You can allow only the calls it needs, such as GET `/api/contacts` to read contacts or POST `/api/products` to create a product, and leave everything else out of the allowed set. Write operations like creating invoices or new treasuries stay excluded until you explicitly add them.
