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 |
| RECONCILING | The document’s reconciliation lines are being reconciled with the books |
| 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 |
| has_open_question | boolean | Filter vouchers with/without an open accounting question (see Questions) |
| 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) |
Dot-notation aliases
The parameters that filter on the voucher’s document or on its journal entry lines also accept a prefixed form. When both are sent, the prefixed one wins.
| Parameter | Prefixed alias |
|---|---|
| document_type | document.document_type |
| document_status | document.document_status |
| payment_status | document.payment_status |
| document_date_from | document.document_date_from |
| document_date_to | document.document_date_to |
| due_date_from | document.due_date_from |
| due_date_to | document.due_date_to |
| account_code | journal_entry.lines.account_code |
| tax_code | journal_entry.lines.tax_code |
| posting_date_from | journal_entry.lines.posting_date_from |
| posting_date_to | journal_entry.lines.posting_date_to |
Document payment filters
These filter on the voucher’s document and are only available in the prefixed form. See Documents for what each flag means.
| Parameter | Type | Description |
|---|---|---|
| document.pending_payment_amount | decimal | Filter by the document’s pending payment-request amount — an exact match, so 0 finds documents with nothing pending |
| document.is_payable | boolean | Filter by whether the document can be paid |
| document.is_unpaid | boolean | Filter by whether the document has an outstanding balance |
| document.is_available_for_payment | boolean | Filter by whether the document is available for payment |
| document.is_being_paid | boolean | Filter by whether the document has a pending payment request |
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
}
}
Error Responses
| Code | HTTP Status | Description |
|---|---|---|
voucher.source_missing_embedding |
400 | The similar_to voucher has no embedding, so similarity search is unavailable for it |
voucher.client_account_access_denied |
403 | A requested client_account_id is outside your eligible accounts |
voucher.source_access_denied |
403 | No access to the similar_to voucher |
voucher.source_not_found |
404 | The similar_to voucher was not found |
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
| Code | HTTP Status | Description |
|---|---|---|
voucher.access_denied |
403 | No access to voucher |
voucher.not_found |
404 | Voucher not found |
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.
- Its documents have reconciliation lines referenced by a live (non-archived) external reconciliation record.
- 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
| Code | HTTP Status | Description |
|---|---|---|
common.validation_error |
400 | Voucher cannot be deleted because of relations to posted journal entries, documents, or reconciliations |
voucher.access_denied |
403 | No access to voucher |
voucher.not_found |
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
| Code | HTTP Status | Description |
|---|---|---|
voucher.invalid_voucher_ids |
400 | voucher_ids missing or not a list |
voucher.invalid_source_action |
400 | Invalid source_action value |
voucher.merge_failed |
400 | The merge was rejected: fewer than 2 IDs, sources in different client accounts, source_action is DELETE but a source has posted journal entries, or no PDF-able files were found |
voucher.access_denied |
403 | No access to one of the specified vouchers — details.voucher_id identifies it |
voucher.not_found |
404 | A voucher ID was not found — details.voucher_id identifies it |
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
| Code | HTTP Status | Description |
|---|---|---|
voucher.invalid_voucher_id |
400 | voucher_id missing or not an integer |
voucher.invalid_page_ranges |
400 | page_ranges missing, not a list, or a range is not a list of exactly 2 integers — details.index identifies the offending range |
voucher.invalid_source_action |
400 | Invalid source_action value |
voucher.split_failed |
400 | The split was rejected: fewer than 2 ranges, voucher is not a PDF or has only one page, a range is out of bounds, starts after it ends or overlaps another, or source_action is DELETE but the voucher has posted journal entries |
voucher.access_denied |
403 | No access to the voucher — details.voucher_id identifies it |
voucher.not_found |
404 | Voucher not found — details.voucher_id identifies it |
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
| Code | HTTP Status | Description |
|---|---|---|
voucher.access_denied |
403 | No access to the voucher’s client account |
voucher.not_found |
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
| Code | HTTP Status | Description |
|---|---|---|
common.validation_error |
400 | Invalid item category, purpose, or tag validation failure |
voucher.access_denied |
403 | No access to the voucher’s client account |
voucher.not_found |
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