Vouchers
Vouchers represent financial documents in the system that can be linked to various entities such as documents, journal entries, and collections. They form a crucial part of the financial document management system.
Status Values
Voucher Status
| Value | Description |
|——-|————-|
| PENDING | Initial state, voucher awaiting processing |
| DRAFT | Voucher is being worked on, can be modified |
| ARCHIVED | Voucher has been archived and is no longer active |
| BOOKED | Voucher has been posted to the accounting system |
| DELETED | Voucher has been marked as deleted |
Document Types
Accounts Receivable Documents
| Value | Description |
|——-|————-|
| ARINV | AR Invoice - Customer invoice |
| ARCRN | AR Credit Note - Customer credit note |
| ARCIN | AR Cash Invoice - Customer cash invoice |
| ARPIN | AR Proforma Invoice - Customer proforma invoice |
| ARDEB | AR Debt Collection - Customer debt collection document |
Accounts Payable Documents
| Value | Description |
|——-|————-|
| APINV | AP Invoice - Supplier invoice |
| APCRN | AP Credit Note - Supplier credit note |
| RECPT | AP Receipt - Supplier receipt |
| APCIN | AP Cash Invoice - Supplier cash invoice |
| APPIN | AP Proforma Invoice - Supplier proforma invoice |
| APDEB | AP Debt Collection - Supplier debt collection document |
Settlement Documents
| Value | Description |
|——-|————-|
| PAYSR | Payment Settlement Report |
| SALSM | Sales Summary |
| VATST | VAT Settlement - For payment of VAT |
| VATRP | VAT Report - For reporting VAT |
Payroll Documents
| Value | Description |
|——-|————-|
| PRRUN | Payroll Run |
| PRPAY | Payroll Payment List |
| PRTAX | Payroll Tax Settlement |
Workflow Status
| Value | Description |
|——-|————-|
| IMAGE_PROCESSING | Document image is being processed and text extracted |
| STARTING_WORKFLOW | Initial workflow setup is in progress |
| CLASSIFICATION | Document type is being determined |
| DATA_EXTRACTION | Relevant data is being extracted from the document |
| WAITING_FOR_ANSWER | Workflow is paused waiting for user input |
| DUPLICATE_CHECK | Checking for duplicate documents |
| BOOKING | Document is being posted to the accounting system |
| CANCELLED | Workflow has been cancelled |
| FAILED | Workflow failed and requires manual intervention |
| COMPLETED | Workflow has completed successfully |
List Vouchers
GET /api/v2/vouchers
Retrieves a paginated list of vouchers based on specified filters.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| client_account_id | integer[] | Filter by specific client account IDs |
| status | string[] | Filter by voucher status (see Voucher Status table above) |
| document_type | string[] | Filter by document type (see Document Types tables above) |
| document_status | string[] | Filter by document status |
| payment_status | string[] | Filter by payment status |
| document_date_from | date | Filter by document date range start (YYYY-MM-DD) |
| document_date_to | date | Filter by document date range end (YYYY-MM-DD) |
| due_date_from | date | Filter by due date range start (YYYY-MM-DD) |
| due_date_to | date | Filter by due date range end (YYYY-MM-DD) |
| business_partner_id | integer[] | Filter by business partner IDs |
| collection_id | integer[] | Filter by collection IDs |
| project_id | integer[] | Filter by project IDs |
| account_code | string[] | Filter by GL account codes on the voucher’s journal entry lines |
| tax_code | string[] | Filter by tax codes on the voucher’s journal entry lines |
| posting_date_from | date | Filter by journal entry posting date range start (YYYY-MM-DD) |
| posting_date_to | date | Filter by journal entry posting date range end (YYYY-MM-DD) |
| free_text | string | Search across voucher fields and related documents |
| similar_to | integer | Find vouchers similar to the given voucher ID (vector similarity search; the source voucher must have an embedding) |
| has_project | boolean | Filter vouchers with/without projects |
| has_collection | boolean | Filter vouchers with/without collections |
| has_journal_entry | boolean | Filter vouchers with/without journal entries |
| has_document | boolean | Filter vouchers with/without documents |
| has_attachment | boolean | Filter vouchers with/without attachments |
| order_by | string | Sort field and direction (e.g., “created_at desc”) |
| with | string[] | Include related objects in response |
| page | integer | Page number for pagination (default: 1) |
| per_page | integer | Items per page (default: 100) |
Response Fields
A voucher is an uploaded file, so every response also includes the base uploaded-file fields in addition to the voucher-specific ones below.
| Field | Type | Description |
|---|---|---|
| id | integer | Unique identifier |
| created_at | datetime | Creation timestamp |
| created_by_id | integer | User who created the voucher |
| updated_at | datetime | Last update timestamp |
| updated_by_id | integer | User who last updated the voucher |
| client_account_id | integer | The client account this voucher belongs to |
| type | string | The document type (see Document Types tables above) |
| file_name | string | Original file name |
| content_type | string | MIME type of the file |
| channel | string | How the file was received (e.g. email, upload) |
| processing_track | string | Processing pipeline track for the file |
| size | integer | File size in bytes |
| is_active | boolean | Whether the voucher is active |
| thumbnail_url | string or null | Presigned URL to a thumbnail image |
| preview_url | string or null | Presigned URL to a high-resolution preview image |
| download_url | string or null | Presigned URL to download the (optimized) file |
| original_url | string or null | Presigned URL to download the original, unmodified file |
| page_images | array | Per-page preview images: {page_number, preview_url} |
| document_date | date | Date of the voucher document |
| status | string | Current status of the voucher (see Voucher Status table above) |
| collection_id | integer | ID of associated collection |
| project_id | integer | ID of associated project |
| workflow_status | string | Current workflow status (see Workflow Status table above) |
Related Objects
The following related objects can be included using the with parameter:
attachments: Associated file attachmentsdocuments: Linked commercial documentsdocument: Primary documentjournal_entries: Associated journal entriesjournal_entry: Primary journal entrystatements: Associated statementsstatement: Primary statementtasks: Related worker tasksquestions: Associated accounting questionscollection: Associated voucher collectionproject: Associated project
Example Request
GET /api/v2/vouchers?status=PENDING&document_date_from=2024-01-01&with=documents,journal_entries
Array-valued parameters (status, document_type, with, etc.) take a single query value with items separated by comma, semicolon, or space — not repeated key[]= params.
Example Response
{
"data": [
{
"id": 1234,
"created_at": "2024-01-15T10:30:00Z",
"client_account_id": 7,
"type": "APINV",
"file_name": "invoice.pdf",
"content_type": "application/pdf",
"channel": "email",
"size": 84213,
"is_active": true,
"thumbnail_url": "https://...",
"preview_url": "https://...",
"download_url": "https://...",
"original_url": "https://...",
"page_images": [],
"document_date": "2024-01-15",
"status": "PENDING",
"collection_id": 567,
"project_id": 890,
"workflow_status": "DATA_EXTRACTION",
"documents": [
{
"id": 456,
"type": "APINV",
"status": "PENDING"
}
],
"journal_entries": [
{
"id": 789,
"posting_date": "2024-01-15",
"status": "DRAFT"
}
]
}
],
"meta": {
"records": 45,
"per_page": 100,
"page": 1,
"pages": 1
}
}
Get Single Voucher
GET /api/v2/vouchers/{id}
Retrieves a specific voucher by ID.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id | integer | Voucher ID |
Example Request
GET /api/v2/vouchers/1234?with[]=documents&with[]=journal_entries
Example Response
{
"id": 1234,
"created_at": "2024-01-15T10:30:00Z",
"client_account_id": 7,
"type": "APINV",
"file_name": "invoice.pdf",
"content_type": "application/pdf",
"channel": "email",
"size": 84213,
"is_active": true,
"thumbnail_url": "https://...",
"preview_url": "https://...",
"download_url": "https://...",
"original_url": "https://...",
"page_images": [],
"document_date": "2024-01-15",
"status": "PENDING",
"collection_id": 567,
"project_id": 890,
"workflow_status": "DATA_EXTRACTION",
"documents": [
{
"id": 456,
"type": "APINV",
"status": "PENDING"
}
],
"journal_entries": [
{
"id": 789,
"posting_date": "2024-01-15",
"status": "DRAFT"
}
]
}
Error Responses
| Status Code | Description |
|---|---|
| 404 | Voucher not found |
| 403 | No access to voucher |
Delete Voucher
DELETE /api/v2/vouchers/{id}
Permanently deletes a voucher along with its draft journal entries and draft documents. Returns 204 No Content on success.
Deletion is rejected when the voucher still has accounting relations that must be preserved:
- It has posted (non-cancelled) journal entries.
- It has posted (non-cancelled) documents.
- It has accounts-receivable documents created in-app (sendable documents).
In these cases the request fails with 400 Bad Request and the standard v2 error envelope ({"error": {"code", "message", "request_id"}}), with message describing the relation that blocked the deletion.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id | integer | Voucher ID |
Error Responses
| Status Code | Description |
|---|---|
| 400 | Voucher cannot be deleted because of relations to posted journal entries or documents |
| 403 | No access to voucher |
| 404 | Voucher not found |
Endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | /vouchers | List vouchers |
| GET | /vouchers/{id} | Get a single voucher |
| DELETE | /vouchers/{id} | Delete a voucher |
| POST | /vouchers/merge | Merge multiple vouchers into one |
| POST | /vouchers/split | Split a multi-page voucher |
| GET | /vouchers/{id}/statements | List statements for a voucher |
| POST | /vouchers/{id}/statements | Create a statement for a voucher |
Merge Vouchers
POST /api/v2/vouchers/merge
Merges multiple vouchers into a single PDF voucher. PDFs and images from the source vouchers are combined into one document. Non-PDF files (Word, Excel, etc.) are transferred as attachments on the merged voucher. The page order in the merged PDF follows the order of the voucher_ids array.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| voucher_ids | integer[] | Yes | List of voucher IDs to merge. Must contain at least 2 IDs. Order determines page order in the merged PDF |
| source_action | string | No | What to do with source vouchers after merge. Default: NONE |
Source Action Values
| Value | Description |
|---|---|
NONE |
Keep source vouchers unchanged |
ARCHIVE |
Archive the documents associated with the source vouchers |
DELETE |
Delete the source vouchers. Fails if any source voucher has posted journal entries |
Example Request
{
"voucher_ids": [101, 102, 103],
"source_action": "ARCHIVE"
}
Example Response (201 Created)
Returns the merged voucher with the same shape as Get Single Voucher (abbreviated here):
{
"id": 200,
"created_at": "2026-04-10T08:30:00Z",
"type": "APINV",
"document_date": "2026-04-10",
"status": "PENDING",
"collection_id": null,
"project_id": null,
"workflow_status": null
}
Error Responses
| Status | Description |
|---|---|
| 400 | voucher_ids missing, not a list, or contains fewer than 2 IDs |
| 400 | Invalid source_action value |
| 400 | Source vouchers belong to different client accounts |
| 400 | source_action is DELETE but a source voucher has posted journal entries |
| 400 | No PDF-able files found in the selected vouchers |
| 403 | No access to one of the specified vouchers |
| 404 | A voucher ID was not found |
Split Voucher
POST /api/v2/vouchers/split
Splits a multi-page PDF voucher into multiple vouchers by page ranges. Each page range produces a new voucher. Pages are 1-indexed and ranges are inclusive. If the source voucher has a statement, it is copied to all new vouchers.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| voucher_id | integer | Yes | ID of the PDF voucher to split |
| page_ranges | integer[][] | Yes | List of [start_page, end_page] pairs. Must contain at least 2 ranges. Pages are 1-indexed and inclusive |
| source_action | string | No | What to do with the source voucher after split. Default: NONE |
The source_action values are the same as for Merge Vouchers.
Example Request
{
"voucher_id": 456,
"page_ranges": [[1, 2], [3, 5], [6, 6]],
"source_action": "DELETE"
}
Example Response (201 Created)
Returns an array of newly created vouchers (same shape as Get Single Voucher, abbreviated here), one per page range:
[
{
"id": 457,
"created_at": "2026-04-10T09:00:00Z",
"document_date": "2026-04-10",
"status": "PENDING",
"collection_id": null,
"project_id": null,
"workflow_status": null
},
{
"id": 458,
"created_at": "2026-04-10T09:00:00Z",
"document_date": "2026-04-10",
"status": "PENDING",
"collection_id": null,
"project_id": null,
"workflow_status": null
},
{
"id": 459,
"created_at": "2026-04-10T09:00:00Z",
"document_date": "2026-04-10",
"status": "PENDING",
"collection_id": null,
"project_id": null,
"workflow_status": null
}
]
Error Responses
| Status | Description |
|---|---|
| 400 | voucher_id missing or not an integer |
| 400 | page_ranges missing, not a list, or contains fewer than 2 ranges |
| 400 | A page range is not a list of exactly 2 integers |
| 400 | Invalid source_action value |
| 400 | Voucher is not a PDF |
| 400 | Voucher has only one page |
| 400 | Page range is out of bounds |
| 400 | Start page is greater than end page in a range |
| 400 | Page ranges overlap |
| 400 | source_action is DELETE but voucher has posted journal entries |
| 403 | No access to the voucher |
| 404 | Voucher not found |
Voucher Statements
Voucher statements capture user-provided metadata about a voucher, such as the expense purpose, item categories, payment method, and payor. They are used during the document processing workflow to enrich vouchers with accounting-relevant information. Creating or updating a statement can trigger automatic updates to the linked journal entry (e.g. setting the project dimension) and influence the document posting workflow.
List Voucher Statements
GET /api/v2/vouchers/{id}/statements
Returns a paginated list of statements for a specific voucher, ordered by creation date (newest first).
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id | integer | Voucher ID |
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| page | integer | No | Page number (default: 1) |
| per_page | integer | No | Items per page (default: 100) |
| with | string | No | Include related resources (supported: created_by, payor, project, collection, tags) |
Response
{
"data": [
{
"id": 10,
"created_by_id": 7,
"created_at": "2026-04-10T09:15:00Z",
"client_account_id": 7,
"voucher_id": 1234,
"voucher_category_id": 2,
"item_categories": "ELECTRONICS,SOFTWARE_CLOUD_SERVICES",
"purpose": "WORKPLACE_EQUIPMENT",
"participant_information": null,
"additional_information": "New laptop for development team",
"payment_method": "BUSINESS_CARD",
"payor_id": null,
"project_id": 5,
"collection_id": null
}
],
"meta": {
"page": 1,
"pages": 1,
"per_page": 100,
"records": 1
}
}
Error Responses
| Status | Description |
|---|---|
| 403 | No access to the voucher’s client account |
| 404 | Voucher not found |
Create Voucher Statement
POST /api/v2/vouchers/{id}/statements
Creates a new statement for a voucher. When a statement is created, the system may automatically update the linked journal entry’s project dimension and manage document posting workflow tasks.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id | integer | Voucher ID |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| voucher_category_id | integer | No | Voucher category ID |
| item_categories | string | No | Comma-separated item categories (see Item Categories below) |
| purpose | string | No | Expense purpose (see Purpose Values below) |
| participant_information | string | No | Details about event participants (max 500 characters) |
| additional_information | string | No | Additional notes (max 500 characters) |
| payment_method | string | No | How the expense was paid (see Payment Methods below) |
| payor_id | integer | No | Business partner ID of the person who paid |
| project_id | integer | No | Project to associate with this expense |
| collection_id | integer | No | Voucher collection ID |
| tags | array | No | Array of tag objects with id field, e.g. [{"id": 1}, {"id": 2}] |
Example Request
{
"item_categories": "ELECTRONICS",
"purpose": "WORKPLACE_EQUIPMENT",
"payment_method": "BUSINESS_CARD",
"project_id": 5,
"additional_information": "New laptop for development team",
"tags": [{"id": 1}]
}
Response (201 Created)
Returns the created statement object (same shape as list response items).
Error Responses
| Status | Description |
|---|---|
| 400 | Invalid item category, purpose, or tag validation failure |
| 403 | No access to the voucher’s client account |
| 404 | Voucher not found |
Statement Attributes
| Attribute | Type | Description |
|---|---|---|
| id | integer | Unique identifier (read-only) |
| created_by_id | integer | User who created the statement (read-only) |
| created_at | datetime | Creation timestamp (read-only) |
| client_account_id | integer | The client account ID |
| voucher_id | integer | The voucher this statement belongs to |
| voucher_category_id | integer | Voucher category reference |
| item_categories | string | Comma-separated list of item category codes |
| purpose | string | Expense purpose code |
| participant_information | string | Details about participants (for entertainment/events) |
| additional_information | string | Free-text notes |
| payment_method | string | How the expense was paid |
| payor_id | integer | Business partner ID of the payor |
| project_id | integer | Associated project |
| collection_id | integer | Associated voucher collection |
Relationships
| Relationship | Description |
|---|---|
| created_by | The user who created the statement |
| payor | The business partner who paid |
| project | The associated project |
| collection | The associated voucher collection |
| tags | Tags attached to the statement |
Payment Methods
| Value | Description |
|---|---|
PRIVATE_ACCOUNT |
Paid from a personal bank account |
PRIVATE_CARD |
Paid with a personal card |
BUSINESS_ACCOUNT |
Paid from the company bank account |
BUSINESS_CARD |
Paid with a company card |
NOT_PAID |
Not yet paid |
NOT_PAYABLE |
Not payable (e.g. no cost to reimburse) |
OTHER |
Paid by another method |
Purpose Values
| Value | Description |
|---|---|
MAINTENANCE_OF_OWN_ASSETS |
Maintenance or repair of company assets |
BUILD_PHYSICAL_PRODUCT |
Materials for building physical products |
USED_IN_CUSTOMER_PROJECTS |
Expense related to customer project work |
FOR_RESALE |
Goods purchased for resale |
WORKPLACE_EQUIPMENT |
Office and workplace equipment |
INCREASE_SALES |
Marketing, sales, or promotional expenses |
INTERNAL_EMPLOYEE_EVENTS |
Internal events, team activities |
OVERTIME_TRAVEL_INCONVENIENT_WORKING_HOURS |
Travel, overtime, or inconvenient working hours |
Item Categories
The item_categories field accepts one or more of the following enum values, separated by commas. Any other value is rejected with 400 Invalid item category. See Voucher Statements for the full reference.
ELECTRONICS, FOOD, HOUSEHOLD_ITEMS, OFFICE_OR_WAREHOUSE_SPACE, FUEL, VEHICLES, HIRED_LABOR_CONSULTANCY, BROADBAND_TELEPHONY, ELECTRICITY, BUILDING_MATERIALS, SOFTWARE_CLOUD_SERVICES, CLOTHING, TRANSPORT_TRAVEL, TOOLS, FURNITURE_INTERIOR, CLEANING_EQUIPMENT, WELLNESS_ITEMS, ADVERTISING, SHIPPING_POSTAGE_CUSTOMS, INSURANCE, PAYMENT_SERVICES_FEES, MEDICAL_SUPPLIES, BOOKS_MAGAZINES, EDUCATION_TRAINING, ENTERTAINMENT, GIFTS_NOVELTIES, HARDWARE, LEGAL_SERVICES, OUTDOOR_GARDEN, PET_SUPPLIES, SPORTS_FITNESS, TOYS_GAMES, TRAVEL_ACCOMMODATION