canonical: https://jentic.com/apis/milkee.ch/milkee

# Milkee Ch MILKEE API

Jentic publishes the only available OpenAPI specification for MILKEE API, keeping it validated and agent-ready. MILKEE is an all-in-one accounting tool aimed at Swiss freelancers and small businesses; the v2 REST API exposes 29 endpoints to manage bookings, accounts, contacts, customers, quotes, products, projects, invoices, tax rates, tags, tasks, and time tracking. Authentication is by bearer token created in MILKEE settings, and the resource model uses the original German nouns (Buchungen, Konten, Kontakte, Kunden, Offerten, Rechnungen, Steuersaetze).

## For AI agents

Manage Swiss accounting workflows in MILKEE - bookings, invoices, customers, quotes, products, projects, and time tracking - via a bearer-token REST API.

## Scope

Does not handle payment processing, payroll, or bank account aggregation - use for Swiss small-business accounting workflows (bookings, invoices, customers, products, time) only.

## Capabilities

- Create and list ledger bookings (Buchungen) for accurate Swiss double-entry accounting
- Maintain a chart of accounts (Konten) used to categorise bookings
- Manage customer (Kunden) and contact (Kontakte) records that anchor invoices and quotes
- Issue and update invoices (Rechnungen) and quotes (Offerten) for client work
- Track products and tax rates (Steuersaetze) used inside invoice line items
- Bulk import bookings via the dedicated import endpoint to onboard historical data
- Record time entries against projects and tasks for billable time reporting

## Use cases

### Automated Invoice Issuance

When a project milestone closes, an agent reads the customer and product data from MILKEE and creates an invoice (Rechnung) with the correct VAT rate. The accountant skips manual data entry, and the invoice is ready for review and dispatch directly from MILKEE.

Example prompt: Look up the customer by id, then POST to the Rechnungen endpoint with line items priced from the products list and the standard 8.1% VAT rate.

### Booking Import From a Bank Export

Freelancers paste a bank CSV into a workflow that an agent maps onto MILKEE bookings. The import endpoint accepts the batch in one call so the ledger is reconciled with the bank in minutes rather than hours of manual entry.

Example prompt: POST /import-buchungen with the parsed bank statement rows, each mapped to debit and credit accounts from the Konten list.

### Time Tracking to Invoice Pipeline

An agent rolls up time entries logged against projects and tasks into draft invoice lines, applying the customer's hourly rate. The freelancer reviews the draft in MILKEE and dispatches the invoice without re-keying any time data.

Example prompt: Aggregate time entries for project id 'X' over the last month and create an invoice with one line per task summing the recorded hours at the configured rate.

### Customer Sync With a CRM

When a deal closes in a CRM, an agent creates the matching customer (Kunde) in MILKEE so invoicing flows downstream. Address, email, and tax information all carry across, eliminating duplicate data entry.

Example prompt: On CRM deal won, POST to the Kunden endpoint with the customer's name, address, email, and VAT id.

### Agent-Driven Accounting via Jentic

Through Jentic, an agent issues MILKEE calls using semantic search rather than reading German-named endpoints. The bearer token sits in your Jentic One instance and is injected on each request, so an agent automates Swiss accounting workflows without ever holding a credential.

Example prompt: Use Jentic search 'create a booking in milkee', load the schema for POST /buchungen, and execute with debit account, credit account, amount, and date.

## Key endpoints

| Method | Path | Description |
| --- | --- | --- |
| GET | `/buchungen` | List bookings |
| POST | `/buchungen` | Create a booking |
| POST | `/import-buchungen` | Import a batch of bookings |
| GET | `/konten` | List accounts |
| GET | `/kontakte` | List contacts |
| GET | `/buchungen/{id}` | Get a booking |
| PUT | `/buchungen/{id}` | Update a booking |

## Key resources

- **Buchungen (Bookings)** — Create and manage ledger bookings
- **Konten (Accounts)** — Manage the chart of accounts
- **Kontakte / Kunden (Contacts / Customers)** — Manage contact and customer records
- **Rechnungen (Invoices)** — Create and manage invoices
- **Offerten (Quotes)** — Manage customer quotes
- **Produkte (Products)** — Maintain the product catalog used on invoices
- **Steuersaetze (Tax Rates)** — Manage VAT and other tax rates
- **Projekte / Tasks / Time** — Track projects, tasks, and time entries

## Why Jentic

- **Setup:** Wiring MILKEE by hand means handling its bearer auth against app.milkee.ch and mapping the German-named booking, invoice, and contact endpoints yourself. Through Jentic you install once, import MILKEE from the API Directory, store the token once, and your agent calls it.
- **Permission scoping:** MILKEE puts the booking id in the URL path (`/buchungen/{id}`), so a rule can pin your agent to reading and updating a specific booking. You choose the operations it may call, so a destructive one like updating an existing booking is not included unless you add it.
- **Credential handling:** Your MILKEE bearer token is stored once, encrypted, by your own Jentic One instance and injected into the Authorization header at execution time. It never enters the agent's prompt, logs, or context.
- **Discovery method:** Agents search Jentic by intent such as 'create a booking in MILKEE' or 'list accounts', and Jentic returns the matching MILKEE operation with its input schema so the agent calls POST /buchungen without parsing the German-named docs.

## Related APIs

- **Xero Accounting API** — Cloud accounting platform with broad international and multi-currency support.
- **Bexio API** — Swiss SMB accounting and ERP platform with overlapping invoicing and bookkeeping features.
- **HubSpot CRM Contacts API** — CRM that feeds new customers into MILKEE's Kunden records.

## FAQ

### Why is there no official OpenAPI spec for MILKEE API?

MILKEE does not publish an OpenAPI specification. Jentic generates and maintains this spec so that AI agents and developers can call MILKEE API via structured tooling. It is validated against the live API and kept up to date. Get started with Jentic One, the self-hosted execution layer.

### What authentication does the MILKEE API use?

The API uses bearer token authentication. Generate an API token in your MILKEE settings and pass it as Authorization: Bearer <token>. Through Jentic, the bearer token sits in the encrypted vault and is injected per request without entering the agent's context.

### Can I import a batch of bookings into MILKEE?

Yes. POST /import-buchungen accepts a batch of bookings in one call, which is the supported way to load historical bank or accounting data without making one request per row.

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

MILKEE does not publish public rate limits in the spec. Treat the API as rate-limited per token, back off on HTTP 429 responses, and contact support@milkee.ch when running large batch imports.

### How do I create a booking through Jentic?

Run pip install jentic, search for 'create a booking in milkee', load the schema for POST /buchungen, and execute with debit account, credit account, amount, and date. Jentic injects your stored bearer token automatically.

### Why are the resource names in German?

MILKEE is a Swiss product and the API uses the German accounting nouns its users already know: Buchungen (bookings), Konten (accounts), Kunden (customers), Offerten (quotes), Rechnungen (invoices), Steuersaetze (tax rates). The fields inside requests use the same naming.

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

Yes. Because you run Jentic One self-hosted, your own rules decide which MILKEE operations and credentials your agent may use, so you can grant read-only calls like GET /buchungen and GET /konten while withholding a destructive one such as PUT `/buchungen/{id}` unless you add it. Since MILKEE puts the booking id in the URL path, you can pin the agent to reading or updating a specific booking rather than the whole ledger. Your bearer token is injected at execution time under those rules, so the agent only ever calls the endpoints you have allowed.
