# Moniary > Moniary is Czech accounting software for small companies and sole traders (OSVČ): received and issued invoices, AI document extraction, bank transactions and payment matching, VAT filings and income tax. Its public API and the `moniary` command line let scripts and AI agents do the same work as the app, as the key's user in one workspace. ## Ways to connect - **MCP server:** `https://moniary.com/api/mcp` (Streamable HTTP). Sign in with a Moniary account over OAuth and pick the workspaces to share; no API key needed. Best for chat clients and agents that speak MCP. Tools cover invoices, issued invoices, payments, bank transactions, contacts, tags and VAT previews; settings, deletes and sending payment orders stay in the app. - **API:** every action is called as `POST https://moniary.com/api/v1/actions/` with `Authorization: Bearer ` and a JSON body; the result is in `data`. Documents upload through `POST https://moniary.com/api/v1/uploads`. - **CLI:** `npx @moniary/cli login`, then `moniary actions`, `moniary run ` and `moniary upload `. Prefer read-only API keys, and ask the user before actions that issue, send or pay (API access `confirm`). # API > Connect your own scripts, systems and AI agents to Moniary. The Moniary API reads and edits documents, issues and sends invoices, matches payments and uploads documents for AI extraction. Every request runs as you, in one company, with the same permissions you have in the app. ## At a glance | Item | Value | | -------------- | ----------------------------------------------------------------------------------------------------------------- | | Base URL | `https://moniary.com/api/v1` | | Authentication | `Authorization: Bearer ` | | Format | JSON, UTF-8 | | Rate limit | 300 requests a minute per key | | Reference | [API reference](/api-reference), machine-readable as [`/api/v1/openapi.json`](/api/v1/openapi.json) (OpenAPI 3.1) | ## Your first request Create an API key in **Settings → API and CLI** (see [API keys and sign-in](/docs/api-klice)) and check it works: ```bash curl https://moniary.com/api/v1/me \ -H "Authorization: Bearer $MONIARY_API_KEY" ``` ```json { "key": { "id": "…", "name": "Export", "prefix": "mny_RTE5jErA", "scope": "read" }, "user": { "id": "…", "email": "jana@example.com" }, "workspace": { "id": "…", "name": "Example s.r.o." } } ``` Then run your first action, for example totals of your received documents: ```bash curl -X POST https://moniary.com/api/v1/actions/invoices.getInvoiceStats \ -H "Authorization: Bearer $MONIARY_API_KEY" ``` Prefer the terminal? The [CLI](/docs/cli) signs in through your browser and does the same in one line. ## How the API works The API is built from **actions** such as `invoices.getInvoiceStats`, `tags.create` or `issuedInvoices.issueInvoice`. They are all called the same way: `POST /actions/` with the input as a JSON body, and the result comes back in `data`. See [Actions](/docs/api-akce). Besides actions there are a few fixed endpoints: `GET /me`, action discovery, [document uploads](/docs/api-nahravani-dokladu) and the [CLI](/docs/cli) sign-in. The [API reference](/api-reference) describes every endpoint, generated from a single OpenAPI document. ## Stability Actions are stable. We don't rename them or change their input in a way that breaks your code. New actions and optional fields are added over time. If a breaking change is ever unavoidable, we announce it in advance. ## What the API covers Received and issued documents, contacts, bank transactions, tags, categories, and previews of the VAT return (přiznání k DPH), VAT control statement (kontrolní hlášení) and EC sales list (souhrnné hlášení). More areas will follow. Deleting, buying credit, managing keys and company settings stay in the app. --- # CLI > Install the moniary command, sign in through your browser and work with Moniary from the terminal, scripts, CI and AI agents. `moniary` is the Moniary command line tool. It finds and runs API actions, uploads documents for extraction and waits for the result. It prints JSON, so it works well with tools like `jq` and with AI agents. ## Install You need [Node.js](https://nodejs.org) 20 or newer. ```bash npm install -g @moniary/cli moniary --version ``` To try it without installing: ```bash npx @moniary/cli login ``` Run `npm install -g @moniary/cli` again to update. ## Sign in ```bash moniary login ``` Your browser opens. Sign in to Moniary, pick the company and the access level (**Read** or **Read and write**) and click **Allow access**. The CLI gets its own key called "CLI (your computer's name)". You'll find it in **Settings → API and CLI**, where you can revoke it at any time. Check who you're signed in as: ```bash moniary whoami ``` ```json { "key": { "name": "CLI (macbook)", "prefix": "mny_RTE5jErA", "scope": "write" }, "user": { "email": "jana@example.com" }, "workspace": { "name": "Example s.r.o." } } ``` On a server without a browser, run `moniary login --no-browser` and open the printed link on another device. Or pass a key you created in the app: ```bash moniary login --key mny_… echo "$MONIARY_API_KEY" | moniary login ``` The sign-in is saved in `~/.config/moniary/cli.json`, readable only by you. To work with another company, sign in again and pick it. `moniary logout` removes the saved sign-in from your computer; the key itself stays valid until you revoke it in the app. ## Commands | Command | What it does | | --------------------------------------------------- | ----------------------------------- | | `moniary login` | Sign in through the browser | | `moniary whoami` | Show the key, user and company | | `moniary actions [search] [--area ] [--json]` | List the actions your key can run | | `moniary describe ` | Show an action and its input schema | | `moniary run [json\|-] [key=value …]` | Run an action and print the result | | `moniary upload [--wait]` | Upload documents for extraction | | `moniary uploads ` | Show extraction progress | | `moniary logout` | Remove the saved sign-in | | `moniary --version`, `moniary --help` | Version and help | ## Run actions Find an action and look at its input: ```bash moniary actions invoice moniary describe invoices.getInvoiceStats ``` Run it. Pass the input as JSON, as `key=value` pairs, or on standard input: ```bash moniary run invoices.getInvoiceStats moniary run invoices.getInvoiceStats '{"filter": {"overdue": true}}' moniary run tags.create name="Fuel" color='"#3b82f6"' cat draft.json | moniary run issuedInvoices.saveDraft - ``` A `key=value` value is read as JSON when possible (`pageSize=20` is a number, `overdue=true` a boolean) and as text otherwise. Every action and its input is in the [API reference](/api-reference). ## Upload documents ```bash moniary upload invoice.pdf receipts/*.jpg moniary upload invoice.pdf --wait ``` With `--wait`, the CLI waits until the documents are extracted (up to 10 minutes) and prints the result, including the numbers of the documents it created. Without it, it prints an `uploadSessionId` you can check later: ```bash moniary uploads On3iHRaS2JhErPH2Ai ``` Supported files and limits are on the [Uploading documents](/docs/api-nahravani-dokladu) page. ## Scripts and CI In scripts and CI, don't sign in through the browser. Create a key in the app and pass it in an environment variable: ```bash export MONIARY_API_KEY=mny_… moniary run invoices.getOverdueInvoices | jq '.[].invoiceNumber' ``` | Variable | Meaning | | ----------------- | ---------------------------------------------------------- | | `MONIARY_API_KEY` | The key; takes precedence over the saved sign-in | | `MONIARY_API_URL` | Another API address (default `https://moniary.com/api/v1`) | Results go to standard output and errors to standard error. The exit code is `0` on success, `1` when the API returns an error (such as invalid input or a missing permission) and `2` when the command is used incorrectly. ## With AI agents Agents such as Claude Code, Codex or Cursor can use the CLI on their own. See [For AI agents](/docs/pro-ai-agenty). --- # API keys and sign-in > Create an API key, choose its access, sign in the CLI and revoke keys you no longer need. ## Create an API key 1. Open **Settings → API and CLI**. 2. Click **Create key** and fill in a name (for example "Spreadsheet export"), the access and the expiry. 3. Copy the key right away. Moniary stores only a fingerprint of it, so it can't show it again. Keys start with `mny_` and go in the request header: ```http Authorization: Bearer mny_… ``` ## Access | Access | What the key can do | | ------------------ | --------------------------------------------------------------- | | **Read** | Only actions that read data. It changes nothing. | | **Read and write** | Also upload, edit, issue and send documents and match payments. | An action the key isn't allowed to run returns `403 INSUFFICIENT_SCOPE`. For reports, exports and AI agents that only answer questions, use a read key. ## Who a key belongs to - A key acts as you, and only in the company (workspace) where you created it. Create another key for another company. - It always has your current permissions. If your role changes, so does what the key can do. - If you leave the company, the key stops working. - Everyone sees and manages only their own keys. You can have up to 20 active keys per company. ## Sign in the CLI `moniary login` opens your browser. Sign in, pick the company and the access and click **Allow access**. The CLI then gets its own key called "CLI (your computer's name)". It appears in your list of keys and you revoke it like any other. More on the [CLI](/docs/cli) page. The sign-in uses OAuth with PKCE: the browser passes a one-time code only to the CLI on your computer (`127.0.0.1`). The code is valid for 10 minutes and works once. ## Revoke a key In the list of keys, click **Revoke** next to the key. It stops working immediately. If a key leaks (for example into a repository), revoke it and create a new one. ## Security - Don't put keys in code or in a browser. Keep them in an environment variable or a secrets manager. - Give each script or service its own key with a clear name. The **Last used** column then shows which keys are still in use. - For one-off jobs, set the key to expire after 30 or 90 days. --- # Actions > Find an action, read its input schema and run it. Request and response format. An action is one Moniary operation, such as "list tags" or "issue an invoice". Action names look like `area.method` (`tags.getAll`, `issuedInvoices.issueInvoice`). ## Find an action ```bash curl "https://moniary.com/api/v1/actions?q=invoice" \ -H "Authorization: Bearer $MONIARY_API_KEY" ``` This lists the actions your key can run. Filter by text (`q`) or area (`area`, for example `area=bankTransactions`). ```json { "actions": [ { "name": "invoices.getInvoiceStats", "area": "invoices", "access": "read", "description": "Totals and counts of documents for an optional filter (amounts, paid/unpaid, overdue)." } ] } ``` `access` is `read`, `write` or `confirm`. Both `write` and `confirm` need a read-and-write key; `confirm` marks bigger changes that reach outside Moniary, such as sending an invoice. ## Read the input ```bash curl https://moniary.com/api/v1/actions/invoices.getInvoiceStats \ -H "Authorization: Bearer $MONIARY_API_KEY" ``` The response includes `input`, the JSON schema of the input (draft 2020-12). Actions without input have `input: null`. Send dates and times as ISO 8601 strings (`2026-10-01` or `2026-10-01T08:00:00Z`). ## Run an action Send the input as a JSON object in the body. If every field is optional, you can leave the body out. ```bash curl -X POST https://moniary.com/api/v1/actions/tags.create \ -H "Authorization: Bearer $MONIARY_API_KEY" \ -H "Content-Type: application/json" \ -d '{"name": "Fuel", "color": "#3b82f6"}' ``` The result is always in `data`: ```json { "data": { "id": "er48wdjdsd3zacfkye1vgmgb", "name": "Fuel", "color": "#3b82f6" } } ``` ## Examples Unpaid received documents past their due date: ```bash curl -X POST https://moniary.com/api/v1/actions/invoices.getOverdueInvoices \ -H "Authorization: Bearer $MONIARY_API_KEY" ``` Unmatched bank transactions: ```bash curl -X POST https://moniary.com/api/v1/actions/bankTransactions.list \ -H "Authorization: Bearer $MONIARY_API_KEY" \ -H "Content-Type: application/json" \ -d '{"matchStatus": ["UNMATCHED"], "pageSize": 20}' ``` The exact input of every action is in the [API reference](/api-reference) and at `GET /actions/`. ## Paging Lists page the same way the app does: some take `page` and `pageSize`, others `limit` and `cursor`. Always follow the input schema of the action. --- # Uploading documents > Upload received invoices and receipts through the API and follow their extraction. Documents uploaded through the API go through the same AI extraction as documents uploaded in the app. In **Uploaded files** their source is **API**. Uploading needs a key with **Read and write** access. Supported files: PDF, images (JPG, PNG, WEBP, HEIC), Word, Excel, OpenDocument and RTF. Up to 20 files at once, each up to 20 MB. ## Small files: one request For up to about 4 MB per request, send the files as `multipart/form-data` in `file` fields: ```bash curl https://moniary.com/api/v1/uploads \ -H "Authorization: Bearer $MONIARY_API_KEY" \ -F file=@invoice.pdf \ -F file=@receipt.jpg ``` ```json { "uploadSessionId": "On3iHRaS2JhErPH2Ai", "documents": [ { "fileName": "invoice.pdf", "path": "…/uploads/invoices/srprbuxP_mon_invoice.pdf" } ] } ``` ## Large files: signed upload URLs 1. Ask for upload URLs: ```bash curl https://moniary.com/api/v1/uploads \ -H "Authorization: Bearer $MONIARY_API_KEY" \ -H "Content-Type: application/json" \ -d '{"files": [{"fileName": "invoice.pdf", "contentType": "application/pdf", "size": 8123456}]}' ``` 2. `PUT` each file to its `uploadUrl` (without the Authorization header): ```bash curl -X PUT "$UPLOAD_URL" -H "Content-Type: application/pdf" --data-binary @invoice.pdf ``` 3. Complete the upload with the `fileName` and `path` from step 1: ```bash curl https://moniary.com/api/v1/uploads/$SESSION/complete \ -H "Authorization: Bearer $MONIARY_API_KEY" \ -H "Content-Type: application/json" \ -d '{"documents": [{"fileName": "invoice.pdf", "path": "…"}]}' ``` Extraction starts only after this step. The CLI (`moniary upload`) does all three steps for you. ## Extraction progress ```bash curl https://moniary.com/api/v1/uploads/$SESSION \ -H "Authorization: Bearer $MONIARY_API_KEY" ``` While the files wait in the queue, `data` is `null`. Then it returns totals (`totalFiles`, `activeFiles`, `completedFiles`, `failedFiles`) and, for each file, its parts (`parts`) with the result: `status`, the `invoiceId` and `invoiceNumber` of the created document, or a `rejectionReason` or `reviewIssues`. A file with several documents is split into several parts. Extraction usually takes tens of seconds. Don't check more often than every few seconds. Then load the document with the `invoices.getInvoiceById` action. Extraction is billed the same way as for documents uploaded in the app. --- # Errors and limits > Error format, response codes and API limits. ## Error format Every error has the same shape: ```json { "error": { "code": "INVALID_INPUT", "message": "Invalid input for this action.", "issues": ["name: Required"] } } ``` `code` is stable, so branch on it in your code. `message` is for people and may change. `issues` comes only with invalid input. ## Response codes | HTTP | `code` | Meaning | | ---- | -------------------------- | ----------------------------------------------------------- | | 400 | `INVALID_INPUT` | The input doesn't match the action's schema, see `issues` | | 400 | `INVALID_JSON` | The body isn't a JSON object | | 400 | an app code | The action couldn't be done, e.g. `API_KEY_LIMIT_REACHED` | | 401 | `UNAUTHORIZED` | The key is missing, invalid, revoked or expired | | 403 | `INSUFFICIENT_SCOPE` | A read key tried to write | | 403 | `FORBIDDEN` or an app code | Your role in the app doesn't allow this action | | 404 | `UNKNOWN_ACTION` | The action doesn't exist or isn't available through the API | | 404 | e.g. `INVOICE_NOT_FOUND` | The record doesn't exist or you can't access it | | 409 | e.g. `TAG_NAME_EXISTS` | The record already exists or changed in the meantime | | 429 | `RATE_LIMITED` | Too many requests, see the `Retry-After` header | | 500 | `INTERNAL_SERVER_ERROR` | Something went wrong on our side | ## Limits - 300 requests a minute per key. Above that you get `429` with a `Retry-After` header in seconds. - One action may run for up to 60 seconds. - Uploads: up to 20 files at once, each up to 20 MB. ## Retrying Retry only `429` and `5xx`, waiting longer each time. Retrying a `4xx` doesn't help. Actions that create or send something aren't idempotent: if you don't know whether one went through, check with a read action first. --- # For AI agents > Let an AI agent such as Claude Code, Codex or Cursor work with Moniary through the CLI or the API. Moniary is ready for AI agents. An agent reads the docs, finds the right action and runs it as you. ## Docs for agents | URL | What it contains | | ---------------------------------------------- | -------------------------------------------------------------------- | | [`/llms.txt`](/llms.txt) | A short index, following the llms.txt convention | | [`/llms-full.txt`](/llms-full.txt) | All developer docs plus every action with its input, in one file | | `/docs/.md` | Any docs page as plain Markdown, e.g. [`/docs/api.md`](/docs/api.md) | | [`/api/v1/openapi.json`](/api/v1/openapi.json) | The machine-readable API description (OpenAPI 3.1) | It's enough to tell the agent: "Read https://moniary.com/llms-full.txt and use the `moniary` command." ## Recommended workflow 1. **Find the action:** `moniary actions --json` 2. **Read its input:** `moniary describe ` 3. **Run it:** `moniary run ''` 4. **Check the result** with a read action before going on. If an action returns `INVALID_INPUT`, the `issues` list says exactly which field to fix. ## Safely - Give an agent that only answers questions a **Read** key. It can't change anything. - Actions with access `confirm` (issuing and sending invoices, reminders, payment orders sent to the bank for signing) have effects outside Moniary. Have the agent ask you first. - Deleting and buying aren't available through the API at all. - Give each agent its own key. The **Last used** column shows when it was used, and you can revoke it with one click. ## ChatGPT and Claude To work with Moniary in a chat (ChatGPT, Claude), connecting it directly is easier. In ChatGPT, Moniary is a ready-made app; in Claude, you add it as a connector. You don't need an API key; you sign in with your Moniary account. The MCP server address is `https://moniary.com/api/mcp`, and agents that support MCP with sign-in can use it too. See [Integrations](/docs/integrace). --- # API reference > Every API endpoint and action with its input, code samples and a way to try it. **[Open the API reference →](/api-reference)** The reference is generated from the API's [OpenAPI 3.1](/api/v1/openapi.json) description, so it always matches what Moniary can do today. For each action you'll find its input parameters, examples in curl, Python, JavaScript and other languages, and a way to try it with your own key. You can also load the description into your own tools, such as Postman, Insomnia or a client library generator. ## billing ### billing.getBillingOverview `POST /api/v1/actions/billing.getBillingOverview` · access: read Get the workspace's credit balance, plan and billing overview. ## bankAccounts ### bankAccounts.getAll `POST /api/v1/actions/bankAccounts.getAll` · access: read List the workspace's own bank accounts (id, number, currency, label). ## bankConnections ### bankConnections.getConnections `POST /api/v1/actions/bankConnections.getConnections` · access: read List connected bank connections with provider, status and last sync time. ### bankConnections.syncNow `POST /api/v1/actions/bankConnections.syncNow` · access: write Start a manual transaction sync for a bank connection. connectionId from bankConnections.getConnections. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `connectionId` | `string` | yes | | ## bankTransactions ### bankTransactions.list `POST /api/v1/actions/bankTransactions.list` · access: read List imported bank transactions with filters and paging, including match status. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `page` | `integer` | no | min 0, výchozí 0 | | `pageSize` | `integer` | no | min 1, max 100, výchozí 50 | | `matchStatus` | `("UNMATCHED" \| "AUTO_MATCHED" \| "MANUAL_MATCHED" \| "IGNORED" \| "NO_DOCUMENT_NEEDED")[]` | no | | | `creditDebit` | `"CRDT" \| "DBIT"` | no | | | `dateFrom` | `string` | no | | | `dateTo` | `string` | no | | | `search` | `string` | no | | | `accountNumber` | `string` | no | | | `accountNumbers` | `string[]` | no | | | `currency` | `string[]` | no | | ### bankTransactions.getById `POST /api/v1/actions/bankTransactions.getById` · access: read Get one bank transaction with its details and matched invoice. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `id` | `string` | yes | | ### bankTransactions.matchToInvoice `POST /api/v1/actions/bankTransactions.matchToInvoice` · access: write Manually match a bank transaction to an invoice, optionally writing off a small shortfall such as a bank fee. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `transactionIds` | `string[]` | yes | max 50 položek | | `invoiceId` | `string` | yes | | | `writeOffShortfall` | `boolean` | no | | ### bankTransactions.ignore `POST /api/v1/actions/bankTransactions.ignore` · access: write Mark ONE bank transaction as ignored so it needs no invoice. For several use ignoreMany. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `transactionId` | `string` | yes | | ### bankTransactions.ignoreMany `POST /api/v1/actions/bankTransactions.ignoreMany` · access: write Mark several bank transactions as ignored at once so they need no invoice. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `transactionIds` | `string[]` | yes | max 500 položek | ### bankTransactions.getMatchSuggestions `POST /api/v1/actions/bankTransactions.getMatchSuggestions` · access: read Suggest invoices that a given bank transaction may pay; optional search text. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `transactionId` | `string` | yes | | | `search` | `string` | no | max 100 znaků | ### bankTransactions.getSummary `POST /api/v1/actions/bankTransactions.getSummary` · access: read Summary counts of matched, unmatched and ignored bank transactions. ## paymentOrders ### paymentOrders.status `POST /api/v1/actions/paymentOrders.status` · access: read Get the payment order status of an invoice or VAT payment (submitted, awaiting_signature, booked, rejected, or expired). | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `target` | `object` | yes | | | `target.kind` | `"invoice"` | yes | | | `target.invoiceId` | `string` | yes | | ## currency ### currency.convert `POST /api/v1/actions/currency.convert` · access: read Convert an amount between two currencies at the current rate. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `amount` | `number` | yes | | | `fromCurrency` | `"AED" \| "AFN" \| "ALL" \| "AMD" \| "ANG" \| "AOA" \| "ARS" \| "AUD" \| "AWG" \| "AZN" \| "BAM" \| "BBD" \| "BDT" \| "BGN" \| "BHD" \| "BIF" \| "BMD" \| "BND" \| "BOB" \| "BOV" \| "BRL" \| "BSD" \| "BTN" \| "BWP" \| "BYN" \| "BYR" \| "BZD" \| "CAD" \| "CDF" \| "CHE" \| "CHF" \| "CHW" \| "CLF" \| "CLP" \| "CNY" \| "COP" \| "COU" \| "CRC" \| "CUC" \| "CUP" \| "CVE" \| "CZK" \| "DJF" \| "DKK" \| "DOP" \| "DZD" \| "EGP" \| "ERN" \| "ETB" \| "EUR" \| "FJD" \| "FKP" \| "GBP" \| "GEL" \| "GHS" \| "GIP" \| "GMD" \| "GNF" \| "GTQ" \| "GYD" \| "HKD" \| "HNL" \| "HRK" \| "HTG" \| "HUF" \| "IDR" \| "ILS" \| "INR" \| "IQD" \| "IRR" \| "ISK" \| "JMD" \| "JOD" \| "JPY" \| "KES" \| "KGS" \| "KHR" \| "KMF" \| "KPW" \| "KRW" \| "KWD" \| "KYD" \| "KZT" \| "LAK" \| "LBP" \| "LKR" \| "LRD" \| "LSL" \| "LTL" \| "LVL" \| "LYD" \| "MAD" \| "MDL" \| "MGA" \| "MKD" \| "MMK" \| "MNT" \| "MOP" \| "MRO" \| "MRU" \| "MUR" \| "MVR" \| "MWK" \| "MXN" \| "MXV" \| "MYR" \| "MZN" \| "NAD" \| "NGN" \| "NIO" \| "NOK" \| "NPR" \| "NZD" \| "OMR" \| "PAB" \| "PEN" \| "PGK" \| "PHP" \| "PKR" \| "PLN" \| "PYG" \| "QAR" \| "RON" \| "RSD" \| "RUB" \| "RWF" \| "SAR" \| "SBD" \| "SCR" \| "SDG" \| "SEK" \| "SGD" \| "SHP" \| "SLE" \| "SLL" \| "SOS" \| "SRD" \| "SSP" \| "STD" \| "STN" \| "SVC" \| "SYP" \| "SZL" \| "THB" \| "TJS" \| "TMT" \| "TND" \| "TOP" \| "TRY" \| "TTD" \| "TWD" \| "TZS" \| "UAH" \| "UGX" \| "USD" \| "USN" \| "USS" \| "UYI" \| "UYU" \| "UZS" \| "VEF" \| "VES" \| "VND" \| "VUV" \| "WST" \| "XAF" \| "XAG" \| "XAU" \| "XBA" \| "XBB" \| "XBC" \| "XBD" \| "XCD" \| "XDR" \| "XFU" \| "XOF" \| "XPD" \| "XPF" \| "XPT" \| "XTS" \| "XXX" \| "YER" \| "ZAR" \| "ZMW" \| "ZWL"` | yes | | | `toCurrency` | `"AED" \| "AFN" \| "ALL" \| "AMD" \| "ANG" \| "AOA" \| "ARS" \| "AUD" \| "AWG" \| "AZN" \| "BAM" \| "BBD" \| "BDT" \| "BGN" \| "BHD" \| "BIF" \| "BMD" \| "BND" \| "BOB" \| "BOV" \| "BRL" \| "BSD" \| "BTN" \| "BWP" \| "BYN" \| "BYR" \| "BZD" \| "CAD" \| "CDF" \| "CHE" \| "CHF" \| "CHW" \| "CLF" \| "CLP" \| "CNY" \| "COP" \| "COU" \| "CRC" \| "CUC" \| "CUP" \| "CVE" \| "CZK" \| "DJF" \| "DKK" \| "DOP" \| "DZD" \| "EGP" \| "ERN" \| "ETB" \| "EUR" \| "FJD" \| "FKP" \| "GBP" \| "GEL" \| "GHS" \| "GIP" \| "GMD" \| "GNF" \| "GTQ" \| "GYD" \| "HKD" \| "HNL" \| "HRK" \| "HTG" \| "HUF" \| "IDR" \| "ILS" \| "INR" \| "IQD" \| "IRR" \| "ISK" \| "JMD" \| "JOD" \| "JPY" \| "KES" \| "KGS" \| "KHR" \| "KMF" \| "KPW" \| "KRW" \| "KWD" \| "KYD" \| "KZT" \| "LAK" \| "LBP" \| "LKR" \| "LRD" \| "LSL" \| "LTL" \| "LVL" \| "LYD" \| "MAD" \| "MDL" \| "MGA" \| "MKD" \| "MMK" \| "MNT" \| "MOP" \| "MRO" \| "MRU" \| "MUR" \| "MVR" \| "MWK" \| "MXN" \| "MXV" \| "MYR" \| "MZN" \| "NAD" \| "NGN" \| "NIO" \| "NOK" \| "NPR" \| "NZD" \| "OMR" \| "PAB" \| "PEN" \| "PGK" \| "PHP" \| "PKR" \| "PLN" \| "PYG" \| "QAR" \| "RON" \| "RSD" \| "RUB" \| "RWF" \| "SAR" \| "SBD" \| "SCR" \| "SDG" \| "SEK" \| "SGD" \| "SHP" \| "SLE" \| "SLL" \| "SOS" \| "SRD" \| "SSP" \| "STD" \| "STN" \| "SVC" \| "SYP" \| "SZL" \| "THB" \| "TJS" \| "TMT" \| "TND" \| "TOP" \| "TRY" \| "TTD" \| "TWD" \| "TZS" \| "UAH" \| "UGX" \| "USD" \| "USN" \| "USS" \| "UYI" \| "UYU" \| "UZS" \| "VEF" \| "VES" \| "VND" \| "VUV" \| "WST" \| "XAF" \| "XAG" \| "XAU" \| "XBA" \| "XBB" \| "XBC" \| "XBD" \| "XCD" \| "XDR" \| "XFU" \| "XOF" \| "XPD" \| "XPF" \| "XPT" \| "XTS" \| "XXX" \| "YER" \| "ZAR" \| "ZMW" \| "ZWL"` | yes | | ## invoices ### invoices.getActionItems `POST /api/v1/actions/invoices.getActionItems` · access: read List documents that need the user's attention (to review, approve or pay) with counts. ### invoices.getPaginatedInvoices `POST /api/v1/actions/invoices.getPaginatedInvoices` · access: read List received and issued documents, paged by cursor, with filters (status, payment state, dates, supplier, tags, search) and sorting. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `cursor` | `integer` | no | min 0, výchozí 0 | | `limit` | `integer` | no | min 1, max 100, výchozí 20 | | `filter` | `object` | no | | | `filter.status` | `("NEW" \| "AWAITING_APPROVAL" \| "REJECTED" \| "CANCELLED" \| "PROCESSING" \| "PAID" \| "CREDIT")[]` | no | | | `filter.workflowStatus` | `("NEW" \| "AWAITING_APPROVAL" \| "REJECTED")[]` | no | | | `filter.paymentState` | `("unpaid" \| "overdue" \| "partial" \| "paid" \| "credit" \| "sent_for_signing")[]` | no | | | `filter.search` | `string` | no | | | `filter.supplierId` | `string \| string[]` | no | | | `filter.customerId` | `string` | no | | | `filter.dateFrom` | `datetime` | no | | | `filter.dateTo` | `datetime` | no | | | `filter.overdue` | `boolean` | no | | | `filter.upcoming` | `boolean` | no | | | `filter.hasDueDate` | `boolean` | no | | | `filter.isPosted` | `boolean` | no | | | `filter.needsReview` | `boolean` | no | | | `filter.hasWarnings` | `boolean` | no | | | `filter.documentType` | `("invoice" \| "credit_note" \| "debit_note" \| "proforma" \| "advance_tax_document" \| "advance_credit_note" \| "simplified_tax_document" \| "final_invoice" \| "estimate")[]` | no | | | `filter.bookingCategory` | `("cash_register" \| "other_liabilities" \| "received_invoice" \| "set_off")[]` | no | | | `filter.expenseScope` | `"business" \| "personal"` | no | | | `filter.documentSeriesId` | `string \| string[]` | no | | | `filter.daysBeforeDue` | `integer` | no | min 0 | | `filter.taxPointDateMonth` | `string` | no | | | `filter.receivedAtMonth` | `string` | no | | | `filter.issueDateMonth` | `string` | no | | | `filter.dueDateMonth` | `string` | no | | | `filter.tagId` | `string \| string[]` | no | | | `filter.searchMode` | `"text" \| "ai"` | no | | | `filter.uploadedBy` | `string` | no | | | `filter.categoryId` | `string \| string[]` | no | | | `sort` | `object` | no | | | `sort.field` | `string` | yes | | | `sort.direction` | `"asc" \| "desc"` | yes | | ### invoices.getInvoiceById `POST /api/v1/actions/invoices.getInvoiceById` · access: read Full detail of one document: parties, amounts, VAT, line items, payment details, status and review issues. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `id` | `string` | yes | | ### invoices.updateInvoice `POST /api/v1/actions/invoices.updateInvoice` · access: write Edit the extracted fields of one document (numbers, dates, amounts, payment details, supplier or customer). | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `id` | `string` | yes | | | `data` | `object` | yes | | | `data.supplierId` | `string` | no | | | `data.customerId` | `string` | no | | | `data.invoiceNumber` | `string` | no | | | `data.documentType` | `"invoice" \| "credit_note" \| "debit_note" \| "proforma" \| "advance_tax_document" \| "advance_credit_note" \| "simplified_tax_document" \| "final_invoice" \| "estimate"` | no | | | `data.issueDate` | `datetime` | no | | | `data.taxPointDate` | `datetime` | no | | | `data.dueDate` | `datetime` | no | | | `data.paidDate` | `datetime` | no | | | `data.status` | `"NEW" \| "AWAITING_APPROVAL" \| "REJECTED" \| "CANCELLED"` | no | | | `data.vatApplicable` | `boolean` | no | | | `data.totalAmount` | `number` | no | | | `data.taxExclusiveAmount` | `number` | no | | | `data.taxAmount` | `number` | no | | | `data.currencyCode` | `string` | no | max 3 znaků | | `data.invoiceAttachment` | `object` | no | | | `data.invoiceAttachment.id` | `string` | yes | | | `data.invoiceAttachment.path` | `string` | yes | | | `data.invoiceAttachment.name` | `string` | yes | | | `data.invoiceAttachment.size` | `number` | yes | | | `data.invoiceAttachment.mimeType` | `string` | yes | | | `data.invoiceAttachment.uploadedAt` | `datetime` | yes | | | `data.language` | `string` | no | | | `data.categoryId` | `string \| null` | no | | | `data.vatClassificationId` | `string \| null` | no | | | `data.accountingDocSeriesId` | `string \| null` | no | | | `data.accountingTemplateId` | `string \| null` | no | | | `data.bookingCategory` | `"cash_register" \| "other_liabilities" \| "received_invoice" \| "set_off" \| null` | no | | | `data.accountingMetadata` | `object` | no | | | `data.accountingMetadata.numericalSeriesId` | `string \| null` | no | | | `data.accountingMetadata.numericalSeriesName` | `string \| null` | no | | | `data.accountingMetadata.accountingExport` | `object \| null` | no | | | `data.vatMode` | `"STANDARD" \| "REVERSE_CHARGE_EU" \| "REVERSE_CHARGE_NON_EU" \| "LOCAL_REVERSE_CHARGE" \| null` | no | | | `data.selfAssessedVatRate` | `number \| null` | no | | | `data.supplyCode` | `string \| null` | no | | ### invoices.resolveReviewIssues `POST /api/v1/actions/invoices.resolveReviewIssues` · access: write Mark ONE document flagged for review (Ke kontrole) as checked: clears its review issues and its duplicate-number and foreign-customer warnings. For several use resolveReviewIssuesMany. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `id` | `string` | yes | | ### invoices.resolveReviewIssuesMany `POST /api/v1/actions/invoices.resolveReviewIssuesMany` · access: write Mark several documents flagged for review (Ke kontrole) as checked at once, clearing every warning on them. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `ids` | `string[]` | yes | max 500 položek | ### invoices.getOverdueInvoices `POST /api/v1/actions/invoices.getOverdueInvoices` · access: read List documents that are past their due date and unpaid. ### invoices.getInvoiceStats `POST /api/v1/actions/invoices.getInvoiceStats` · access: read Totals and counts of documents for an optional filter (amounts, paid/unpaid, overdue). | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `filter` | `object` | no | | | `filter.status` | `("NEW" \| "AWAITING_APPROVAL" \| "REJECTED" \| "CANCELLED" \| "PROCESSING" \| "PAID" \| "CREDIT")[]` | no | | | `filter.workflowStatus` | `("NEW" \| "AWAITING_APPROVAL" \| "REJECTED")[]` | no | | | `filter.paymentState` | `("unpaid" \| "overdue" \| "partial" \| "paid" \| "credit" \| "sent_for_signing")[]` | no | | | `filter.search` | `string` | no | | | `filter.supplierId` | `string \| string[]` | no | | | `filter.customerId` | `string` | no | | | `filter.dateFrom` | `datetime` | no | | | `filter.dateTo` | `datetime` | no | | | `filter.overdue` | `boolean` | no | | | `filter.upcoming` | `boolean` | no | | | `filter.hasDueDate` | `boolean` | no | | | `filter.isPosted` | `boolean` | no | | | `filter.needsReview` | `boolean` | no | | | `filter.hasWarnings` | `boolean` | no | | | `filter.documentType` | `("invoice" \| "credit_note" \| "debit_note" \| "proforma" \| "advance_tax_document" \| "advance_credit_note" \| "simplified_tax_document" \| "final_invoice" \| "estimate")[]` | no | | | `filter.bookingCategory` | `("cash_register" \| "other_liabilities" \| "received_invoice" \| "set_off")[]` | no | | | `filter.expenseScope` | `"business" \| "personal"` | no | | | `filter.documentSeriesId` | `string \| string[]` | no | | | `filter.daysBeforeDue` | `integer` | no | min 0 | | `filter.taxPointDateMonth` | `string` | no | | | `filter.receivedAtMonth` | `string` | no | | | `filter.issueDateMonth` | `string` | no | | | `filter.dueDateMonth` | `string` | no | | | `filter.tagId` | `string \| string[]` | no | | | `filter.searchMode` | `"text" \| "ai"` | no | | | `filter.uploadedBy` | `string` | no | | | `filter.categoryId` | `string \| string[]` | no | | ### invoices.updateInvoiceStatus `POST /api/v1/actions/invoices.updateInvoiceStatus` · access: write Change the workflow status of one document: NEW (received or approved), AWAITING_APPROVAL, REJECTED, or CANCELLED (storno of an issued document, keeps its number). | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `id` | `string` | yes | | | `status` | `"NEW" \| "AWAITING_APPROVAL" \| "REJECTED" \| "CANCELLED"` | yes | | ### invoices.getPayments `POST /api/v1/actions/invoices.getPayments` · access: read List the recorded payments of one document. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `invoiceId` | `string` | yes | | ### invoices.setInvoicesPaid `POST /api/v1/actions/invoices.setInvoicesPaid` · access: write Mark documents as paid (with date, amount, method) or unpaid, for one or many documents. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `invoiceIds` | `string[]` | yes | | | `paid` | `boolean` | yes | | | `payment` | `object` | no | | | `payment.paidOn` | `string` | no | | | `payment.amount` | `number` | no | | | `payment.method` | `"bank" \| "cash" \| "card" \| "offset" \| "other"` | no | | ### invoices.getSpendingBySupplier `POST /api/v1/actions/invoices.getSpendingBySupplier` · access: read Spending totals grouped by supplier for a date range. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `limit` | `number` | no | min 1, max 50, výchozí 10 | | `dateFrom` | `datetime` | no | | | `dateTo` | `datetime` | no | | | `spendScope` | `"business" \| "all"` | no | výchozí "business" | | `withoutVat` | `boolean` | no | | ### invoices.getSpendingByCategory `POST /api/v1/actions/invoices.getSpendingByCategory` · access: read Spending totals grouped by expense category for a date range. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `limit` | `number` | no | min 1, max 50, výchozí 10 | | `dateFrom` | `datetime` | no | | | `dateTo` | `datetime` | no | | | `spendScope` | `"business" \| "all"` | no | výchozí "business" | | `withoutVat` | `boolean` | no | | ### invoices.searchBySemanticQuery `POST /api/v1/actions/invoices.searchBySemanticQuery` · access: read Find documents by meaning (natural-language query), returning the closest matches. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `query` | `string` | yes | | | `threshold` | `number` | no | min 0, max 1, výchozí 0.7 | | `limit` | `integer` | no | min 1, max 100, výchozí 10 | ## issuedInvoices ### issuedInvoices.getPaginatedIssuedInvoices `POST /api/v1/actions/issuedInvoices.getPaginatedIssuedInvoices` · access: read List issued (sales) invoices with filters and paging; returns invoice rows with customer, totals and status. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `page` | `integer` | no | min 0, výchozí 0 | | `pageSize` | `integer` | no | min 1, max 100, výchozí 20 | | `tagId` | `string \| string[]` | no | | | `customerId` | `string` | no | | | `dateFrom` | `datetime` | no | | | `dateTo` | `datetime` | no | | | `search` | `string` | no | max 200 znaků | | `status` | `"unpaid" \| "overdue" \| "paid" \| "cancelled"` | no | | | `undelivered` | `boolean` | no | | | `aging` | `"current" \| "days1to30" \| "days31to60" \| "days61to90" \| "days90plus"` | no | | | `customerIds` | `string[]` | no | max 200 položek | | `documentType` | `("invoice" \| "credit_note" \| "debit_note" \| "proforma" \| "advance_tax_document" \| "advance_credit_note" \| "simplified_tax_document" \| "final_invoice" \| "estimate")[]` | no | | | `documentSeriesId` | `string[]` | no | max 100 položek | | `currency` | `("AED" \| "AFN" \| "ALL" \| "AMD" \| "ANG" \| "AOA" \| "ARS" \| "AUD" \| "AWG" \| "AZN" \| "BAM" \| "BBD" \| "BDT" \| "BGN" \| "BHD" \| "BIF" \| "BMD" \| "BND" \| "BOB" \| "BOV" \| "BRL" \| "BSD" \| "BTN" \| "BWP" \| "BYN" \| "BYR" \| "BZD" \| "CAD" \| "CDF" \| "CHE" \| "CHF" \| "CHW" \| "CLF" \| "CLP" \| "CNY" \| "COP" \| "COU" \| "CRC" \| "CUC" \| "CUP" \| "CVE" \| "CZK" \| "DJF" \| "DKK" \| "DOP" \| "DZD" \| "EGP" \| "ERN" \| "ETB" \| "EUR" \| "FJD" \| "FKP" \| "GBP" \| "GEL" \| "GHS" \| "GIP" \| "GMD" \| "GNF" \| "GTQ" \| "GYD" \| "HKD" \| "HNL" \| "HRK" \| "HTG" \| "HUF" \| "IDR" \| "ILS" \| "INR" \| "IQD" \| "IRR" \| "ISK" \| "JMD" \| "JOD" \| "JPY" \| "KES" \| "KGS" \| "KHR" \| "KMF" \| "KPW" \| "KRW" \| "KWD" \| "KYD" \| "KZT" \| "LAK" \| "LBP" \| "LKR" \| "LRD" \| "LSL" \| "LTL" \| "LVL" \| "LYD" \| "MAD" \| "MDL" \| "MGA" \| "MKD" \| "MMK" \| "MNT" \| "MOP" \| "MRO" \| "MRU" \| "MUR" \| "MVR" \| "MWK" \| "MXN" \| "MXV" \| "MYR" \| "MZN" \| "NAD" \| "NGN" \| "NIO" \| "NOK" \| "NPR" \| "NZD" \| "OMR" \| "PAB" \| "PEN" \| "PGK" \| "PHP" \| "PKR" \| "PLN" \| "PYG" \| "QAR" \| "RON" \| "RSD" \| "RUB" \| "RWF" \| "SAR" \| "SBD" \| "SCR" \| "SDG" \| "SEK" \| "SGD" \| "SHP" \| "SLE" \| "SLL" \| "SOS" \| "SRD" \| "SSP" \| "STD" \| "STN" \| "SVC" \| "SYP" \| "SZL" \| "THB" \| "TJS" \| "TMT" \| "TND" \| "TOP" \| "TRY" \| "TTD" \| "TWD" \| "TZS" \| "UAH" \| "UGX" \| "USD" \| "USN" \| "USS" \| "UYI" \| "UYU" \| "UZS" \| "VEF" \| "VES" \| "VND" \| "VUV" \| "WST" \| "XAF" \| "XAG" \| "XAU" \| "XBA" \| "XBB" \| "XBC" \| "XBD" \| "XCD" \| "XDR" \| "XFU" \| "XOF" \| "XPD" \| "XPF" \| "XPT" \| "XTS" \| "XXX" \| "YER" \| "ZAR" \| "ZMW" \| "ZWL")[]` | no | | | `emailed` | `"sent" \| "notSent"` | no | | | `payment` | `("paid" \| "unpaid" \| "partial")[]` | no | | | `sort` | `object` | no | | | `sort.field` | `"invoiceNumber" \| "customer" \| "issueDate" \| "taxPointDate" \| "dueDate" \| "daysUntilDue" \| "totalAmount"` | yes | | | `sort.direction` | `"asc" \| "desc"` | yes | | ### issuedInvoices.getIssuedInvoiceStats `POST /api/v1/actions/issuedInvoices.getIssuedInvoiceStats` · access: read Summary statistics of issued invoices for the given filter (counts and totals by status). | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `tagId` | `string \| string[]` | no | | | `customerId` | `string` | no | | | `dateFrom` | `datetime` | no | | | `dateTo` | `datetime` | no | | | `search` | `string` | no | max 200 znaků | | `status` | `"unpaid" \| "overdue" \| "paid" \| "cancelled"` | no | | | `undelivered` | `boolean` | no | | | `aging` | `"current" \| "days1to30" \| "days31to60" \| "days61to90" \| "days90plus"` | no | | | `customerIds` | `string[]` | no | max 200 položek | | `documentType` | `("invoice" \| "credit_note" \| "debit_note" \| "proforma" \| "advance_tax_document" \| "advance_credit_note" \| "simplified_tax_document" \| "final_invoice" \| "estimate")[]` | no | | | `documentSeriesId` | `string[]` | no | max 100 položek | | `currency` | `("AED" \| "AFN" \| "ALL" \| "AMD" \| "ANG" \| "AOA" \| "ARS" \| "AUD" \| "AWG" \| "AZN" \| "BAM" \| "BBD" \| "BDT" \| "BGN" \| "BHD" \| "BIF" \| "BMD" \| "BND" \| "BOB" \| "BOV" \| "BRL" \| "BSD" \| "BTN" \| "BWP" \| "BYN" \| "BYR" \| "BZD" \| "CAD" \| "CDF" \| "CHE" \| "CHF" \| "CHW" \| "CLF" \| "CLP" \| "CNY" \| "COP" \| "COU" \| "CRC" \| "CUC" \| "CUP" \| "CVE" \| "CZK" \| "DJF" \| "DKK" \| "DOP" \| "DZD" \| "EGP" \| "ERN" \| "ETB" \| "EUR" \| "FJD" \| "FKP" \| "GBP" \| "GEL" \| "GHS" \| "GIP" \| "GMD" \| "GNF" \| "GTQ" \| "GYD" \| "HKD" \| "HNL" \| "HRK" \| "HTG" \| "HUF" \| "IDR" \| "ILS" \| "INR" \| "IQD" \| "IRR" \| "ISK" \| "JMD" \| "JOD" \| "JPY" \| "KES" \| "KGS" \| "KHR" \| "KMF" \| "KPW" \| "KRW" \| "KWD" \| "KYD" \| "KZT" \| "LAK" \| "LBP" \| "LKR" \| "LRD" \| "LSL" \| "LTL" \| "LVL" \| "LYD" \| "MAD" \| "MDL" \| "MGA" \| "MKD" \| "MMK" \| "MNT" \| "MOP" \| "MRO" \| "MRU" \| "MUR" \| "MVR" \| "MWK" \| "MXN" \| "MXV" \| "MYR" \| "MZN" \| "NAD" \| "NGN" \| "NIO" \| "NOK" \| "NPR" \| "NZD" \| "OMR" \| "PAB" \| "PEN" \| "PGK" \| "PHP" \| "PKR" \| "PLN" \| "PYG" \| "QAR" \| "RON" \| "RSD" \| "RUB" \| "RWF" \| "SAR" \| "SBD" \| "SCR" \| "SDG" \| "SEK" \| "SGD" \| "SHP" \| "SLE" \| "SLL" \| "SOS" \| "SRD" \| "SSP" \| "STD" \| "STN" \| "SVC" \| "SYP" \| "SZL" \| "THB" \| "TJS" \| "TMT" \| "TND" \| "TOP" \| "TRY" \| "TTD" \| "TWD" \| "TZS" \| "UAH" \| "UGX" \| "USD" \| "USN" \| "USS" \| "UYI" \| "UYU" \| "UZS" \| "VEF" \| "VES" \| "VND" \| "VUV" \| "WST" \| "XAF" \| "XAG" \| "XAU" \| "XBA" \| "XBB" \| "XBC" \| "XBD" \| "XCD" \| "XDR" \| "XFU" \| "XOF" \| "XPD" \| "XPF" \| "XPT" \| "XTS" \| "XXX" \| "YER" \| "ZAR" \| "ZMW" \| "ZWL")[]` | no | | | `emailed` | `"sent" \| "notSent"` | no | | | `payment` | `("paid" \| "unpaid" \| "partial")[]` | no | | ### issuedInvoices.getReceivables `POST /api/v1/actions/issuedInvoices.getReceivables` · access: read Outstanding receivables: unpaid issued invoices and amounts owed to the workspace. ### issuedInvoices.getCustomerReceivables `POST /api/v1/actions/issuedInvoices.getCustomerReceivables` · access: read Unpaid issued invoices and amount owed by one customer (customerId from the contacts list). | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `customerId` | `string` | yes | | ### issuedInvoices.issueInvoice `POST /api/v1/actions/issuedInvoices.issueInvoice` · access: write Issue (vystavit) a sales invoice, e.g. a saved draft (its input from issuedInvoices.getDraft); assigns the next number in its series. Cancel it later if needed. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `seriesId` | `string` | no | | | `documentType` | `"invoice" \| "proforma" \| "advance_tax_document" \| "final_invoice" \| "credit_note" \| "estimate"` | no | | | `customerId` | `string` | yes | | | `issueDate` | `string` | yes | | | `dueDate` | `string` | yes | | | `taxPointDate` | `string` | no | | | `currencyCode` | `"AED" \| "AFN" \| "ALL" \| "AMD" \| "AOA" \| "ARS" \| "AUD" \| "AWG" \| "AZN" \| "BAM" \| "BBD" \| "BDT" \| "BHD" \| "BIF" \| "BMD" \| "BND" \| "BOB" \| "BRL" \| "BSD" \| "BTN" \| "BWP" \| "BYN" \| "BZD" \| "CAD" \| "CDF" \| "CHF" \| "CLP" \| "CNY" \| "COP" \| "CRC" \| "CUP" \| "CVE" \| "CZK" \| "DJF" \| "DKK" \| "DOP" \| "DZD" \| "EGP" \| "ERN" \| "ETB" \| "EUR" \| "FJD" \| "FKP" \| "GBP" \| "GEL" \| "GHS" \| "GIP" \| "GMD" \| "GNF" \| "GTQ" \| "GYD" \| "HKD" \| "HNL" \| "HTG" \| "HUF" \| "IDR" \| "ILS" \| "INR" \| "IQD" \| "IRR" \| "ISK" \| "JMD" \| "JOD" \| "JPY" \| "KES" \| "KGS" \| "KHR" \| "KMF" \| "KPW" \| "KRW" \| "KWD" \| "KYD" \| "KZT" \| "LAK" \| "LBP" \| "LKR" \| "LRD" \| "LSL" \| "LYD" \| "MAD" \| "MDL" \| "MGA" \| "MKD" \| "MMK" \| "MNT" \| "MOP" \| "MRU" \| "MUR" \| "MVR" \| "MWK" \| "MXN" \| "MYR" \| "MZN" \| "NAD" \| "NGN" \| "NIO" \| "NOK" \| "NPR" \| "NZD" \| "OMR" \| "PAB" \| "PEN" \| "PGK" \| "PHP" \| "PKR" \| "PLN" \| "PYG" \| "QAR" \| "RON" \| "RSD" \| "RUB" \| "RWF" \| "SAR" \| "SBD" \| "SCR" \| "SDG" \| "SEK" \| "SGD" \| "SHP" \| "SLE" \| "SOS" \| "SRD" \| "SSP" \| "STN" \| "SVC" \| "SYP" \| "SZL" \| "THB" \| "TJS" \| "TMT" \| "TND" \| "TOP" \| "TRY" \| "TTD" \| "TWD" \| "TZS" \| "UAH" \| "UGX" \| "USD" \| "UYU" \| "UZS" \| "VES" \| "VND" \| "VUV" \| "WST" \| "XAF" \| "XCD" \| "XOF" \| "XPF" \| "YER" \| "ZAR" \| "ZMW"` | no | výchozí "CZK" | | `language` | `"cs" \| "en" \| "cs_en"` | no | | | `vatPriceMode` | `"exclusive" \| "inclusive"` | no | | | `salesVatTreatment` | `"standard" \| "local_reverse_charge" \| "exempt_eu" \| "eu_services" \| "exempt_export" \| "outside_eu_services" \| "oss_goods" \| "oss_services" \| "installed_abroad"` | no | | | `supplyCode` | `string` | no | | | `documentDiscountPercent` | `number` | no | min 0, max 100 | | `applyCashRounding` | `boolean` | no | | | `lineItems` | `object[]` | yes | | | `note` | `string` | no | max 1000 znaků | | `privateNote` | `string` | no | max 2000 znaků | | `footerText` | `string` | no | max 500 znaků | | `paymentDetails` | `object` | no | | | `paymentDetails.bankAccount` | `string` | no | max 50 znaků | | `paymentDetails.bankCode` | `string` | no | max 10 znaků | | `paymentDetails.bankName` | `string` | no | max 100 znaků | | `paymentDetails.iban` | `string` | no | max 34 znaků | | `paymentDetails.bic` | `string` | no | max 11 znaků | | `paymentDetails.variableSymbol` | `string` | no | max 20 znaků | | `paymentDetails.constantSymbol` | `string` | no | max 20 znaků | | `paymentDetails.specificSymbol` | `string` | no | max 20 znaků | | `paymentDetails.paymentMethod` | `"cash" \| "cheque" \| "credit_transfer" \| "bank_transfer" \| "card" \| "direct_debit" \| "cash_on_delivery" \| "set_off"` | no | | | `documentReferences` | `object` | no | | | `documentReferences.orderNumber` | `string \| null` | no | | | `documentReferences.orderDate` | `string \| null` | no | | | `documentReferences.originalInvoiceNumber` | `string \| null` | no | | | `documentReferences.originalTaxPointDate` | `string \| null` | no | | | `documentReferences.creditScope` | `"full" \| "partial" \| null` | no | | | `documentReferences.deliveryNoteNumber` | `string \| null` | no | | | `documentReferences.deliveryNoteDate` | `string \| null` | no | | | `documentReferences.contractNumber` | `string \| null` | no | | | `documentReferences.contractDate` | `string \| null` | no | | | `documentReferences.relatedProformaId` | `string \| null` | no | | | `documentReferences.relatedAdvanceIds` | `string[] \| null` | no | | | `documentReferences.relatedPaymentId` | `string \| null` | no | | | `documentReferences.salesOrderId` | `string \| null` | no | | | `documentReferences.externalOrderId` | `string \| null` | no | | | `deliveryInfo` | `object` | no | | | `deliveryInfo.name` | `string \| null` | no | | | `deliveryInfo.street` | `string \| null` | no | | | `deliveryInfo.city` | `string \| null` | no | | | `deliveryInfo.postalCode` | `string \| null` | no | | | `deliveryInfo.country` | `string \| null` | no | | | `deliveryInfo.startDate` | `string \| null` | no | | | `deliveryInfo.endDate` | `string \| null` | no | | | `tagIds` | `string[]` | no | | | `sendEmail` | `boolean` | no | | | `reminderEnabled` | `boolean` | no | | | `proformaFollowup` | `"final_invoice_paid" \| "final_invoice" \| "tax_document" \| "none"` | no | | | `relatedInvoiceId` | `string` | no | | | `draftId` | `string` | no | | ### issuedInvoices.listDrafts `POST /api/v1/actions/issuedInvoices.listDrafts` · access: read List saved issued-invoice drafts. ### issuedInvoices.getDraft `POST /api/v1/actions/issuedInvoices.getDraft` · access: read Get one issued-invoice draft by id (from issuedInvoices.listDrafts). | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `id` | `string` | yes | | ### issuedInvoices.saveDraft `POST /api/v1/actions/issuedInvoices.saveDraft` · access: write Create or update an issued-invoice draft; nothing is issued or sent. A new draft takes a new unique id (e.g. a short random string); pass an existing id to update it. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `id` | `string` | yes | max 64 znaků | | `values` | `object` | yes | | | `values.documentType` | `"invoice" \| "proforma" \| "advance_tax_document" \| "final_invoice" \| "credit_note" \| "estimate"` | no | | | `values.invoiceNumber` | `string` | no | | | `values.seriesId` | `string` | no | | | `values.customerId` | `string` | no | | | `values.issueDate` | `string` | no | | | `values.taxPointDate` | `string` | no | | | `values.dueDate` | `string` | no | | | `values.currencyCode` | `"AED" \| "AFN" \| "ALL" \| "AMD" \| "AOA" \| "ARS" \| "AUD" \| "AWG" \| "AZN" \| "BAM" \| "BBD" \| "BDT" \| "BHD" \| "BIF" \| "BMD" \| "BND" \| "BOB" \| "BRL" \| "BSD" \| "BTN" \| "BWP" \| "BYN" \| "BZD" \| "CAD" \| "CDF" \| "CHF" \| "CLP" \| "CNY" \| "COP" \| "CRC" \| "CUP" \| "CVE" \| "CZK" \| "DJF" \| "DKK" \| "DOP" \| "DZD" \| "EGP" \| "ERN" \| "ETB" \| "EUR" \| "FJD" \| "FKP" \| "GBP" \| "GEL" \| "GHS" \| "GIP" \| "GMD" \| "GNF" \| "GTQ" \| "GYD" \| "HKD" \| "HNL" \| "HTG" \| "HUF" \| "IDR" \| "ILS" \| "INR" \| "IQD" \| "IRR" \| "ISK" \| "JMD" \| "JOD" \| "JPY" \| "KES" \| "KGS" \| "KHR" \| "KMF" \| "KPW" \| "KRW" \| "KWD" \| "KYD" \| "KZT" \| "LAK" \| "LBP" \| "LKR" \| "LRD" \| "LSL" \| "LYD" \| "MAD" \| "MDL" \| "MGA" \| "MKD" \| "MMK" \| "MNT" \| "MOP" \| "MRU" \| "MUR" \| "MVR" \| "MWK" \| "MXN" \| "MYR" \| "MZN" \| "NAD" \| "NGN" \| "NIO" \| "NOK" \| "NPR" \| "NZD" \| "OMR" \| "PAB" \| "PEN" \| "PGK" \| "PHP" \| "PKR" \| "PLN" \| "PYG" \| "QAR" \| "RON" \| "RSD" \| "RUB" \| "RWF" \| "SAR" \| "SBD" \| "SCR" \| "SDG" \| "SEK" \| "SGD" \| "SHP" \| "SLE" \| "SOS" \| "SRD" \| "SSP" \| "STN" \| "SVC" \| "SYP" \| "SZL" \| "THB" \| "TJS" \| "TMT" \| "TND" \| "TOP" \| "TRY" \| "TTD" \| "TWD" \| "TZS" \| "UAH" \| "UGX" \| "USD" \| "UYU" \| "UZS" \| "VES" \| "VND" \| "VUV" \| "WST" \| "XAF" \| "XCD" \| "XOF" \| "XPF" \| "YER" \| "ZAR" \| "ZMW"` | no | | | `values.language` | `"cs" \| "en" \| "cs_en"` | no | | | `values.vatPriceMode` | `"exclusive" \| "inclusive"` | no | | | `values.salesVatTreatment` | `"standard" \| "local_reverse_charge" \| "exempt_eu" \| "eu_services" \| "exempt_export" \| "outside_eu_services" \| "oss_goods" \| "oss_services" \| "installed_abroad"` | no | | | `values.supplyCode` | `string` | no | | | `values.documentDiscountPercent` | `string` | no | | | `values.lineItems` | `object[]` | no | max 500 položek | | `values.paymentMethod` | `"cash" \| "cheque" \| "credit_transfer" \| "bank_transfer" \| "card" \| "direct_debit" \| "cash_on_delivery" \| "set_off"` | no | | | `values.variableSymbol` | `string` | no | | | `values.bankAccount` | `object` | no | | | `values.bankAccount.accountNumber` | `string` | yes | | | `values.bankAccount.bankCode` | `string \| null` | no | | | `values.bankAccount.iban` | `string \| null` | no | | | `values.bankAccount.bic` | `string \| null` | no | | | `values.note` | `string` | no | | | `values.privateNote` | `string` | no | | | `values.footerText` | `string` | no | | | `values.orderNumber` | `string` | no | | | `values.contractNumber` | `string` | no | | | `values.supplyKindsByLine` | `object` | no | | | `values.reminderEnabled` | `boolean` | no | | | `values.tagIds` | `string[]` | no | | | `totalAmount` | `number \| null` | no | | ### issuedInvoices.duplicateToDraft `POST /api/v1/actions/issuedInvoices.duplicateToDraft` · access: write Duplicate an issued invoice into a new draft dated today; without invoiceId, the latest invoice ("vystav fakturu podle té poslední"). Nothing is issued or sent; issue it with issuedInvoices.issueInvoice. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `invoiceId` | `string` | no | | ### issuedInvoices.createCreditNote `POST /api/v1/actions/issuedInvoices.createCreditNote` · access: write Create a credit note (dobropis) for an issued invoice, which gets its own legal number. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `invoiceId` | `string` | yes | | | `reason` | `string` | yes | max 500 znaků | | `taxPointDate` | `string` | no | | | `lines` | `object[]` | no | Partial correction: original lines (itemId from getCreditNoteLines) with the quantity and positive unit price to take off, in the invoice's price mode. Omit to credit everything left. · max 500 položek | ### issuedInvoices.getCreditNoteLines `POST /api/v1/actions/issuedInvoices.getCreditNoteLines` · access: read List an issued invoice's lines with what is left to credit, for a partial credit note. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `invoiceId` | `string` | yes | | ### issuedInvoices.sendIssuedInvoiceEmail `POST /api/v1/actions/issuedInvoices.sendIssuedInvoiceEmail` · access: write Email an issued invoice to the customer; sends an external email. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `invoiceId` | `string` | yes | | | `kind` | `"invoice" \| "reminder"` | no | výchozí "invoice" | | `to` | `string[]` | no | max 10 položek | | `cc` | `string[]` | no | max 10 položek | | `bcc` | `string[]` | no | max 10 položek | | `subject` | `string` | no | max 300 znaků | | `message` | `string` | no | max 10000 znaků | | `saveRecipientsToCustomer` | `boolean` | no | | ### issuedInvoices.sendIssuedInvoiceReminders `POST /api/v1/actions/issuedInvoices.sendIssuedInvoiceReminders` · access: write Send payment reminder emails to customers for the given issued invoices; external emails. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `invoiceIds` | `string[]` | yes | max 25 položek | ### issuedInvoices.getCustomerIssueDefaults `POST /api/v1/actions/issuedInvoices.getCustomerIssueDefaults` · access: read Defaults for a new invoice to one customer (due days, note, footer and similar), used to prefill a draft. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `customerId` | `string` | yes | | ## businesses ### businesses.searchCompanies `POST /api/v1/actions/businesses.searchCompanies` · access: read Search company registries (ARES, VIES) by name or IČO; returns matching companies. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `query` | `string` | yes | | | `country` | `string` | no | | ### businesses.getBusiness `POST /api/v1/actions/businesses.getBusiness` · access: read Details of one supplier or customer by id. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `businessId` | `string` | yes | | ### businesses.createBusiness `POST /api/v1/actions/businesses.createBusiness` · access: write Create a supplier or customer record (name, IČO, address, VAT id). | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `name` | `string` | yes | | | `businessId` | `string` | no | | | `vatId` | `string` | no | | | `taxId` | `string` | no | | | `street` | `string` | no | | | `city` | `string` | no | | | `postalCode` | `string` | no | | | `country` | `string` | no | | | `email` | `string` | no | | | `phone` | `string` | no | | | `website` | `string` | no | | | `invoiceApprovalType` | `"MANUAL" \| "AUTO_APPROVAL" \| "AUTO_REJECTION"` | no | | | `registryDataLoaded` | `boolean` | no | | ### businesses.updateBusiness `POST /api/v1/actions/businesses.updateBusiness` · access: write Edit a supplier or customer record. Id from businesses.getPaginatedBusinesses. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `businessId` | `string` | yes | | | `data` | `object` | yes | | | `data.name` | `string` | no | | | `data.displayName` | `string \| null` | no | max 200 znaků | | `data.businessId` | `string` | no | | | `data.vatId` | `string` | no | | | `data.taxId` | `string` | no | | | `data.street` | `string` | no | | | `data.city` | `string` | no | | | `data.postalCode` | `string` | no | | | `data.country` | `string` | no | | | `data.email` | `string` | no | | | `data.phone` | `string` | no | | | `data.website` | `string` | no | | | `data.invoiceApprovalType` | `"MANUAL" \| "AUTO_APPROVAL" \| "AUTO_REJECTION"` | no | | | `data.registryDataLoaded` | `boolean` | no | | | `data.registerEntry` | `any \| null` | no | | | `data.defaultInvoiceNote` | `string` | no | max 1000 znaků | | `data.defaultInvoiceFooter` | `string` | no | max 500 znaků | ### businesses.getPaginatedBusinesses `POST /api/v1/actions/businesses.getPaginatedBusinesses` · access: read List suppliers and customers, paged, with search and role filter. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `page` | `integer` | no | min 0, výchozí 0 | | `pageSize` | `integer` | no | min 1, max 100, výchozí 20 | | `sort` | `object` | no | | | `sort.field` | `string` | yes | | | `sort.direction` | `"asc" \| "desc"` | yes | | | `search` | `string` | no | | | `role` | `"supplier" \| "customer"` | no | | ### businesses.getBusinessOverview `POST /api/v1/actions/businesses.getBusinessOverview` · access: read Overview of one supplier or customer: document counts, totals and recent activity. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `id` | `string` | yes | | ### businesses.getCurrentBusinessProfile `POST /api/v1/actions/businesses.getCurrentBusinessProfile` · access: read Get the workspace's own business profile (the company the workspace belongs to, not a supplier): identity, address and tax details. ## documentExtractions ### documentExtractions.getDocumentExtractions `POST /api/v1/actions/documentExtractions.getDocumentExtractions` · access: read List uploaded files and their extraction status (processing, done, error), paged, filterable. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `page` | `integer` | no | min 0, výchozí 0 | | `pageSize` | `integer` | no | min 1, max 100, výchozí 50 | | `filter` | `object` | no | | | `filter.status` | `("PENDING" \| "PROCESSING" \| "SUCCESS" \| "ERROR" \| "REJECTED" \| "DELETED" \| "REVIEW" \| "SUPERSEDED")[]` | no | | | `filter.extractionMethod` | `("ISDOC" \| "LLM")[]` | no | | | `filter.dateFrom` | `datetime` | no | | | `filter.dateTo` | `datetime` | no | | | `filter.search` | `string` | no | | | `sort` | `object` | no | | | `sort.field` | `"createdAt" \| "updatedAt" \| "status" \| "fileName"` | yes | | | `sort.direction` | `"asc" \| "desc"` | yes | | ### documentExtractions.getDocumentExtractionById `POST /api/v1/actions/documentExtractions.getDocumentExtractionById` · access: read Details of one upload's extraction (status, error, resulting document). | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `id` | `string` | yes | | ## tags ### tags.getAll `POST /api/v1/actions/tags.getAll` · access: read List the workspace's document tags (id, name, color). ### tags.create `POST /api/v1/actions/tags.create` · access: write Create a tag. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `name` | `string` | yes | max 100 znaků | | `description` | `string \| null` | no | max 255 znaků | | `color` | `string \| null` | no | | ### tags.update `POST /api/v1/actions/tags.update` · access: write Rename or recolor a tag. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `id` | `string` | yes | | | `name` | `string` | no | max 100 znaků | | `description` | `string \| null` | no | max 255 znaků | | `color` | `string \| null` | no | | ### tags.setInvoiceTags `POST /api/v1/actions/tags.setInvoiceTags` · access: write Replace the tags on ONE document (received or issued invoice). For two or more documents use setTagsOnInvoices. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `invoiceId` | `string` | yes | | | `tagIds` | `string[]` | yes | | ### tags.setTagsOnInvoices `POST /api/v1/actions/tags.setTagsOnInvoices` · access: write Add and/or remove tags on several documents at once. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `invoiceIds` | `string[]` | yes | max 500 položek | | `addTagIds` | `string[]` | no | max 50 položek, výchozí [] | | `removeTagIds` | `string[]` | no | max 50 položek, výchozí [] | ## expenseCategories ### expenseCategories.getAll `POST /api/v1/actions/expenseCategories.getAll` · access: read List the workspace's active expense categories with their ids. ## vatReturn ### vatReturn.preview `POST /api/v1/actions/vatReturn.preview` · access: read Draft of the VAT return (DPH přiznání) for a period, computed from the documents as they are now. Not the filed return: whether one was filed comes from taxFilings.status. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `year` | `integer` | yes | min 2004, max 2100 | | `month` | `integer` | no | min 1, max 12 | | `quarter` | `integer` | no | min 1, max 4 | ## vatControlStatement ### vatControlStatement.preview `POST /api/v1/actions/vatControlStatement.preview` · access: read Preview the VAT control statement for a period. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `year` | `integer` | yes | min 2004, max 2100 | | `month` | `integer` | no | min 1, max 12 | | `quarter` | `integer` | no | min 1, max 4 | ## ecSalesList ### ecSalesList.preview `POST /api/v1/actions/ecSalesList.preview` · access: read Preview the EC sales list for a period. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `year` | `integer` | yes | min 2004, max 2100 | | `month` | `integer` | no | min 1, max 12 | | `quarter` | `integer` | no | min 1, max 4 | ## taxFilings ### taxFilings.status `POST /api/v1/actions/taxFilings.status` · access: read Get the filing status of a VAT form (vat_return, control_statement, ec_sales_list) for a period. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `form` | `"vat_return" \| "control_statement" \| "ec_sales_list"` | yes | | | `period` | `object` | yes | | | `period.year` | `integer` | yes | min 2004, max 2100 | | `period.month` | `integer` | no | min 1, max 12 | | `period.quarter` | `integer` | no | min 1, max 4 | ## sales ### sales.sources.list `POST /api/v1/actions/sales.sources.list` · access: read List the sources of sales without invoices (e-shop, gateway, file import) with their sale counts. ### sales.record `POST /api/v1/actions/sales.record` · access: write Record sales without an invoice (e-shop orders, gateway payments, refunds). Moniary works out the VAT and files them. The same externalId updates the sale. Up to 500 per call, one result each. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `source` | `string` | no | Name (or id) of the sales source, e.g. your shop. Created on first use; "API" when left out. · max 120 znaků | | `sourceDefaults` | `object` | no | Settings for a source created by this call (supplyKind, pricesIncludeVat, currency, defaultCountry). Ignored when the source exists. | | `sourceDefaults.supplyKind` | `"goods" \| "services" \| "electronic_services"` | no | What the source mostly sells: goods, services or electronic_services. | | `sourceDefaults.pricesIncludeVat` | `boolean` | no | The amounts of this source include VAT (consumer prices). | | `sourceDefaults.currency` | `string` | no | Default currency, ISO 4217. · max 3 znaků | | `sourceDefaults.defaultCountry` | `string \| null` | no | Country used when a sale has none, ISO 3166-1 alpha-2. · max 2 znaků | | `sourceDefaults.paymentMethod` | `"cash" \| "card" \| "transfer" \| "online" \| "other" \| null` | no | How customers of this source usually pay, used when a sale has no paymentMethod. | | `sourceDefaults.platformBusinessId` | `string \| null` | no | The platform that sells in its own name (merchant of record); the sales are supplies to it. | | `sales` | `object[]` | yes | Up to 500 sales per call. · max 500 položek | ## vouchers ### vouchers.templates.list `POST /api/v1/actions/vouchers.templates.list` · access: read List the workspace's saved gift voucher templates (name, look, title, validity in months, logo and photo). ### vouchers.templates.get `POST /api/v1/actions/vouchers.templates.get` · access: read One gift voucher template by id. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `id` | `string` | yes | | ### vouchers.templates.presets `POST /api/v1/actions/vouchers.templates.presets` · access: read The starter gift voucher looks (presetId, names and styles) a voucher can be created from without a saved template. ### vouchers.list `POST /api/v1/actions/vouchers.list` · access: read List gift vouchers with status (awaiting_payment, active, used, expired, blocked, cancelled, refunded), year and search filters and paging; returns voucher rows with customer name, face value and balance. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `status` | `"awaiting_payment" \| "issuing" \| "active" \| "used" \| "expired" \| "blocked" \| "cancelled" \| "refunded" \| "refunding" \| "all"` | no | | | `year` | `integer` | no | min 2000, max 2100 | | `search` | `string` | no | max 200 znaků | | `page` | `integer` | no | min 0 | | `pageSize` | `integer` | no | min 1, max 100 | ### vouchers.get `POST /api/v1/actions/vouchers.get` · access: read One gift voucher by id: customer, balance, redemptions and linked documents (proforma, sale invoice, credit note). | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `id` | `string` | yes | | ### vouchers.getByCode `POST /api/v1/actions/vouchers.getByCode` · access: read Look up a gift voucher by the code printed on it: status, remaining balance, expiry and redemptions. Use it to check a voucher a customer presents. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `code` | `string` | yes | max 64 znaků | ### vouchers.create `POST /api/v1/actions/vouchers.create` · access: write Create a gift voucher in CZK: customerId, or recipient name and e-mail (existing contact reused). kind value or service (needs serviceName). Look: templateId or presetId. Issues the proforma and e-mails it unless sendEmail is false. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `customerId` | `string` | no | | | `customer` | `object` | no | | | `customer.name` | `string` | yes | max 200 znaků | | `customer.email` | `string` | yes | max 320 znaků | | `kind` | `"value" \| "service"` | yes | | | `faceValue` | `number` | yes | | | `serviceName` | `string` | no | max 200 znaků | | `vatRate` | `number \| "mixed"` | no | One VAT rate: single-purpose voucher, VAT due at sale. "mixed": multi-purpose, VAT due at redemption. Omit for the workspace default. · min 0, max 100 | | `supplyKind` | `"goods" \| "services" \| "electronic_services"` | no | | | `templateId` | `string` | no | A saved voucher template (vouchers.templates.list). | | `presetId` | `"universal" \| "birthday" \| "christmas" \| "valentine" \| "wellness" \| "elegant" \| "gastro" \| "travel" \| "kids" \| "spring" \| "sport" \| "parents_day"` | no | A starter look (vouchers.templates.presets). Omit both templateId and presetId for the universal look. | | `font` | `"modern" \| "classic" \| "elegant" \| "handwritten" \| "playful"` | no | Font pair; omit for the look's own font. | | `title` | `string` | no | max 120 znaků | | `recipientName` | `string` | no | max 120 znaků | | `message` | `string` | no | max 600 znaků | | `language` | `"cs" \| "en"` | no | | | `expiresOn` | `string \| null` | no | | | `deliveryEmail` | `string` | no | max 320 znaků | | `sendEmail` | `boolean` | no | | ### vouchers.redeem `POST /api/v1/actions/vouchers.redeem` · access: write Redeem part or all of a gift voucher's balance, identified by id or code (not both). Records the sale, or pays the issued invoice given as invoiceId. amount cannot exceed the balance. | Parameter | Type | Required | Notes | | --- | --- | --- | --- | | `id` | `string` | no | | | `code` | `string` | no | max 64 znaků | | `amount` | `number` | yes | | | `redeemedOn` | `string` | no | | | `vatRate` | `number` | no | min 0, max 100 | | `supplyKind` | `"goods" \| "services" \| "electronic_services"` | no | | | `invoiceId` | `string` | no | | | `note` | `string` | no | max 500 znaků |