Download OpenAPI specification:
Rise API for Rise Bank backend services.
Consistency notes for frontend:
data and meta fields.Authorization:
Glossary:
source: How a purchase invoice was received ('manual' or 'einvoice').invoice_channel: Channel describing how a sales invoice was received (sales invoices).invoicing_channel: Channel describing how an invoice will be sent (sales invoices).bank_account_id: Receiving bank account for sales invoices. For purchase invoices, bank accounts are specified on payment records, not invoices.delegated_by_user_id: User who delegated a purchase invoice to its current assignee.current_assignee_user_id: User currently responsible for acting on a purchase invoice.Retrieve list of available banks (ASPSPs) from Enable Banking for the given country and PSU type. Response is filtered so every entry is a legitimate authorization target: entries whose psu_types do not include the requested psu_type are excluded, and sandbox/test ASPSPs are excluded entirely in production.
| country | string = 2 characters Example: country=FI Country code to filter banks (default: FI) |
| psu_type | string (BankPsuType) Default: "business" Enum: "personal" "business" Example: psu_type=business PSU type to filter banks against. Only ASPSPs whose |
{- "country": "string",
- "banks": [
- {
- "name": "string",
- "country": "string",
- "logo_url": "string",
- "psu_types": [
- "string"
], - "max_consent_validity": 0,
- "max_transactions": 0,
- "currencies": [
- "string"
]
}
]
}Retrieve bank accounts for a company with latest authorization status
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "iban": "string",
- "bic": "string",
- "display_name": "string",
- "aspsp_name": "string",
- "currency": "str",
- "status": "active",
- "authorization_valid_until": "2019-08-24T14:15:22Z",
- "balance": {
- "available": "string",
- "booked": "string"
}, - "payment_channel": "psd2",
- "ws_provider": "op"
}
], - "meta": {
- "count": 9007199254740991
}
}Retrieve bank account details with authorization status
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| bankAccountId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Bank account ID |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "iban": "string",
- "bic": "string",
- "account_holder_name": "string",
- "display_name": "string",
- "aspsp_name": "string",
- "currency": "str",
- "status": "active",
- "authorization_valid_until": "2019-08-24T14:15:22Z",
- "balance": {
- "available": "string",
- "booked": "string"
}, - "payment_channel": "psd2",
- "ws_provider": "op"
}
}Update bank account display name
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| bankAccountId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Bank account ID |
Bank account update data
required | string or null |
{- "display_name": "string"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "iban": "string",
- "bic": "string",
- "account_holder_name": "string",
- "display_name": "string",
- "aspsp_name": "string",
- "currency": "str",
- "status": "active",
- "authorization_valid_until": "2019-08-24T14:15:22Z",
- "balance": {
- "available": "string",
- "booked": "string"
}, - "payment_channel": "psd2",
- "ws_provider": "op"
}
}Revoke authorization for a bank account, stopping automatic transaction syncing while preserving all account and transaction history
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| bankAccountId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Bank account ID |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "iban": "string",
- "bic": "string",
- "account_holder_name": "string",
- "display_name": "string",
- "aspsp_name": "string",
- "currency": "str",
- "status": "active",
- "authorization_valid_until": "2019-08-24T14:15:22Z",
- "balance": {
- "available": "string",
- "booked": "string"
}, - "payment_channel": "psd2",
- "ws_provider": "op"
}
}Retrieve transactions across all bank accounts for a company
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| bank_account_id | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Filter by bank account ID |
| limit | integer [ 1 .. 100 ] Example: limit=10 Maximum number of results to return (1-100, default: 10) |
| cursor | string Pagination cursor from previous response |
{- "data": [
- {
- "id": "string",
- "bank_booking_date": "2019-08-24",
- "value_date": "2019-08-24",
- "amount": "string",
- "currency": "string",
- "counterparty_name": "string",
- "counterparty_iban": "string",
- "filing_id": "string",
- "status": "draft",
- "reference_number": "string",
- "remittance_information": [
- "string"
], - "created_at": "2019-08-24T14:15:22Z",
- "unsettled_amount": "string",
- "reconciliation_attempted_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "pagination": {
- "limit": 1,
- "has_more": true,
- "next_cursor": "string"
}
}
}Retrieve transaction details for a company
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| transactionId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Transaction ID |
{- "data": {
- "id": "string",
- "upstream_id": "string",
- "company_id": "string",
- "bank_account_id": "string",
- "counterparty_name": "string",
- "status": "draft",
- "reference_number": "string",
- "remittance_information": [
- "string"
], - "amount": "string",
- "unsettled_amount": "string",
- "currency": "string",
- "description": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "counterparty_iban": "string",
- "bank_booking_date": "2019-08-24",
- "value_date": "2019-08-24",
- "filing_id": "string",
- "reconciliation_attempted_at": "2019-08-24T14:15:22Z"
}
}Retrieve company details including settings and bank accounts
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "business_id": "string",
- "vat_number": "string",
- "edi_identifier": "string",
- "email": "string",
- "phone": "string",
- "domicile": "string",
- "default_locale": "string",
- "default_approver_user_id": "112108a8-a3eb-4f2a-9b05-1bbb5d7dd275",
- "business_description": "string",
- "accountant_notes": "string",
- "business_targets": "string",
- "address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "settings": {
- "default_receive_bank_account_id": "4e105562-cb3e-4d88-8da0-44cb487c3051",
- "vat": {
- "payable_account_code": "string",
- "receivable_account_code": "string",
- "settlement_account_code": "string"
}
}, - "accounts": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "account_holder_name": "string",
- "iban": "string",
- "bic": "string",
- "currency_code": "string"
}
]
}Update company fields and settings. All fields are optional; omitting a field leaves it unchanged. Pass null for a nullable field to clear it. For address: omit to keep current, pass null to unlink, pass an object to create or update. Within settings.vat, pass null for payable_account_code or receivable_account_code to reset it to the default, or for settlement_account_code to unset it.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Company fields to update (all optional)
| name | string Company name |
string or null Business ID (registration number) | |
string or null VAT number | |
string or null EDI identifier | |
string or null Company email | |
string or null Company phone | |
string or null Domicile | |
| default_locale | string Enum: "fi-FI" "en-US" Default locale |
string or null Default approver user ID; must be a member of the company when non-null | |
string or null Freeform business/onboarding summary | |
string or null Accountant-authored handling rules | |
string or null Freeform business performance targets | |
object or null Company address | |
object Company settings |
{- "name": "string",
- "business_id": "string",
- "vat_number": "string",
- "edi_identifier": "string",
- "email": "string",
- "phone": "string",
- "domicile": "string",
- "default_locale": "fi-FI",
- "default_approver_user_id": "112108a8-a3eb-4f2a-9b05-1bbb5d7dd275",
- "business_description": "string",
- "accountant_notes": "string",
- "business_targets": "string",
- "address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "settings": {
- "default_receive_bank_account_id": "4e105562-cb3e-4d88-8da0-44cb487c3051",
- "vat": {
- "payable_account_code": "string",
- "receivable_account_code": "string",
- "settlement_account_code": "string"
}
}
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "business_id": "string",
- "vat_number": "string",
- "edi_identifier": "string",
- "email": "string",
- "phone": "string",
- "domicile": "string",
- "default_locale": "string",
- "default_approver_user_id": "112108a8-a3eb-4f2a-9b05-1bbb5d7dd275",
- "business_description": "string",
- "accountant_notes": "string",
- "business_targets": "string",
- "address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "settings": {
- "default_receive_bank_account_id": "4e105562-cb3e-4d88-8da0-44cb487c3051",
- "vat": {
- "payable_account_code": "string",
- "receivable_account_code": "string",
- "settlement_account_code": "string"
}
}, - "accounts": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "account_holder_name": "string",
- "iban": "string",
- "bic": "string",
- "currency_code": "string"
}
]
}Create a new company. Requires a platform-level role with companies.write permission.
Company creation data
| name required | string |
| business_id required | string |
object | |
| default_locale | string Enum: "fi-FI" "en-US" |
string or null Freeform business/onboarding summary | |
string or null Accountant-authored handling rules | |
string or null Freeform business performance targets |
{- "name": "string",
- "business_id": "string",
- "address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "st"
}, - "default_locale": "fi-FI",
- "business_description": "string",
- "accountant_notes": "string",
- "business_targets": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "business_id": "string"
}List all companies on the platform. Requires a platform-level role with companies.read permission.
| limit | integer [ 1 .. 100 ] Example: limit=50 Maximum number of results to return (1-100, default: 50) |
| cursor | string Pagination cursor from previous response |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "business_id": "string"
}
], - "meta": {
- "pagination": {
- "limit": 1,
- "has_more": true,
- "next_cursor": "string"
}
}
}Publish company information to Netbox system.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "is_created_in_netbox": true
}Returns a tree of documents related to the specified document via settlements. The depth parameter controls how many levels of relationships to include (1-3). Documents are connected through settlements, showing the network of documents that have been settled together.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| documentId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Document ID |
| depth | integer [ 1 .. 3 ] Relationship tree depth (1-3, default: 1) |
[- {
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "type": "bank_transaction",
- "voucher_number": "string",
- "amount": "string",
- "currency": "string",
- "kind": "invoice",
- "relationships": [
- {
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "type": "bank_transaction",
- "voucher_number": "string",
- "amount": "string",
- "currency": "string",
- "kind": "invoice",
- "relationships": [
- {
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "type": "bank_transaction",
- "voucher_number": "string",
- "amount": "string",
- "currency": "string",
- "kind": "invoice",
- "relationships": [
- null
]
}
]
}
]
}
]List expense claims for a company with cursor-based pagination.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| limit | integer [ 1 .. 100 ] Maximum number of results to return (1-100, default: 10) |
| cursor | string Pagination cursor from previous response |
| status | string (SalesInvoiceItems) Enum: "draft" "approved" "rejected" "voided" Filter by document status |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "expense_date": "2019-08-24",
- "description": "string",
- "expense_type": "travel_costs",
- "currency_code": "string",
- "amount": "string",
- "unsettled_amount": "string",
- "status": "draft",
- "claimant": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "payment_status": "paid",
- "lines_count": -9007199254740991,
- "files_count": -9007199254740991,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "pagination": {
- "limit": 1,
- "has_more": true,
- "next_cursor": "string"
}
}
}Create a new expense claim document with line items and optional file attachments.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Expense claim creation data
| expense_date required | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Expense date (YYYY-MM-DD) |
| description required | string non-empty Expense claim description |
| expense_type required | string (ExpenseClaimExpenseType) Enum: "travel_costs" "representation_events" "refreshments" "meeting_and_negotiation" "accommodation" "travel_tickets" "other_expenses" "parking" "internal_meetings_and_staff_events" "taxi" "office_supplies" Expense type |
| currency_code required | string = 3 characters Currency code (e.g., EUR) |
required | Array of objects non-empty Expense claim lines |
| files | Array of strings <uuid> [ items <uuid >^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... ] Optional array of file IDs to attach (replaces all existing files when provided; pass an empty array to clear all files) |
{- "expense_date": "2019-08-24",
- "description": "string",
- "expense_type": "travel_costs",
- "currency_code": "str",
- "lines": [
- {
- "title": "string",
- "amount": "string",
- "vat_rate": "string"
}
], - "files": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "expense_date": "2019-08-24",
- "description": "string",
- "expense_type": "travel_costs",
- "currency_code": "string",
- "amount": "string",
- "unsettled_amount": "string",
- "status": "draft",
- "claimant": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "approved_by": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "approved_at": "2019-08-24T14:15:22Z",
- "voided_at": "2019-08-24T14:15:22Z",
- "voided_by": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "payment_status": "paid",
- "lines": [
- {
- "id": "string",
- "title": "string",
- "amount": "string",
- "vat_rate": "string"
}
], - "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Retrieve expense claim details by ID
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| expenseClaimId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Expense claim ID (document ID) |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "expense_date": "2019-08-24",
- "description": "string",
- "expense_type": "travel_costs",
- "currency_code": "string",
- "amount": "string",
- "unsettled_amount": "string",
- "status": "draft",
- "claimant": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "approved_by": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "approved_at": "2019-08-24T14:15:22Z",
- "voided_at": "2019-08-24T14:15:22Z",
- "voided_by": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "payment_status": "paid",
- "lines": [
- {
- "id": "string",
- "title": "string",
- "amount": "string",
- "vat_rate": "string"
}
], - "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Partially update an expense claim. When lines or files are provided they replace existing ones and total amount is recalculated. Updates are allowed only while the document is in draft status.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| expenseClaimId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Expense claim ID (document ID) |
Expense claim update data (partial updates supported)
| expense_date | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Expense date (YYYY-MM-DD) |
| description | string non-empty Expense claim description |
| expense_type | string (ExpenseClaimExpenseType) Enum: "travel_costs" "representation_events" "refreshments" "meeting_and_negotiation" "accommodation" "travel_tickets" "other_expenses" "parking" "internal_meetings_and_staff_events" "taxi" "office_supplies" Expense type |
| currency_code | string = 3 characters Currency code (e.g., EUR) |
Array of objects Expense claim lines (replaces existing lines when provided; pass an empty array to clear all lines) | |
| files | Array of strings <uuid> [ items <uuid >^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... ] Optional array of file IDs to attach (replaces all existing files when provided; pass an empty array to clear all files) |
{- "expense_date": "2019-08-24",
- "description": "string",
- "expense_type": "travel_costs",
- "currency_code": "str",
- "lines": [
- {
- "title": "string",
- "amount": "string",
- "vat_rate": "string"
}
], - "files": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "expense_date": "2019-08-24",
- "description": "string",
- "expense_type": "travel_costs",
- "currency_code": "string",
- "amount": "string",
- "unsettled_amount": "string",
- "status": "draft",
- "claimant": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "approved_by": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "approved_at": "2019-08-24T14:15:22Z",
- "voided_at": "2019-08-24T14:15:22Z",
- "voided_by": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "payment_status": "paid",
- "lines": [
- {
- "id": "string",
- "title": "string",
- "amount": "string",
- "vat_rate": "string"
}
], - "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Transitions an approved expense claim to voided status. The audit trail (approved_by, approved_at) is preserved; voided_by and voided_at are set on void. Voiding is blocked if payment has been scheduled.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| expenseClaimId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Expense claim ID (document ID) |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "expense_date": "2019-08-24",
- "description": "string",
- "expense_type": "travel_costs",
- "currency_code": "string",
- "amount": "string",
- "unsettled_amount": "string",
- "status": "draft",
- "claimant": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "approved_by": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "approved_at": "2019-08-24T14:15:22Z",
- "voided_at": "2019-08-24T14:15:22Z",
- "voided_by": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "payment_status": "paid",
- "lines": [
- {
- "id": "string",
- "title": "string",
- "amount": "string",
- "vat_rate": "string"
}
], - "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Transitions a draft expense claim to approved status. The caller must be the recorded claimant and the claim must have at least one line. At MVP, the submitter is also the approver (self-approval).
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| expenseClaimId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Expense claim ID (document ID) |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "expense_date": "2019-08-24",
- "description": "string",
- "expense_type": "travel_costs",
- "currency_code": "string",
- "amount": "string",
- "unsettled_amount": "string",
- "status": "draft",
- "claimant": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "approved_by": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "approved_at": "2019-08-24T14:15:22Z",
- "voided_at": "2019-08-24T14:15:22Z",
- "voided_by": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "payment_status": "paid",
- "lines": [
- {
- "id": "string",
- "title": "string",
- "amount": "string",
- "vat_rate": "string"
}
], - "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Create a new file and optionally attach it to a document
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
File creation data
| original_filename required | string [ 1 .. 255 ] characters ^[^\x00-\x1f/\\]{1,250}\.(?:[cC][sS][vV]|[dD]... |
| document_id | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... |
{- "original_filename": "string",
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6"
}{- "id": "7e3e3c32-d6c4-4d90-b1df-cf7bd9f96c98",
- "type": "document",
- "mime_type": "application/pdf",
- "status": "process_completed",
- "original_filename": "invoice.pdf",
- "source": "user",
- "created_at": "2026-03-31T12:00:00.000Z",
- "company_id": "4f7773af-f70f-4d40-a435-a6299fefbfcb",
- "kind": "invoice_purchase",
- "visibility": "company",
- "size_bytes": "234567",
- "tags": [
- "q1-2026"
], - "attached_documents": [ ],
- "s3_path": "companies/4f7773af-f70f-4d40-a435-a6299fefbfcb/files/invoice.pdf",
- "ref_file_id": null,
- "created_by": "73930057-2a35-4b9a-a675-4478e5fd3f4a",
- "metadata": null,
}List files visible to the authenticated caller within the company — their own private files plus every company-visible file they have permission to see, including files attached to accounting documents. By default, excludes files with upload_pending status. Breaking change: prior to this version the endpoint returned only the caller's own unattached files. The old behavior can be reproduced by passing ?created_by=me&attached_to=none.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
FileStatus (string) or "all" (string) Example: status=process_completed Filter by file status. By default, upload_pending files are excluded. Use "all" to include them. | |
| kind | Array of strings (FileKind) <= 11 items unique Items Enum: "receipt" "invoice_purchase" "invoice_sales" "contract" "meeting_minutes" "payslip" "legal_document" "bank_statement" "tax_document" "correspondence" "other" Example: kind=receipt&kind=invoice_purchase Filter by one or more file kinds using repeated query parameters. OR semantics across values. At most 11 values (one per kind); duplicates (exact-match) are rejected with 400. |
| type | Array of strings (FileType) <= 9 items unique Items Enum: "document" "finvoice" "finvoice_attachment" "netbox_message" "pain002" "camt052" "camt053" "camt054" "unknown" Example: type=netbox_message Filter by one or more physical file types using repeated query parameters. OR semantics across values. At most 9 values (one per type); duplicates (exact-match) are rejected with 400. Protocol artifacts ( |
| tag | Array of strings <= 50 items unique [ items [ 1 .. 64 ] characters \S ] Example: tag=q1-2026&tag=legal Filter by one or more tag names using repeated query parameters. AND semantics across values — a file must carry every specified tag. Case-insensitive. Each tag is trimmed; 1–64 characters after trimming. At most 50 values per request; duplicates (exact-match) are rejected with 400 (the case-insensitive dedup happens server-side after normalization). |
| attached_to | Array of strings (FileAttachedToFilter) <= 6 items unique Items Enum: "purchase_invoice" "sales_invoice" "memo" "expense_claim" "bank_transaction" "none" Example: attached_to=purchase_invoice&attached_to=none Filter by document attachment state using repeated query parameters. Use a document kind to match only files attached to that kind of document, or |
string or "me" (string) Example: created_by=me Filter by file creator. Accepts a user UUID or the literal string | |
| q | string [ 1 .. 255 ] characters Example: q=invoice Case-insensitive substring search across |
| sort_by | string (FileSortBy) Enum: "uploaded_at" "name" "size" "kind" Example: sort_by=uploaded_at Sort order for the returned list. Defaults to |
| cursor | string non-empty Cursor for fetching the next page of results. Must match the current |
| limit | integer [ 1 .. 100 ] Example: limit=10 Maximum number of results to return |
{- "data": [
- {
- "id": "7e3e3c32-d6c4-4d90-b1df-cf7bd9f96c98",
- "type": "document",
- "mime_type": "application/pdf",
- "status": "process_completed",
- "original_filename": "invoice.pdf",
- "source": "user",
- "created_at": "2026-03-31T12:00:00.000Z",
- "company_id": "4f7773af-f70f-4d40-a435-a6299fefbfcb",
- "kind": "invoice_purchase",
- "visibility": "company",
- "size_bytes": "234567",
- "tags": [
- "q1-2026"
], - "attached_documents": [
- {
- "kind": "purchase_invoice",
- "document_id": "0d7d2c3a-4b3a-4c1d-9f6e-3e8b1a2f5c8d"
}
]
}, - {
- "id": "c8fa5a78-5a67-4d0b-a8f6-1a5f8bfe4f92",
- "type": "document",
- "mime_type": null,
- "status": "process_completed",
- "original_filename": "mystery-file",
- "source": "user",
- "created_at": "2026-03-31T12:05:00.000Z",
- "company_id": "4f7773af-f70f-4d40-a435-a6299fefbfcb",
- "kind": null,
- "visibility": "private",
- "size_bytes": null,
- "tags": [ ],
- "attached_documents": [ ]
}
], - "meta": {
- "pagination": {
- "limit": 10,
- "has_more": false
}
}
}Retrieve file details including a presigned download URL. Unattached files are readable only by their owner and require files.read. Files attached to a document inherit that document’s read permission instead of requiring files.read.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| fileId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... File ID |
{- "id": "7e3e3c32-d6c4-4d90-b1df-cf7bd9f96c98",
- "type": "document",
- "mime_type": "application/pdf",
- "status": "process_completed",
- "original_filename": "invoice.pdf",
- "source": "user",
- "created_at": "2026-03-31T12:00:00.000Z",
- "company_id": "4f7773af-f70f-4d40-a435-a6299fefbfcb",
- "kind": "invoice_purchase",
- "visibility": "company",
- "size_bytes": "234567",
- "tags": [
- "q1-2026"
], - "attached_documents": [ ],
- "s3_path": "companies/4f7773af-f70f-4d40-a435-a6299fefbfcb/files/invoice.pdf",
- "ref_file_id": null,
- "created_by": "73930057-2a35-4b9a-a675-4478e5fd3f4a",
- "metadata": null,
}Update file metadata (rename, set kind, replace tags, promote visibility). Renaming is rejected while the file is in upload_pending status. Visibility is one-way: promoting private → company is allowed, demoting is rejected with 400. Tags, when provided, replace the file's entire tag set; omit the field to leave tags unchanged.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| fileId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... File ID |
File partial update payload
| original_filename | string non-empty Rename the file. The value must be a non-empty string; there is no "clear filename" semantics exposed on this endpoint. Omit the field to leave the filename unchanged. Not accepted while the file is in upload_pending status (returns 400). |
FileKind (string) or null Business-domain classification. Pass null to clear the current value. | |
Array of strings or null Replace the file's tag set with the provided values. Tags are trimmed, then matched against the company pool case-insensitively; new tag values are inserted into the pool. Pass null or an empty array to clear all tags. Each tag must be non-empty after trimming (1–64 characters); whitespace-only values are rejected. At most 50 values per request; duplicates (exact-match) are rejected with 400, and the service additionally dedupes case-insensitively after normalization. | |
| visibility | string (FileVisibility) Enum: "private" "company" Promote to company visibility. The only meaningful value is 'company' (private → company promotion). Passing 'private' is accepted as a no-op only when the file is already private; attempting to demote a file from company → private returns 400 (the transition is one-way). |
{- "original_filename": "string",
- "kind": "receipt",
- "tags": [
- "string"
], - "visibility": "private"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string",
- "source": "user",
- "created_at": "2019-08-24T14:15:22Z",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "kind": "receipt",
- "visibility": "private",
- "size_bytes": "string",
- "tags": [
- "string"
], - "attached_documents": [
- {
- "kind": "purchase_invoice",
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6"
}
], - "s3_path": "string",
- "ref_file_id": "4e2990c8-5744-4c5c-bc59-f31c1bdb1a8d",
- "content_rejection_reason": "string",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "metadata": {
- "status": "processing",
- "data": {
- "counterparty_name": "string",
- "document_date": "2019-08-24",
- "document_reference": "string",
- "total_amount_gross": "string",
- "total_amount_net": "string",
- "total_amount_vat": "string",
- "currency": "string",
- "payment_method": "cash",
- "line_items": [
- {
- "title": "string",
- "quantity": "string",
- "unit_price_gross": "string",
- "amount_gross": "string",
- "vat_rate": "string",
- "amount_vat": "string"
}
], - "confidence_score": "string"
}, - "error": "FILE_TYPE_NOT_SUPPORTED"
}
}Delete a file. Unattached files can only be deleted by their owner and require files.write. Files attached to a document require files.write plus the parent document’s write permission.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| fileId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... File ID |
{- "error": "Forbidden",
- "code": "FORBIDDEN",
- "debug": "User does not have permission to perform this action",
- "timestamp": "2024-01-15T10:30:00Z"
}List files created by the authenticated user across all companies. Excludes files attached to any document (for per-company listing of attached files, see GET /companies/{companyId}/files). By default excludes upload_pending files.
FileStatus (string) or "all" (string) Example: status=process_completed Filter by file status. By default, upload_pending files are excluded. Use "all" to include them. | |
| kind | Array of strings (FileKind) <= 11 items unique Items Enum: "receipt" "invoice_purchase" "invoice_sales" "contract" "meeting_minutes" "payslip" "legal_document" "bank_statement" "tax_document" "correspondence" "other" Example: kind=receipt Filter by one or more file kinds using repeated query parameters. OR semantics across values. At most 11 values (one per kind); duplicates (exact-match) are rejected with 400. |
| tag | Array of strings <= 50 items unique [ items [ 1 .. 64 ] characters \S ] Example: tag=personal Filter by one or more tag names using repeated query parameters. AND semantics across values. Case-insensitive. Each tag is trimmed; 1–64 characters after trimming. At most 50 values per request; duplicates (exact-match) are rejected with 400 (the case-insensitive dedup happens server-side after normalization). |
| q | string [ 1 .. 255 ] characters Example: q=receipt Case-insensitive substring search across |
| sort_by | string (FileSortBy) Enum: "uploaded_at" "name" "size" "kind" Example: sort_by=uploaded_at Sort order for the returned list. Defaults to |
| cursor | string non-empty Cursor for fetching the next page of results. Must match the current |
| limit | integer [ 1 .. 100 ] Example: limit=10 Maximum number of results to return |
{- "data": [
- {
- "id": "7e3e3c32-d6c4-4d90-b1df-cf7bd9f96c98",
- "type": "document",
- "mime_type": "application/pdf",
- "status": "process_completed",
- "original_filename": "invoice.pdf",
- "source": "user",
- "created_at": "2026-03-31T12:00:00.000Z",
- "company_id": "4f7773af-f70f-4d40-a435-a6299fefbfcb",
- "kind": "invoice_purchase",
- "visibility": "company",
- "size_bytes": "234567",
- "tags": [
- "q1-2026"
], - "attached_documents": [ ]
}, - {
- "id": "c8fa5a78-5a67-4d0b-a8f6-1a5f8bfe4f92",
- "type": "document",
- "mime_type": null,
- "status": "process_completed",
- "original_filename": "mystery-file",
- "source": "user",
- "created_at": "2026-03-31T12:05:00.000Z",
- "company_id": "4f7773af-f70f-4d40-a435-a6299fefbfcb",
- "kind": null,
- "visibility": "private",
- "size_bytes": null,
- "tags": [ ],
- "attached_documents": [ ]
}
], - "meta": {
- "pagination": {
- "limit": 10,
- "has_more": false
}
}
}Create a new fiscal period for a company
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Fiscal period creation data. Only fiscal years are created here (period_type must be "year"). Month periods are created automatically when a calendar month is first closed via the close action.
| period_type required | string Discriminator: year fiscal period Value: "year" |
| start_date required | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Start date of the fiscal year (YYYY-MM-DD) |
| end_date required | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... End date of the fiscal year (YYYY-MM-DD) |
| is_closed | boolean Whether the fiscal period is closed (defaults to false) |
string or null Lock date for the fiscal period (YYYY-MM-DD) | |
| parent_fiscal_period_id | null Must be omitted or null for period_type="year". |
{- "period_type": "year",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "is_closed": true,
- "lock_date": "2019-08-24",
- "parent_fiscal_period_id": null
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "is_closed": true,
- "lock_date": "2019-08-24",
- "period_type": "year",
- "parent_fiscal_period_id": "1496c68f-bcfd-4760-a31d-e6ddf5c3d75c",
- "calendar_month": "string",
- "closed_at": "2019-08-24T14:15:22Z",
- "closed_by_user_id": "103df14e-9463-40aa-a9b8-62af14cf9cd8",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Retrieve all fiscal periods for a company with optional filtering
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| is_closed | boolean Filter by closed status |
| period_type | string (FiscalPeriodPeriodType) Enum: "year" "month" Example: period_type=year Filter by period type ("year" or "month") |
| parent_fiscal_period_id | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Filter by parent fiscal year ID. Useful for "list months under this year" queries. |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "is_closed": true,
- "lock_date": "2019-08-24",
- "period_type": "year",
- "parent_fiscal_period_id": "1496c68f-bcfd-4760-a31d-e6ddf5c3d75c",
- "calendar_month": "string",
- "closed_at": "2019-08-24T14:15:22Z",
- "closed_by_user_id": "103df14e-9463-40aa-a9b8-62af14cf9cd8",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}Retrieve fiscal period details
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| fiscalPeriodId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Fiscal period ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "is_closed": true,
- "lock_date": "2019-08-24",
- "period_type": "year",
- "parent_fiscal_period_id": "1496c68f-bcfd-4760-a31d-e6ddf5c3d75c",
- "calendar_month": "string",
- "closed_at": "2019-08-24T14:15:22Z",
- "closed_by_user_id": "103df14e-9463-40aa-a9b8-62af14cf9cd8",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Update fiscal period details. Only fiscal years can be edited here; month periods are managed through the close and reopen actions and cannot be edited directly. is_closed, period_type, parent_fiscal_period_id, closed_at, and closed_by_user_id cannot be modified through this endpoint.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| fiscalPeriodId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Fiscal period ID |
Fiscal period update data. Only start_date, end_date, and lock_date are mutable here. Unknown fields are rejected to prevent silent drops of fields like period_type or close-audit columns.
| start_date | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Start date of the fiscal period (YYYY-MM-DD) |
| end_date | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... End date of the fiscal period (YYYY-MM-DD) |
string or null Lock date for the fiscal period (YYYY-MM-DD) |
{- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "lock_date": "2019-08-24"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "is_closed": true,
- "lock_date": "2019-08-24",
- "period_type": "year",
- "parent_fiscal_period_id": "1496c68f-bcfd-4760-a31d-e6ddf5c3d75c",
- "calendar_month": "string",
- "closed_at": "2019-08-24T14:15:22Z",
- "closed_by_user_id": "103df14e-9463-40aa-a9b8-62af14cf9cd8",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Delete a fiscal period (only open periods can be deleted; year periods with child months must have their months deleted first)
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| fiscalPeriodId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Fiscal period ID |
{- "error": "Invalid input",
- "code": "VALIDATION_ERROR",
- "debug": "Validation failed for field 'invoice_date'",
- "timestamp": "2024-01-15T10:30:00Z"
}Close a calendar month under a fiscal year. The path id is the fiscal YEAR; the calendar_month body field selects which month to close. The month fiscal_period row is created on first close (lazy materialization) and reused on a later re-close after a reopen. Sets is_closed, closed_at, and closed_by_user_id atomically and records a close entry in the audit log. Year-level closing is not supported.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| fiscalPeriodId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Fiscal year ID. The month under it is selected by the calendar_month body field. |
Selects the calendar month under the fiscal year to close. The month row is found-or-created from the fiscal year range and this anchor.
| calendar_month required | string^\d{4}-(0[1-9]|1[0-2])$ Calendar month to close, as YYYY-MM. Must fall within the fiscal year range. |
{- "calendar_month": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "is_closed": true,
- "lock_date": "2019-08-24",
- "period_type": "month",
- "parent_fiscal_period_id": "1496c68f-bcfd-4760-a31d-e6ddf5c3d75c",
- "calendar_month": "string",
- "closed_at": "2019-08-24T14:15:22Z",
- "closed_by_user_id": "103df14e-9463-40aa-a9b8-62af14cf9cd8",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Reopen a previously closed fiscal month. The path id is the month fiscal_period row created by a prior :close. Clears is_closed, closed_at, and closed_by_user_id atomically and records a reopen entry in the audit log (capturing the close it undoes). Never creates a row. No request body is required.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| fiscalPeriodId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Fiscal month ID (the month row created by a prior :close). |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "is_closed": false,
- "lock_date": "2019-08-24",
- "period_type": "month",
- "parent_fiscal_period_id": "1496c68f-bcfd-4760-a31d-e6ddf5c3d75c",
- "calendar_month": "string",
- "closed_at": null,
- "closed_by_user_id": null,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Close a fiscal YEAR and post the year-end result transfer. The path id is the fiscal year. Closes the income/expense accounts into account 2371 dated the year-end (so the result shows on its own equity line in the closing balance sheet), carries the result into prior-years retained earnings (account 2251) dated the first day of the next year, then seals the year and records a close entry in the audit log. The following fiscal year must already exist and be open to receive the carry-forward, so years are closed oldest first. No request body.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| fiscalPeriodId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Fiscal year ID to close. |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "is_closed": true,
- "lock_date": "2019-08-24",
- "period_type": "year",
- "parent_fiscal_period_id": null,
- "calendar_month": null,
- "closed_at": "2019-08-24T14:15:22Z",
- "closed_by_user_id": "103df14e-9463-40aa-a9b8-62af14cf9cd8",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Reopen a previously closed fiscal YEAR. The path id is the fiscal year. Voids the year-end closing entries (reversing the result transfer so equity returns to its pre-close state), clears the close-audit columns, and records a reopen entry in the audit log. The following fiscal year must not be closed (reopen later years first). No request body.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| fiscalPeriodId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Fiscal year ID to reopen. |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "is_closed": false,
- "lock_date": "2019-08-24",
- "period_type": "year",
- "parent_fiscal_period_id": null,
- "calendar_month": null,
- "closed_at": null,
- "closed_by_user_id": null,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Get current user info including roles and permissions. user.locale is the stored copy-locale preference; null means the company default applies (set or cleared via PATCH /me).
{- "user": {
- "id": "123e4567-e89b-12d3-a456-426614174000",
- "email": "user@example.com",
- "locale": null
}, - "permissions": [
- {
- "company_id": "223e4567-e89b-12d3-a456-426614174000",
- "company_name": "Acme Oy",
- "role_id": "323e4567-e89b-12d3-a456-426614174000",
- "role_name": "employee",
- "permissions": [
- "company.read",
- "expense_claims.read",
- "expense_claims.write"
]
}
]
}Updates preferences of the calling user. All fields are optional; omitting a field leaves it unchanged. locale is the preferred copy locale — notification copy renders in it from the next emit on — and passing null clears it so the company default applies again.
Preference fields to update (all optional)
string or null Preferred copy locale |
{- "locale": "fi-FI"
}{- "user": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "email": "user@example.com",
- "locale": "fi-FI"
}
}Retrieve general ledger accounts with filtering, pagination, and i18n-resolved names. Supports filtering by type, code (exact/range), currency, and text search on account names.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| type | string (GeneralLedgerAccountType) Enum: "asset" "equity" "expense" "liability" "revenue" Example: type=asset Filter by account type |
| code | string non-empty Example: code=1000 Filter by exact account code |
| code_from | string non-empty Example: code_from=1000 Filter by account code range (from) |
| code_to | string non-empty Example: code_to=2000 Filter by account code range (to) |
| currency | string = 3 characters Example: currency=EUR Filter by currency code |
| query | string non-empty Example: query=cash Text search on account names (partial match) |
| limit | integer [ 1 .. 100 ] Example: limit=10 Maximum number of results to return (1-100) |
| offset | integer [ 0 .. 9007199254740991 ] Number of results to skip for pagination |
| locale | string^[A-Za-z]{2,3}(?:[-_][A-Za-z0-9]{2,8}){0,5}$ Example: locale=en BCP 47 locale code (e.g. "fi-FI", "en"). Only the language portion is used. The effective locale falls back to the company's default locale, then "fi". Account names fall back to the account code when the effective locale has no translation. |
| include_balances | boolean Example: include_balances=true Include balance information for accounts (requires from_date and to_date) |
| from_date | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: from_date=2024-01-01 Start date for balance calculation (ISO date format: YYYY-MM-DD). Required when include_balances=true. |
| to_date | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: to_date=2024-12-31 End date for balance calculation (ISO date format: YYYY-MM-DD). Required when include_balances=true. |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "code": "string",
- "name": "string",
- "type": "asset",
- "currency": "string",
- "is_active": true,
- "balances": {
- "currency": "string",
- "from_date": "string",
- "to_date": "string",
- "opening_balance": "string",
- "period_debit": "string",
- "period_credit": "string",
- "closing_balance": "string"
}
}
], - "meta": {
- "total": -9007199254740991,
- "limit": -9007199254740991,
- "offset": -9007199254740991
}
}Retrieve the full chart of accounts as a nested hierarchy with optional period activity balances.
Consumer note:
This endpoint has two client-visible modes. When start_date and end_date are omitted, the response returns the full tree with period: null and nodes without period_* fields. When both dates are provided, the response returns period balances on every node and may prune empty branches unless include_empty=true. Tree is sorted in ascending numeric order by codes.
Request examples:
GET /companies/{companyId}/general-ledger-account-tree?locale=fiGET /companies/{companyId}/general-ledger-account-tree?start_date=2024-01-01&end_date=2024-03-31&include_empty=false&locale=fiMigration note:
Profit & Loss responses now use period_debit, period_credit, and period_net instead of the old amount field. Consumers should also expect this endpoint to return a validation 400 when only one date is provided or when start_date is after end_date; unexpected failures still return the standard 500 error shape.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| start_date | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: start_date=2024-01-01 Period start date (ISO date format: YYYY-MM-DD). Must be provided together with end_date. When omitted together, the response is returned in undated mode with |
| end_date | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: end_date=2024-03-31 Period end date (ISO date format: YYYY-MM-DD). Must be provided together with start_date. The endpoint returns |
| include_empty | boolean Example: include_empty=true Include accounts and categories with no period activity. Requires both start_date and end_date. Default is |
| locale | string^[A-Za-z]{2,3}(?:[-_][A-Za-z0-9]{2,8}){0,5}$ Example: locale=fi BCP 47 locale code (e.g. "fi-FI", "en"). Only the language portion is used. The effective locale falls back to the company's default locale, then "fi". Node names fall back to the account code or category id when the effective locale has no translation. |
{- "period": null,
- "currency": "EUR",
- "roots": [
- {
- "id": "11111111-1111-4111-8111-111111111111",
- "account_code": null,
- "account_code_min": "1000",
- "account_code_max": "1999",
- "name": "Vastaavaa",
- "children": [
- {
- "id": "22222222-2222-4222-8222-222222222222",
- "account_code": "1900",
- "account_code_min": null,
- "account_code_max": null,
- "name": "Pankkitili",
- "children": [ ]
}
]
}
]
}Retrieve a single general ledger account by its code
| code required | string^[0-9]{4}$ Example: 1000 Account code (e.g., "1000", "2000") |
| locale | string^[A-Za-z]{2,3}(?:[-_][A-Za-z0-9]{2,8}){0,5}$ Example: locale=en BCP 47 locale code (e.g. "fi-FI", "en") for name and description resolution. Only the language portion is used. Falls back to "fi" when omitted. The name falls back to the account code when the effective locale has no translation; the description resolves to null. |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "code": "string",
- "parent_id": "1c6ca187-e61f-4301-8dcb-0e9749e89eef",
- "name": "string",
- "description": "string",
- "type": "asset",
- "currency": "string",
- "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Retrieve general ledger lines with filtering and pagination. Supports filtering by GL account code, voucher, and posting date range. Opening balance and running balance are automatically included for account-wide queries (when account_code is provided and voucher_id is not provided) - they are always present regardless of from_date. When from_date is specified, opening balance is the sum before from_date; when from_date is not specified, opening balance is 0.00. Opening balance and running balance are NOT included when voucher_id is provided. Voided vouchers are automatically excluded from results, opening balance, and running balance calculations.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| account_code | string non-empty Example: account_code=1000 GL account code (e.g., "1000"). Required when voucher_id is not provided. When voucher_id is provided, account_code is optional - if omitted, all lines for the voucher are returned. |
| voucher_id | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Filter by voucher ID. When provided, account_code becomes optional. Either account_code or voucher_id must be provided. |
| from_date | string^\d{4}-\d{2}-\d{2}$ Example: from_date=2024-01-01 Filter by posting date (from, inclusive) |
| to_date | string^\d{4}-\d{2}-\d{2}$ Example: to_date=2024-12-31 Filter by posting date (to, inclusive) |
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=50 Maximum number of results to return (1-100). Defaults to 10 if not specified. |
| cursor | string non-empty Example: cursor=eyJwb3N0aW5nRGF0ZSI6IjIwMjQtMDEtMTUiLCJ2b3VjaGVySWQiOiJ2b3VjaGVyLTEiLCJsaW5lSWQiOiJsaW5lLTEifQ Cursor for pagination (base64-encoded). Use the nextCursor from the previous response to fetch the next page. |
| locale | string^[A-Za-z]{2,3}(?:[-_][A-Za-z0-9]{2,8}){0,5}$ Example: locale=en BCP 47 locale code (e.g. "fi-FI", "en") for |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "voucher_id": "1b5a607b-e5eb-4b17-80b0-5739c041e81b",
- "voucher_number": "string",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "gl_account_id": "ff3b9537-f5ac-4a59-bab0-287e059b4618",
- "gl_account_code": "string",
- "gl_account_name": "string",
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "document_type": "sales_invoice",
- "description": "string",
- "document_description": "string",
- "amount": "string",
- "status": "valid",
- "posting_date": "string",
- "running_balance": "string"
}
], - "opening_balance": "string",
- "meta": {
- "pagination": {
- "limit": 1,
- "has_more": true,
- "next_cursor": "string"
}
}
}Retrieve open account items for a specific GL account. Each item is anchored on a valid voucher posting to the selected account and includes the linked document context. Results exclude documents with null or zero unsettled amounts.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| code required | string^\d{4}$ Example: 1910 GL account code |
| cursor | string non-empty Cursor for pagination (base64-encoded) |
| limit | integer [ 1 .. 100 ] Default: 50 Example: limit=50 Maximum number of results to return (1-100). Defaults to 50. |
| posting_date_from | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: posting_date_from=2024-01-01 Filter by posting date (from, inclusive) |
| posting_date_to | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: posting_date_to=2024-12-31 Filter by posting date (to, inclusive) |
| document_type | string (GlAccountOpenItemDocumentType) Enum: "bank_transaction" "expense_claim" "memo" "purchase_invoice" "sales_invoice" "settlement" "year_end_close" Example: document_type=sales_invoice Filter by document type |
{- "data": [
- {
- "voucher": {
- "id": "d6a54b28-6537-4c6d-95ec-5e2b9cb6a8aa",
- "voucher_number": "SI-2024-120",
- "posting_date": "2024-01-10",
- "status": "valid"
}, - "document": {
- "id": "4b6eb5ce-b867-48de-a824-cf1923cb65b7",
- "type": "sales_invoice",
- "status": "approved",
- "document_date": "2024-01-10",
- "description": "Invoice SI-2024-001",
- "amount": "1250",
- "unsettled_amount": "450"
}, - "account_entry": {
- "code": "1910",
- "amount": "1250"
}
}, - {
- "voucher": {
- "id": "2fa3b2b4-7863-4f6c-9983-4df97db98cbb",
- "voucher_number": "PI-2024-031",
- "posting_date": "2024-01-08",
- "status": "valid"
}, - "document": {
- "id": "a53a6463-9cc2-4ac6-933f-81fa73b1a46d",
- "type": "purchase_invoice",
- "status": "approved",
- "document_date": "2024-01-08",
- "description": "Office supplies January",
- "amount": "320.50",
- "unsettled_amount": "120.50"
}, - "account_entry": {
- "code": "1910",
- "amount": "-320.50"
}
}
], - "meta": {
- "pagination": {
- "limit": 50,
- "has_more": true,
- "next_cursor": "eyJwb3N0aW5nRGF0ZSI6IjIwMjQtMDEtMDgiLCJ2b3VjaGVySWQiOiIyZmEzYjJiNC03ODYzLTRmNmMtOTk4My00ZGY5N2RiOThjYmIifQ"
}
}
}Cursor-paginated operations list of approved purchase and sales invoices that have no GL voucher, with the reason no voucher exists when known (unclassified lines vs. posting-rule gaps). Sorted oldest-first by approval time (rows approved before approval timestamps were recorded lead). Membership is "no voucher row at all": an invoice whose voucher was voided is not listed, because a voided voucher is restored via the voucher :unvoid action rather than regenerated. Invoices leave the list as soon as the :generate-voucher correction action (or the automatic post-approval generation) succeeds.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| cursor | string Pagination cursor from previous response |
| limit | integer [ 1 .. 100 ] Default: 20 Maximum number of results to return (1-100, default: 20) |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "purchase_invoice",
- "invoice_number": "string",
- "counterparty": "string",
- "invoice_date": "2019-08-24",
- "approved_at": "2019-08-24T14:15:22Z",
- "gross_amount": "string",
- "currency": "string",
- "unclassified_line_count": -9007199254740991,
- "has_lines_without_posting_rule": true
}
], - "meta": {
- "pagination": {
- "limit": 1,
- "has_more": true,
- "next_cursor": "string"
}
}
}Retrieve memos for a company with optional filtering and pagination
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| cursor | string Pagination cursor from previous response |
| limit | integer [ 1 .. 100 ] Example: limit=10 Maximum number of results to return |
| status | string (SalesInvoiceItems) Enum: "draft" "approved" "rejected" "voided" Example: status=draft Filter by document status |
| tag | string Example: tag=urgent Filter by tag name |
| search | string Example: search=rent Search in memo description (case-insensitive substring) |
| with_amount | boolean Example: with_amount=true Filter by presence of amount (true = has amount, false = no amount) |
| document_date_from | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: document_date_from=2026-01-01 Filter by document date, inclusive lower bound (ISO date). Must be <= document_date_to when both are provided; an inverted range returns 400. Memos without a document date fall outside any bounded range. |
| document_date_to | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: document_date_to=2026-12-31 Filter by document date, inclusive upper bound (ISO date). Must be >= document_date_from when both are provided; an inverted range returns 400. Memos without a document date fall outside any bounded range. |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "description": "string",
- "document_date": "2019-08-24",
- "amount": "string",
- "unsettled_amount": "string",
- "currency_code": "string",
- "status": "string",
- "internal_notes": "string",
- "tags": [
- "string"
], - "files_count": -9007199254740991,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "pagination": {
- "limit": 1,
- "has_more": true,
- "next_cursor": "string"
}
}
}Create a new memo document. A memo is a manual document with a textual description and optional metadata, used as a workaround source for vouchers when automated sources are unavailable.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Memo creation data
| description required | string non-empty Memo description (required) - textual description of what the document represents |
| document_date required | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Document date (YYYY-MM-DD). Required for memo creation. Used as default posting date when creating vouchers. |
| amount | string^-?[0-9]+(\.[0-9]{1,8})?$ Optional amount (numeric string with up to 8 decimals) |
| currency_code | string Optional currency code (e.g., EUR, USD). Required when |
| files | Array of strings <uuid> [ items <uuid >^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... ] Optional array of file IDs to attach (replaces all existing files when provided; pass an empty array to clear all files) |
| tags | Array of strings <= 50 items unique [ items [ 1 .. 64 ] characters \S ] Optional array of tag names to attach to the memo. Duplicates (exact-match) are rejected with 400. |
string or null Optional internal notes for team visibility only (internal-only field) | |
object Optional voucher data. If provided, a GL voucher will be created atomically with the memo. |
{- "description": "string",
- "document_date": "2019-08-24",
- "amount": "string",
- "currency_code": "string",
- "files": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "tags": [
- "string"
], - "internal_notes": "string",
- "voucher": {
- "posting_date": "2019-08-24",
- "currency": "EUR",
- "lines": [
- {
- "account_code": "string",
- "amount": "string",
- "memo": "string",
- "vat_rate": "string",
- "vat_class_code": "string"
}, - {
- "account_code": "string",
- "amount": "string",
- "memo": "string",
- "vat_rate": "string",
- "vat_class_code": "string"
}
]
}
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "description": "string",
- "amount": "string",
- "unsettled_amount": "string",
- "currency_code": "string",
- "status": "string",
- "internal_notes": "string",
- "document_date": "2019-08-24",
- "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "tags": [
- "string"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "voucher": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "document_type": "sales_invoice",
- "currency": "EUR",
- "status": "valid",
- "posting_date": "2019-08-24",
- "lines": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "account_code": "string",
- "account_name": "string",
- "amount": "string",
- "memo": "string",
- "vat_rate": "string",
- "vat_class_code": "string"
}
], - "voucher_number": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "voided_by": "5ecfc985-14a9-4a71-a20e-8b1b8395f2ab",
- "voided_at": "2019-08-24T14:15:22Z"
}
}Retrieve memo details by ID
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| memoId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Memo ID (document ID) |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "description": "string",
- "amount": "string",
- "unsettled_amount": "string",
- "currency_code": "string",
- "status": "string",
- "internal_notes": "string",
- "document_date": "2019-08-24",
- "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "tags": [
- "string"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Update an existing memo document. Partial updates are supported - only provided fields will be updated. Business rules: (1) Cannot edit if fiscal period for document_date is locked, (2) Cannot change amount if memo has a linked voucher.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| memoId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Memo ID (document ID) |
Memo update data (partial updates supported)
| description | string non-empty Memo description |
string or null Document date (YYYY-MM-DD). Used as default posting date when creating vouchers. | |
string or null Optional amount (numeric string with up to 8 decimals) | |
string or null Currency code (e.g., EUR, USD). Required when amount is provided. | |
| files | Array of strings <uuid> [ items <uuid >^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... ] File IDs to attach (replaces all existing files when provided; pass an empty array to clear all files) |
| tags | Array of strings <= 50 items unique [ items [ 1 .. 64 ] characters \S ] Tag names to attach (replaces all existing tags). Duplicates (exact-match) are rejected with 400. |
string or null Optional internal notes for team visibility only (internal-only field) |
{- "description": "string",
- "document_date": "2019-08-24",
- "amount": "string",
- "currency_code": "string",
- "files": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "tags": [
- "string"
], - "internal_notes": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "description": "string",
- "amount": "string",
- "unsettled_amount": "string",
- "currency_code": "string",
- "status": "string",
- "internal_notes": "string",
- "document_date": "2019-08-24",
- "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "tags": [
- "string"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Returns the caller's own notifications within the company, newest first, with keyset pagination. unread_count in the meta reflects the caller's total unread notifications in the company regardless of the current page or the unreadOnly filter; the OS app badge instead carries the caller's cross-company unread total (see GET /notifications/unread-counts). Notifications of other users are never visible.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| limit | integer [ 1 .. 100 ] Example: limit=50 Maximum number of results to return (1-100, default: 50) |
| cursor | string Pagination cursor from previous response |
| unreadOnly | boolean Example: unreadOnly=true When true, return only unread notifications |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "trigger": "purchase_invoice_received",
- "title": "string",
- "body": "string",
- "resource_uri": "string",
- "resource_id": "4d5215ed-38bb-48ed-879a-fdb9ca58522f",
- "metadata": {
- "property1": null,
- "property2": null
}, - "read_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "pagination": {
- "limit": 1,
- "has_more": true,
- "next_cursor": "string"
}, - "unread_count": 9007199254740991
}
}Returns one entry per company the caller is a member of, ordered by company id — zero counts included — so a company switcher can render every membership's unread badge from a single call. Counts cover live memberships only and always sum to the badge total carried on pushes. Not company-scoped: the caller's identity alone determines the result.
{- "data": [
- {
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "unread_count": 9007199254740991
}
]
}Marks one of the caller's notifications as read. Idempotent: marking an already-read notification keeps the original read time and returns 200. Returns 404 when the notification does not exist or belongs to another user or company — the two cases are indistinguishable by design.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| notificationId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Notification ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "trigger": "purchase_invoice_received",
- "title": "string",
- "body": "string",
- "resource_uri": "string",
- "resource_id": "4d5215ed-38bb-48ed-879a-fdb9ca58522f",
- "metadata": {
- "property1": null,
- "property2": null
}, - "read_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}Restores one of the caller's notifications to unread, the inverse of :mark-read. Idempotent: marking an already-unread notification returns 200 with read_at still null. Returns 404 when the notification does not exist or belongs to another user or company — the two cases are indistinguishable by design. Sends no push and no badge update: the caller's unread count is re-derived from the next inbox fetch.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| notificationId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Notification ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "trigger": "purchase_invoice_received",
- "title": "string",
- "body": "string",
- "resource_uri": "string",
- "resource_id": "4d5215ed-38bb-48ed-879a-fdb9ca58522f",
- "metadata": {
- "property1": null,
- "property2": null
}, - "read_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}Marks every unread notification of the caller in the company as read and returns how many were affected. Idempotent: a repeat call returns updated_count 0.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
{- "updated_count": 9007199254740991
}Retrieve parties for a company with optional search and filtering
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| scope required | string (PartyScope) Enum: "registry" "associated" Example: scope=registry Scope of parties to return |
| query | string Example: query=Acme Search query (searches in party names) |
| cursor | string Example: cursor=eyJzb3J0IjoibmFtZSIsIm5hbWUiOiJBY21lIiwiaWQiOiIxMjM0NSJ9 Pagination cursor from previous response |
| limit | integer [ 1 .. 100 ] Example: limit=10 Maximum number of results to return |
| sort | string (PartySort) Enum: "name" "updated_at" "last_sales_invoice_created_at" Example: sort=name Sort order |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "registration_country_code": "string",
- "business_id": "string",
- "name": "string",
- "number": 0
}
], - "meta": {
- "pagination": {
- "limit": 1,
- "has_more": true,
- "next_cursor": "string"
}
}
}Create a new party
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Party creation data
| registration_country_code required | string^[A-Z]{2}$ |
| business_id required | string |
| name required | string |
string or null | |
object or null | |
object or null | |
object | |
object | |
string or null | |
object or null |
{- "registration_country_code": "string",
- "business_id": "string",
- "name": "string",
- "vat_number": "string",
- "postal_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "visiting_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "invoicing_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "settings": {
- "general": {
- "currency": "EUR"
}, - "sales_invoice": {
- "invoicing_type": "email",
- "our_reference": "string",
- "your_reference": "string",
- "payment_term": 0,
- "interest_rate": "string"
}, - "purchase_invoice": {
- "invoicing_type": "email",
- "our_reference": "string",
- "your_reference": "string",
- "payment_term": 0,
- "interest_rate": "string"
}
}, - "invoicing_email": "user@example.com",
- "einvoice": {
- "address": "string",
- "operator": "string"
}
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "registration_country_code": "string",
- "business_id": "string",
- "number": 0,
- "vat_number": "string",
- "postal_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "visiting_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "invoicing_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "settings": {
- "property1": {
- "property1": null,
- "property2": null
}, - "property2": {
- "property1": null,
- "property2": null
}
}, - "invoicing_email": "string",
- "einvoice": {
- "address": "string",
- "operator": "string"
}, - "public_registry": {
- "postal_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "visiting_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "einvoice": {
- "address": "string",
- "operator": "string"
}, - "vat_number": "string"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Retrieve party details with optional includes
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| partyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Party ID |
| include | string Example: include=settings,address Comma-separated list of related resources to include |
| namespace | string Example: namespace=sales_invoice,purchase_invoice Comma-separated list of namespaces to include |
{- "id": "string",
- "name": "string",
- "registration_country_code": "string",
- "business_id": "string",
- "number": 0,
- "vat_number": "string",
- "postal_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "visiting_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "invoicing_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "settings": {
- "property1": {
- "property1": null,
- "property2": null
}, - "property2": {
- "property1": null,
- "property2": null
}
}, - "invoicing_email": "string",
- "einvoice": {
- "address": "string",
- "operator": "string"
}, - "public_registry": {
- "postal_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "visiting_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "einvoice": {
- "address": "string",
- "operator": "string"
}, - "vat_number": "string"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Update party details
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| partyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Party ID |
Party update data
| name | string |
(string or "" (string)) or null | |
object or null | |
object or null | |
object | |
object Settings (can be flat structure for backward compatibility or namespaced like { namespace: { key: value } }) | |
(string or "" (string)) or null | |
object or null |
{- "name": "string",
- "vat_number": "string",
- "postal_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "visiting_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "invoicing_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "settings": {
- "property1": null,
- "property2": null
}, - "invoicing_email": "user@example.com",
- "einvoice": {
- "address": "string",
- "operator": "string"
}
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "number": 0
}Unified cursor-paginated list of payable documents (purchase invoices and expense claims) for a company. Sorted by document_date DESC, id ASC. The endpoint owns cross-document sort and stage assignment; clients render whatever they receive without branching on type.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| stage | Array of strings (PayableItems) unique Items Enum: "ready_to_pay" "paid" "awaiting_approval" Filter by lifecycle stage. Multiple values allowed (repeated param). awaiting_approval is additive and currently returns an empty list. |
| cursor | string Pagination cursor from previous response |
| limit | integer [ 1 .. 100 ] Default: 20 Maximum number of results to return (1-100, default: 20) |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "purchase_invoice",
- "stage": "ready_to_pay",
- "payee": "string",
- "ai_summary": "string",
- "gross_amount": "string",
- "unsettled_amount": "string",
- "currency": "string",
- "payment_status": "paid",
- "document_date": "2019-08-24",
- "blocked_reason": "missing_iban"
}
], - "meta": {
- "pagination": {
- "limit": 1,
- "has_more": true,
- "next_cursor": "string"
}
}
}Operator management of WS batch-payment agreements (schema, attachments, lifecycle)
List all batch-payment agreements for a company, including currently terminated ones. Active and terminated states are distinguished by terminated_at.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "channel": "fi_bank_ws",
- "ws_provider": "op",
- "customer_id": "string",
- "valid_from": "2019-08-24",
- "valid_to": "2019-08-24",
- "terminated_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "bank_account_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
], - "meta": {
- "count": 9007199254740991
}
}Create a new batch-payment agreement, attaching at least one bank account. The same bank account may not be attached to more than one live agreement.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Agreement create payload
| channel | string Default: "fi_bank_ws" Value: "fi_bank_ws" Batch payment routing channel |
| ws_provider required | string Enum: "op" "nordea" "danske_bank" "aktia" "s_pankki" "pop_pankki" "saastopankki" "oma_saastopankki" "alandsbanken" WS batch-payment provider — identifies which bank's WS endpoint a batch is submitted to |
| customer_id required | string [ 1 .. 35 ] characters |
| valid_from required | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
string or null | |
| bank_account_ids required | Array of strings <uuid> non-empty unique [ items <uuid >^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... ] |
{- "channel": "fi_bank_ws",
- "ws_provider": "op",
- "customer_id": "string",
- "valid_from": "2019-08-24",
- "valid_to": "2019-08-24",
- "bank_account_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "channel": "fi_bank_ws",
- "ws_provider": "op",
- "customer_id": "string",
- "valid_from": "2019-08-24",
- "valid_to": "2019-08-24",
- "terminated_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "bank_account_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
}Retrieve a single batch-payment agreement by ID.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| agreementId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Payment batch agreement ID |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "channel": "fi_bank_ws",
- "ws_provider": "op",
- "customer_id": "string",
- "valid_from": "2019-08-24",
- "valid_to": "2019-08-24",
- "terminated_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "bank_account_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
}Partial update. When bank_account_ids is provided it is the full attached set: accounts present that are not on the agreement are attached, accounts currently on the agreement that are absent are detached. All changes happen in one transaction.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| agreementId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Payment batch agreement ID |
Agreement update payload
| channel | string Value: "fi_bank_ws" Batch payment routing channel |
| ws_provider | string Enum: "op" "nordea" "danske_bank" "aktia" "s_pankki" "pop_pankki" "saastopankki" "oma_saastopankki" "alandsbanken" WS batch-payment provider — identifies which bank's WS endpoint a batch is submitted to |
| customer_id | string [ 1 .. 35 ] characters |
| valid_from | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
string or null | |
| bank_account_ids | Array of strings <uuid> non-empty unique [ items <uuid >^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... ] |
{- "channel": "fi_bank_ws",
- "ws_provider": "op",
- "customer_id": "string",
- "valid_from": "2019-08-24",
- "valid_to": "2019-08-24",
- "bank_account_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "channel": "fi_bank_ws",
- "ws_provider": "op",
- "customer_id": "string",
- "valid_from": "2019-08-24",
- "valid_to": "2019-08-24",
- "terminated_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "bank_account_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
}Soft-deletes the agreement: sets terminated_at on the agreement and detached_at on all live association rows in a single transaction. The agreement remains visible in listings.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| agreementId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Payment batch agreement ID |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "channel": "fi_bank_ws",
- "ws_provider": "op",
- "customer_id": "string",
- "valid_from": "2019-08-24",
- "valid_to": "2019-08-24",
- "terminated_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "bank_account_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
}List payments for a company with optional filtering
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| document_id | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Filter by payable document ID |
| status | string (PaymentStatus) Enum: "draft" "pending" "queued" "scheduled" "submitted" "acknowledged" "executed" "failed" "canceled" "rejected" Filter by payment status |
| cursor | string Pagination cursor from previous response |
| limit | integer [ 1 .. 100 ] Example: limit=10 Maximum number of records to return (1-100, default: 10) |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "currency": "str",
- "amount": "string",
- "status": "draft",
- "channel": "psd2",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "pagination": {
- "limit": 1,
- "has_more": true,
- "next_cursor": "string"
}
}
}Create a payment for a payable document (purchase invoice or approved expense claim).
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Payment creation data
| document_id required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... ID of the payable document (purchase invoice or expense claim) |
| amount required | string^(?!0+(?:\.0{1,2})?$)\d+(\.\d{1,2})?$ Payment amount greater than 0 with up to 2 decimal places |
| currency required | string = 3 characters Payment currency (currently only EUR supported) |
| debtor_bank_account_id required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Bank account ID for the debtor |
string or null Execution date (ISO 8601 date); |
{- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "amount": "string",
- "currency": "str",
- "debtor_bank_account_id": "231a5002-84bd-418b-8831-7cbf4bf000b2",
- "scheduled_at": "2019-08-24"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "currency": "str",
- "amount": "string",
- "status": "draft",
- "channel": "psd2",
- "debtor_bank_account_id": "231a5002-84bd-418b-8831-7cbf4bf000b2",
- "beneficiary_party_id": "string",
- "beneficiary_iban": "string",
- "beneficiary_bic": "string",
- "beneficiary_name": "string",
- "reference_number": "string",
- "message": "string",
- "scheduled_at": "2019-08-24",
- "executed_at": "2019-08-24T14:15:22Z",
- "upstream_id": "string",
- "end_to_end_id": "string",
- "rejection_code": "string",
- "failure_reason": "string",
- "batch_submission": {
- "msg_id": "string",
- "sent_at": "2019-08-24T14:15:22Z",
- "status": "in_progress"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Retrieve a payment by ID
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| paymentId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Payment ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "currency": "str",
- "amount": "string",
- "status": "draft",
- "channel": "psd2",
- "debtor_bank_account_id": "231a5002-84bd-418b-8831-7cbf4bf000b2",
- "beneficiary_party_id": "string",
- "beneficiary_iban": "string",
- "beneficiary_bic": "string",
- "beneficiary_name": "string",
- "reference_number": "string",
- "message": "string",
- "scheduled_at": "2019-08-24",
- "executed_at": "2019-08-24T14:15:22Z",
- "upstream_id": "string",
- "end_to_end_id": "string",
- "rejection_code": "string",
- "failure_reason": "string",
- "batch_submission": {
- "msg_id": "string",
- "sent_at": "2019-08-24T14:15:22Z",
- "status": "in_progress"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Initiate an existing draft payment. The channel is resolved from the debtor bank account's active agreement at :initiate time: WS-routed accounts (fi_bank_ws) land in queued (or scheduled if scheduled_at is in the future); PSD2-routed accounts are rejected with 422 in this release.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| paymentId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Payment ID |
Payment initiation data
| redirect_url | string <uri> URL to redirect user after successful bank authentication. |
| cancel_url | string <uri> URL to redirect user if authentication fails or is canceled. |
{
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "status": "queued",
- "channel": "fi_bank_ws",
- "requested_execution_date": "2019-08-24",
- "redirect_url": null,
- "rejection_code": null,
- "failure_reason": null
}Cancel a WS payment that is still scheduled or queued (before the submit cycle picks it up). Any other status returns 409.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| paymentId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Payment ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "company_id": "b2e6a1c3-1a5e-44ae-a8fd-81f76fd715cf",
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "currency": "str",
- "amount": "string",
- "status": "draft",
- "channel": "psd2",
- "debtor_bank_account_id": "231a5002-84bd-418b-8831-7cbf4bf000b2",
- "beneficiary_party_id": "string",
- "beneficiary_iban": "string",
- "beneficiary_bic": "string",
- "beneficiary_name": "string",
- "reference_number": "string",
- "message": "string",
- "scheduled_at": "2019-08-24",
- "executed_at": "2019-08-24T14:15:22Z",
- "upstream_id": "string",
- "end_to_end_id": "string",
- "rejection_code": "string",
- "failure_reason": "string",
- "batch_submission": {
- "msg_id": "string",
- "sent_at": "2019-08-24T14:15:22Z",
- "status": "in_progress"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}List employment contracts for a company with cursor-based pagination.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| limit | integer [ 1 .. 100 ] Default: 10 Maximum number of results to return (1-100, default: 10) |
| cursor | string Pagination cursor from previous response |
| employee_user_id | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Filter by the employed user |
| manager_user_id | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Filter by approving manager. Resolves the employments named in a 409 when removing a member who still manages open ones. |
| status | string (EmploymentStatus) Enum: "active" "ended" Filter by lifecycle slot |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "employee": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "manager": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "jurisdiction": "FI",
- "contract_type": "permanent",
- "schedule_type": "full_time",
- "standard_hours_per_week": "string",
- "daily_overtime_threshold_hours": "string",
- "overtime_multiplier": "string",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "status": "active",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "pagination": {
- "limit": 1,
- "has_more": true,
- "next_cursor": "string"
}
}
}Open an employment contract for a company member. An employee may hold only one open employment at a time, and the period may not overlap any of their earlier ones.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Employment to open
| employee_user_id required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... The employed user; must be a current member of the company. Immutable once set. |
string or null Default: null The approving manager; must be a current member of the company and cannot be the employee themselves. Null means submitted timesheets auto-approve. | |
| jurisdiction | string Default: "FI" Value: "FI" Employment-law jurisdiction |
| contract_type required | string Enum: "permanent" "fixed_term" Contract type; a fixed_term contract requires an end_date |
| schedule_type required | string Enum: "full_time" "part_time" "zero_hours" Working-time schedule; only zero_hours may guarantee 0 standard hours |
| standard_hours_per_week required | string^[0-9]+(\.[0-9]{1,2})?$ Contractually guaranteed weekly hours (0-168, up to 2 decimals) |
| daily_overtime_threshold_hours | string^[0-9]+(\.[0-9]{1,2})?$ Default: "8" Daily hours beyond which overtime accrues (0-24, exclusive of 0, up to 2 decimals) |
| overtime_multiplier | string^[0-9]+(\.[0-9]{1,2})?$ Default: "1.5" Pay multiplier for overtime hours (1-99.99, up to 2 decimals) |
| start_date required | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... First day of the employment (inclusive) |
string or null Default: null Last day of the employment (inclusive); required for a fixed_term contract |
{- "employee_user_id": "eb5e2081-3889-49e3-bc18-833472df6511",
- "manager_user_id": null,
- "jurisdiction": "FI",
- "contract_type": "permanent",
- "schedule_type": "full_time",
- "standard_hours_per_week": "string",
- "daily_overtime_threshold_hours": "8",
- "overtime_multiplier": "1.5",
- "start_date": "2019-08-24",
- "end_date": null
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "employee": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "manager": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "jurisdiction": "FI",
- "contract_type": "permanent",
- "schedule_type": "full_time",
- "standard_hours_per_week": "string",
- "daily_overtime_threshold_hours": "string",
- "overtime_multiplier": "string",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "status": "active",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Retrieve a single employment contract by ID.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| employmentId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Employment ID |
{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "employee": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "manager": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "jurisdiction": "FI",
- "contract_type": "permanent",
- "schedule_type": "full_time",
- "standard_hours_per_week": "string",
- "daily_overtime_threshold_hours": "string",
- "overtime_multiplier": "string",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "status": "active",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Partially update an employment. Validation runs against the resulting employment, not the submitted fields alone, so a change that breaks a cross-field rule is rejected even when the field it conflicts with is untouched. The employee and the status cannot be changed here.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| employmentId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Employment ID |
Fields to change
string or null The approving manager; pass null to remove the manager | |
| jurisdiction | string Value: "FI" |
| contract_type | string Enum: "permanent" "fixed_term" |
| schedule_type | string Enum: "full_time" "part_time" "zero_hours" |
| standard_hours_per_week | string^[0-9]+(\.[0-9]{1,2})?$ |
| daily_overtime_threshold_hours | string^[0-9]+(\.[0-9]{1,2})?$ |
| overtime_multiplier | string^[0-9]+(\.[0-9]{1,2})?$ |
| start_date | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... |
string or null |
{- "manager_user_id": "8dda3f52-952c-4237-a3a7-321fee65b913",
- "jurisdiction": "FI",
- "contract_type": "permanent",
- "schedule_type": "full_time",
- "standard_hours_per_week": "string",
- "daily_overtime_threshold_hours": "string",
- "overtime_multiplier": "string",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "employee": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "manager": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "jurisdiction": "FI",
- "contract_type": "permanent",
- "schedule_type": "full_time",
- "standard_hours_per_week": "string",
- "daily_overtime_threshold_hours": "string",
- "overtime_multiplier": "string",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "status": "active",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Close an open employment on the given last working day. The employee may then be removed from the company, and a new employment may be opened for them.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| employmentId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Employment ID |
Termination date
| end_date required | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Last day of the employment (inclusive) |
{- "end_date": "2019-08-24"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "employee": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "manager": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "jurisdiction": "FI",
- "contract_type": "permanent",
- "schedule_type": "full_time",
- "standard_hours_per_week": "string",
- "daily_overtime_threshold_hours": "string",
- "overtime_multiplier": "string",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "status": "active",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Undo an :end. end_date states the period the reopened employment has: null for an open-ended contract, a date for a fixed-term one (whose end date the :end may have overwritten, and which cannot be recovered automatically). The employee must be a current member again, and must not already hold another open employment.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| employmentId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Employment ID |
The period the reopened employment has
required | string or null Last day of the reopened employment (inclusive); null for an open-ended contract |
{- "end_date": "2019-08-24"
}{- "data": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "employee": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "manager": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "display_name": "string"
}, - "jurisdiction": "FI",
- "contract_type": "permanent",
- "schedule_type": "full_time",
- "standard_hours_per_week": "string",
- "daily_overtime_threshold_hours": "string",
- "overtime_multiplier": "string",
- "start_date": "2019-08-24",
- "end_date": "2019-08-24",
- "status": "active",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}The caller's twelve months of the given year as summaries (no per-day data): existing timesheets merged with empty version-0 drafts for the months that have no row yet. Reading never creates rows.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| year required | integer [ 2000 .. 2100 ] Calendar year (2000-2100) |
{- "data": [
- {
- "month": "string",
- "entry_mode": "daily",
- "status": "draft",
- "version": 9007199254740991,
- "total_hours": "string"
}
]
}The caller's fully resolved month: every calendar day with its logged lines and exact day total. A month with no timesheet row reads as an empty draft at version 0 — the version a first PUT must send. Reading never creates rows.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| month required | string^\d{4}-(0[1-9]|1[0-2])$ Calendar month in YYYY-MM form |
{- "data": {
- "month": "string",
- "period_start": "2019-08-24",
- "period_end": "2019-08-24",
- "entry_mode": "daily",
- "status": "draft",
- "version": 9007199254740991,
- "total_hours": "string",
- "submitted_at": "2019-08-24T14:15:22Z",
- "approved_by": "02030314-b162-4b4d-8af1-88eabdcc615d",
- "approved_at": "2019-08-24T14:15:22Z",
- "returned_by": "6945d65c-9d7f-40c0-b480-5ad7fb654bce",
- "returned_at": "2019-08-24T14:15:22Z",
- "return_reason": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "days": [
- {
- "date": "2019-08-24",
- "day_total": "string",
- "lines": [
- {
- "id": "string",
- "hour_type": "normal",
- "hours": "string",
- "start_time": "string",
- "end_time": "string",
- "break_minutes": -9007199254740991,
- "notes": "string"
}
]
}
]
}
}Full-replace write of the caller's month: the submitted workdays become the month's complete line set (an empty array clears it). Resending the set already stored is an idempotent no-op: the version does not move. Only a draft month accepts writes, and the write never touches the lifecycle stamps — submission and approval belong to the workflow endpoints. Concurrency: the request's version must match the stored one (0 when no row exists yet); a mismatch, a non-draft month, or a concurrently created month is rejected with 409, while a missing prerequisite — no employment covering the month — is 422. Creating a month requires an employment whose period overlaps it; future months are allowed. Cross-field rules (a line states hours or a start/end segment, dates inside the month, per-day total at most 24 h, positive net segment span, and no segment running past midnight) are rejected with 422. An overnight shift is entered as two segments split at midnight — 22:00-24:00 on the earlier date, 00:00-06:00 on the later one — which fall in different months when the split crosses a month boundary.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| month required | string^\d{4}-(0[1-9]|1[0-2])$ Calendar month in YYYY-MM form |
The complete workday set for the month, and the version it is based on
| version required | integer [ 0 .. 9007199254740991 ] The version this write is based on — what the last GET returned (0 for a month with no timesheet yet). A stale version is rejected with 409 |
required | Array of objects <= 500 items The complete workday set for the month; the previous set is replaced wholesale and an empty array clears the month. A date may appear on several lines (split shifts). Each line states hours or a start_time/end_time segment, never both |
{- "version": 9007199254740991,
- "workdays": [
- {
- "work_date": "2019-08-24",
- "hour_type": "normal",
- "hours": "string",
- "start_time": "string",
- "end_time": "string",
- "break_minutes": 1439,
- "notes": "string"
}
]
}{- "data": {
- "month": "string",
- "period_start": "2019-08-24",
- "period_end": "2019-08-24",
- "entry_mode": "daily",
- "status": "draft",
- "version": 9007199254740991,
- "total_hours": "string",
- "submitted_at": "2019-08-24T14:15:22Z",
- "approved_by": "02030314-b162-4b4d-8af1-88eabdcc615d",
- "approved_at": "2019-08-24T14:15:22Z",
- "returned_by": "6945d65c-9d7f-40c0-b480-5ad7fb654bce",
- "returned_at": "2019-08-24T14:15:22Z",
- "return_reason": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "days": [
- {
- "date": "2019-08-24",
- "day_total": "string",
- "lines": [
- {
- "id": "string",
- "hour_type": "normal",
- "hours": "string",
- "start_time": "string",
- "end_time": "string",
- "break_minutes": -9007199254740991,
- "notes": "string"
}
]
}
]
}
}Retrieve products for a company with optional search and pagination
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| query | string Example: query=laptop Search query (searches in product names and descriptions) |
| offset | integer [ 0 .. 9007199254740991 ] Number of results to skip for pagination |
| limit | integer [ 1 .. 100 ] Example: limit=10 Maximum number of results to return |
| include_inactive | boolean Include inactive (deleted) products in results |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "description": "string",
- "unit_price": "string",
- "unit_name": "string",
- "currency": "string",
- "type": "services",
- "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "total": -9007199254740991,
- "limit": -9007199254740991,
- "offset": -9007199254740991
}
}Create a new product
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Product creation data
| title required | string <= 255 characters |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null |
{- "title": "string",
- "description": "string",
- "unit_price": "string",
- "unit_name": "string",
- "vat_rate": "string",
- "currency": "str",
- "type": "services"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "description": "string",
- "unit_price": "string",
- "unit_name": "string",
- "vat_rate": "string",
- "currency": "string",
- "type": "services",
- "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Retrieve product details
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| productId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Product ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "description": "string",
- "unit_price": "string",
- "unit_name": "string",
- "vat_rate": "string",
- "currency": "string",
- "type": "services",
- "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Update product details
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| productId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Product ID |
Product update data
| title | string <= 255 characters |
| description | string <= 255 characters |
| unit_price | string^-?[0-9]+(\.[0-9]{1,8})?$ |
| unit_name | string <= 16 characters |
| vat_rate | string^(?:100(?:\.0{1,2})?|(?:0|[1-9]\d?)(?:\.\d{1,... |
| currency | string = 3 characters |
| type | string Enum: "services" "goods" "electronic_services" |
{- "title": "string",
- "description": "string",
- "unit_price": "string",
- "unit_name": "string",
- "vat_rate": "string",
- "currency": "str",
- "type": "services"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "description": "string",
- "unit_price": "string",
- "unit_name": "string",
- "vat_rate": "string",
- "currency": "string",
- "type": "services",
- "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Delete a product
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| productId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Product ID |
{- "error": "Forbidden",
- "code": "FORBIDDEN",
- "debug": "User does not have permission to perform this action",
- "timestamp": "2024-01-15T10:30:00Z"
}Reactivate a deleted (inactive) product
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| productId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Product ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "string",
- "description": "string",
- "unit_price": "string",
- "unit_name": "string",
- "vat_rate": "string",
- "currency": "string",
- "type": "services",
- "is_active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Retrieve purchase invoices for a company with optional filtering
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| status | Array of strings (SalesInvoiceItems) unique Items Enum: "draft" "approved" "rejected" "voided" Example: status=draft&status=approved Filter by one or more document statuses using repeated query parameters |
| payment_status | Array of strings (InvoicePaymentStatus) unique Items Enum: "paid" "partially_paid" "unpaid" Example: payment_status=unpaid&payment_status=partially_paid Filter by one or more payment statuses using repeated query parameters |
| cursor | string Pagination cursor from previous response |
| limit | integer [ 1 .. 100 ] Example: limit=10 Maximum number of results to return |
| owner_user_id | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Filter by owner user ID |
| party_id | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Example: party_id=123e4567-e89b-12d3-a456-426614174000 Filter by supplier party ID |
| invoice_date_from | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: invoice_date_from=2026-01-01 Filter by invoice date, inclusive lower bound (ISO date). Must be <= invoice_date_to when both are provided; an inverted range returns 400. |
| invoice_date_to | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: invoice_date_to=2026-01-31 Filter by invoice date, inclusive upper bound (ISO date). Must be >= invoice_date_from when both are provided; an inverted range returns 400. |
| due_date_from | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: due_date_from=2026-02-01 Filter by due date, inclusive lower bound (ISO date). Must be <= due_date_to when both are provided; an inverted range returns 400. |
| due_date_to | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: due_date_to=2026-02-28 Filter by due date, inclusive upper bound (ISO date). Must be >= due_date_from when both are provided; an inverted range returns 400. |
| overdue_as_of | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: overdue_as_of=2026-07-13 Return only overdue rows as of this calendar date: due date strictly before the given day AND payment status not |
| party_business_id | string [ 1 .. 64 ] characters Example: party_business_id=1234567-8 Case-insensitive prefix match on the supplier's business ID: the value must match from the start of the ID, so |
| amount_min | string^-?[0-9]+(\.[0-9]{1,8})?$ Example: amount_min=100.00 Filter by minimum gross amount (inclusive, plain decimal string). Must be <= amount_max when both are provided; an inverted range returns 400. |
| amount_max | string^-?[0-9]+(\.[0-9]{1,8})?$ Example: amount_max=5000.00 Filter by maximum gross amount (inclusive, plain decimal string). Must be >= amount_min when both are provided; an inverted range returns 400. |
| q | string [ 1 .. 255 ] characters Example: q=acme Case-insensitive free-text search; the match type fits the field: supplier name and description match as a substring, the supplier business ID matches as a prefix, and invoice number and reference match exactly (a fragment of a number does not match). SQL LIKE metacharacters ( |
| sort_by | string (InvoiceSortBy) Enum: "date" "created_at" "amount" "counterparty" Example: sort_by=date Sort order: |
{- "example_query": "/companies/{companyId}/purchase-invoices?owner_user_id=73930057-2a35-4b9a-a675-4478e5fd3f4a&status=draft&payment_status=unpaid&payment_status=partially_paid&limit=10",
- "data": [
- {
- "id": "011b624e-6318-4137-99b1-199c264a5b4b",
- "description": "Electricity bill January",
- "invoice_date": "2024-01-15",
- "due_date": "2024-02-15",
- "currency": "EUR",
- "total_amount_gross": "124",
- "total_amount_net": "100",
- "total_amount_vat": "24",
- "supplier": {
- "name": "Energy Company"
}, - "status": "draft",
- "payment_status": "unpaid"
}
], - "meta": {
- "pagination": {
- "limit": 10,
- "has_more": false
}
}
}Create a new purchase invoice
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Purchase invoice creation data
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null Supplier party ID | |
string or null | |
string or null | |
string or null | |
Array of objects or null | |
| files | Array of strings <uuid> [ items <uuid >^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... ] Optional array of file IDs to attach (replaces all existing files when provided; pass an empty array to clear all files) |
Array of strings or null |
{- "description": "string",
- "invoice_date": "2019-08-24",
- "due_date": "2019-08-24",
- "invoice_number": "string",
- "currency": "EUR",
- "total_amount_gross": "string",
- "total_amount_net": "string",
- "total_amount_vat": "string",
- "payment_method": "string",
- "reference": "string",
- "supplier_id": "3cb1e20c-c6c9-4e71-ba66-399c468f697c",
- "supplier_iban": "string",
- "supplier_bic": "string",
- "recipient_name": "string",
- "lines": [
- {
- "title": "string",
- "description": "string",
- "quantity": "string",
- "unit_price_net": "string",
- "vat_rate": "string",
- "reverse_vat_rate": "string",
- "vat_amount": "string",
- "vat_handling": "standard",
- "amount_gross": "string",
- "amount_net": "string",
- "type": "services",
- "unit_name": "string",
- "amortization_type": "string",
- "vat_class_code": "string"
}
], - "files": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "tags": [
- "string"
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "invoice_number": "string",
- "invoice_date": "2019-08-24",
- "document_date": "2019-08-24",
- "due_date": "2019-08-24",
- "description": "string",
- "currency": "string",
- "company": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "supplier": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "registration_country_code": "string",
- "business_id": "string",
- "number": 0
}, - "supplier_stated_name": "string",
- "supplier_stated_business_id": "string",
- "supplier_iban": "string",
- "supplier_bic": "string",
- "recipient_name": "string",
- "payment_method": "string",
- "source": "einvoice",
- "reference": "string",
- "internal_notes": "string",
- "delegated_by_user_id": "be8da939-c65d-49cd-9cb4-f522d9d858d8",
- "total_amount_net": "string",
- "total_amount_gross": "string",
- "total_amount_vat": "string",
- "rounding_amount_gross": "string",
- "rounding_amount_net": "string",
- "payable_amount": "string",
- "unsettled_amount": "string",
- "ai_summary": "string",
- "lines": [
- {
- "id": "string",
- "title": "string",
- "description": "string",
- "quantity": "string",
- "unit_price_net": "string",
- "vat_rate": "string",
- "reverse_vat_rate": "string",
- "vat_amount": "string",
- "vat_handling": "standard",
- "amount_net": "string",
- "amount_gross": "string",
- "type": "services",
- "unit_name": "string",
- "amortization_type": "string",
- "vat_class_code": "string"
}
], - "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "tags": [
- "string"
], - "caution_level": "caution",
- "status": "draft",
- "payment_status": "paid",
- "current_assignee_user_id": "3d697ec3-cb4c-4391-8815-473809da15c5",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "audit_summary": [
- {
- "id": "string",
- "action": "string",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "created_at": "2019-08-24T14:15:22Z"
}
]
}Retrieve purchase invoice details
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| purchaseInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Purchase invoice ID |
{- "id": "50345a92-121d-4428-9805-a53b416cfaaf",
- "description": "Laptop for new hire",
- "invoice_date": "2024-01-15",
- "due_date": "2024-02-15",
- "currency": "EUR",
- "total_amount_gross": "124",
- "total_amount_net": "100",
- "total_amount_vat": "24",
- "supplier": {
- "name": "Tech Supplier"
}, - "status": "draft"
}Update purchase invoice details
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| purchaseInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Purchase invoice ID |
Purchase invoice update data
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null Supplier party ID | |
| supplier_iban | string |
| supplier_bic | string |
| recipient_name | string |
Array of objects or null | |
| files | Array of strings <uuid> [ items <uuid >^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... ] Optional array of file IDs to attach (replaces all existing files when provided; pass an empty array to clear all files) |
Array of strings or null |
{- "description": "string",
- "internal_notes": "string",
- "invoice_date": "2019-08-24",
- "due_date": "2019-08-24",
- "invoice_number": "string",
- "currency": "EUR",
- "total_amount_gross": "string",
- "total_amount_net": "string",
- "total_amount_vat": "string",
- "payment_method": "string",
- "reference": "string",
- "supplier_id": "3cb1e20c-c6c9-4e71-ba66-399c468f697c",
- "supplier_iban": "string",
- "supplier_bic": "string",
- "recipient_name": "string",
- "lines": [
- {
- "title": "string",
- "description": "string",
- "quantity": "string",
- "unit_price_net": "string",
- "vat_rate": "string",
- "reverse_vat_rate": "string",
- "vat_amount": "string",
- "vat_handling": "standard",
- "amount_gross": "string",
- "amount_net": "string",
- "type": "services",
- "unit_name": "string",
- "amortization_type": "string",
- "vat_class_code": "string"
}
], - "files": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "tags": [
- "string"
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "invoice_number": "string",
- "invoice_date": "2019-08-24",
- "document_date": "2019-08-24",
- "due_date": "2019-08-24",
- "description": "string",
- "currency": "string",
- "company": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "supplier": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "registration_country_code": "string",
- "business_id": "string",
- "number": 0
}, - "supplier_stated_name": "string",
- "supplier_stated_business_id": "string",
- "supplier_iban": "string",
- "supplier_bic": "string",
- "recipient_name": "string",
- "payment_method": "string",
- "source": "einvoice",
- "reference": "string",
- "internal_notes": "string",
- "delegated_by_user_id": "be8da939-c65d-49cd-9cb4-f522d9d858d8",
- "total_amount_net": "string",
- "total_amount_gross": "string",
- "total_amount_vat": "string",
- "rounding_amount_gross": "string",
- "rounding_amount_net": "string",
- "payable_amount": "string",
- "unsettled_amount": "string",
- "ai_summary": "string",
- "lines": [
- {
- "id": "string",
- "title": "string",
- "description": "string",
- "quantity": "string",
- "unit_price_net": "string",
- "vat_rate": "string",
- "reverse_vat_rate": "string",
- "vat_amount": "string",
- "vat_handling": "standard",
- "amount_net": "string",
- "amount_gross": "string",
- "type": "services",
- "unit_name": "string",
- "amortization_type": "string",
- "vat_class_code": "string"
}
], - "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "tags": [
- "string"
], - "caution_level": "caution",
- "status": "draft",
- "payment_status": "paid",
- "current_assignee_user_id": "3d697ec3-cb4c-4391-8815-473809da15c5",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "audit_summary": [
- {
- "id": "string",
- "action": "string",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "created_at": "2019-08-24T14:15:22Z"
}
]
}Delete a purchase invoice
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| purchaseInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Purchase invoice ID |
{- "error": "Forbidden",
- "code": "FORBIDDEN",
- "debug": "User does not have permission to perform this action",
- "timestamp": "2024-01-15T10:30:00Z"
}Approve a purchase invoice
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| purchaseInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Purchase invoice ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "invoice_number": "string",
- "invoice_date": "2019-08-24",
- "document_date": "2019-08-24",
- "due_date": "2019-08-24",
- "description": "string",
- "currency": "string",
- "company": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "supplier": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "registration_country_code": "string",
- "business_id": "string",
- "number": 0
}, - "supplier_stated_name": "string",
- "supplier_stated_business_id": "string",
- "supplier_iban": "string",
- "supplier_bic": "string",
- "recipient_name": "string",
- "payment_method": "string",
- "source": "einvoice",
- "reference": "string",
- "internal_notes": "string",
- "delegated_by_user_id": "be8da939-c65d-49cd-9cb4-f522d9d858d8",
- "total_amount_net": "string",
- "total_amount_gross": "string",
- "total_amount_vat": "string",
- "rounding_amount_gross": "string",
- "rounding_amount_net": "string",
- "payable_amount": "string",
- "unsettled_amount": "string",
- "ai_summary": "string",
- "lines": [
- {
- "id": "string",
- "title": "string",
- "description": "string",
- "quantity": "string",
- "unit_price_net": "string",
- "vat_rate": "string",
- "reverse_vat_rate": "string",
- "vat_amount": "string",
- "vat_handling": "standard",
- "amount_net": "string",
- "amount_gross": "string",
- "type": "services",
- "unit_name": "string",
- "amortization_type": "string",
- "vat_class_code": "string"
}
], - "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "tags": [
- "string"
], - "caution_level": "caution",
- "status": "draft",
- "payment_status": "paid",
- "current_assignee_user_id": "3d697ec3-cb4c-4391-8815-473809da15c5",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "audit_summary": [
- {
- "id": "string",
- "action": "string",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "created_at": "2019-08-24T14:15:22Z"
}
]
}Re-run AI line-classification enrichment on a draft purchase invoice. Idempotent: lines that are already classified are left untouched. Fire-and-forget.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| purchaseInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Purchase invoice ID |
{- "status": "reclassification_requested"
}Post-approval recovery for an approved purchase invoice with no GL voucher: optionally set or correct line vat_class_code values (audited with from/to), then synchronously attempt rule-based voucher generation. Corrections and generation run in one transaction — precondition failures (no effective posting rule, non-EUR currency, closed or missing fiscal period) return 400 with nothing applied. Corrections on an already-vouchered invoice are applied and reported as already_exists (the voucher is never regenerated); a request that changes nothing on an already-vouchered invoice returns 409. An empty request retries generation without changing lines.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| purchaseInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Purchase invoice ID |
Line classification corrections to apply before generating (may be empty)
Array of objects Line classification corrections to apply before generating. Omit (or send empty) to retry generation without changing any line — the recovery path after posting rules were seeded. |
{- "line_classifications": [
- {
- "line_id": "string",
- "vat_class_code": "string"
}
]
}{- "corrected_line_ids": [
- "string"
], - "voucher_generation": {
- "status": "created",
- "voucher_id": "1b5a607b-e5eb-4b17-80b0-5739c041e81b"
}
}Reject a purchase invoice
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| purchaseInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Purchase invoice ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "invoice_number": "string",
- "invoice_date": "2019-08-24",
- "document_date": "2019-08-24",
- "due_date": "2019-08-24",
- "description": "string",
- "currency": "string",
- "company": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "supplier": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "registration_country_code": "string",
- "business_id": "string",
- "number": 0
}, - "supplier_stated_name": "string",
- "supplier_stated_business_id": "string",
- "supplier_iban": "string",
- "supplier_bic": "string",
- "recipient_name": "string",
- "payment_method": "string",
- "source": "einvoice",
- "reference": "string",
- "internal_notes": "string",
- "delegated_by_user_id": "be8da939-c65d-49cd-9cb4-f522d9d858d8",
- "total_amount_net": "string",
- "total_amount_gross": "string",
- "total_amount_vat": "string",
- "rounding_amount_gross": "string",
- "rounding_amount_net": "string",
- "payable_amount": "string",
- "unsettled_amount": "string",
- "ai_summary": "string",
- "lines": [
- {
- "id": "string",
- "title": "string",
- "description": "string",
- "quantity": "string",
- "unit_price_net": "string",
- "vat_rate": "string",
- "reverse_vat_rate": "string",
- "vat_amount": "string",
- "vat_handling": "standard",
- "amount_net": "string",
- "amount_gross": "string",
- "type": "services",
- "unit_name": "string",
- "amortization_type": "string",
- "vat_class_code": "string"
}
], - "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "tags": [
- "string"
], - "caution_level": "caution",
- "status": "draft",
- "payment_status": "paid",
- "current_assignee_user_id": "3d697ec3-cb4c-4391-8815-473809da15c5",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "audit_summary": [
- {
- "id": "string",
- "action": "string",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "created_at": "2019-08-24T14:15:22Z"
}
]
}Delegate a purchase invoice to another user
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| purchaseInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Purchase invoice ID |
Delegation data
| to_user_id required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... |
{- "to_user_id": "bdcaa974-8e23-4fc9-823d-e060850bbef1"
}{- "error": "string",
- "code": "string",
- "debug": "string",
- "timestamp": "2019-08-24T14:15:22Z",
- "details": {
- "property1": null,
- "property2": null
}
}Send back a purchase invoice to the company's default approver
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| purchaseInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Purchase invoice ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "invoice_number": "string",
- "invoice_date": "2019-08-24",
- "document_date": "2019-08-24",
- "due_date": "2019-08-24",
- "description": "string",
- "currency": "string",
- "company": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}, - "supplier": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "registration_country_code": "string",
- "business_id": "string",
- "number": 0
}, - "supplier_stated_name": "string",
- "supplier_stated_business_id": "string",
- "supplier_iban": "string",
- "supplier_bic": "string",
- "recipient_name": "string",
- "payment_method": "string",
- "source": "einvoice",
- "reference": "string",
- "internal_notes": "string",
- "delegated_by_user_id": "be8da939-c65d-49cd-9cb4-f522d9d858d8",
- "total_amount_net": "string",
- "total_amount_gross": "string",
- "total_amount_vat": "string",
- "rounding_amount_gross": "string",
- "rounding_amount_net": "string",
- "payable_amount": "string",
- "unsettled_amount": "string",
- "ai_summary": "string",
- "lines": [
- {
- "id": "string",
- "title": "string",
- "description": "string",
- "quantity": "string",
- "unit_price_net": "string",
- "vat_rate": "string",
- "reverse_vat_rate": "string",
- "vat_amount": "string",
- "vat_handling": "standard",
- "amount_net": "string",
- "amount_gross": "string",
- "type": "services",
- "unit_name": "string",
- "amortization_type": "string",
- "vat_class_code": "string"
}
], - "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "tags": [
- "string"
], - "caution_level": "caution",
- "status": "draft",
- "payment_status": "paid",
- "current_assignee_user_id": "3d697ec3-cb4c-4391-8815-473809da15c5",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "audit_summary": [
- {
- "id": "string",
- "action": "string",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "created_at": "2019-08-24T14:15:22Z"
}
]
}Generate a hierarchical Profit & Loss report for the specified date range. Returns revenue and expense accounts aggregated by account hierarchy with totals. Tree is sorted in ascending numeric order by codes.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Report generation parameters
| start_date required | string^\d{4}-\d{2}-\d{2}$ Start date of the reporting period (ISO date format: YYYY-MM-DD) |
| end_date required | string^\d{4}-\d{2}-\d{2}$ End date of the reporting period (ISO date format: YYYY-MM-DD) |
{- "start_date": "string",
- "end_date": "string"
}{- "period": {
- "start": "string",
- "end": "string"
}, - "currency": "string",
- "roots": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "account_code": "string",
- "account_code_min": "string",
- "account_code_max": "string",
- "name": "string",
- "period_debit": "string",
- "period_credit": "string",
- "period_net": "string",
- "presentation_amount": "string",
- "children": [
- { }
]
}
], - "totals": {
- "revenue": "string",
- "expenses": "string"
}, - "presentation_totals": {
- "revenue": "string",
- "expenses": "string",
- "result": "string"
}
}Generate a hierarchical Balance Sheet report as of a specific date. Returns asset, liability, and equity accounts aggregated by account hierarchy with totals. Optional comparison dates add parallel per-node and totals figures computed at each comparison date.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Report generation parameters
| as_of_date required | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Balance sheet date (ISO format: YYYY-MM-DD) |
| comparisons | Array of strings <date> <= 1 items [ items <date >^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... ] Additional snapshot dates to evaluate the balance sheet at alongside as_of_date. |
{- "as_of_date": "2019-08-24",
- "comparisons": [
- "2019-08-24"
]
}{- "as_of_date": "2019-08-24",
- "currency": "string",
- "roots": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "account_code": "string",
- "account_code_min": "string",
- "account_code_max": "string",
- "name": "string",
- "amount": "string",
- "presentation_amount": "string",
- "comparisons": [
- {
- "as_of_date": "2019-08-24",
- "amount": "string",
- "presentation_amount": "string"
}
], - "children": [
- { }
]
}
], - "totals": {
- "assets": "string",
- "liabilities": "string",
- "equity": "string"
}, - "presentation_totals": {
- "assets": "string",
- "liabilities": "string",
- "equity": "string"
}, - "comparisons": [
- {
- "as_of_date": "2019-08-24",
- "totals": {
- "assets": "string",
- "liabilities": "string",
- "equity": "string"
}, - "presentation_totals": {
- "assets": "string",
- "liabilities": "string",
- "equity": "string"
}
}
]
}Generate a structured ALV-laskelma (VAT calculation report) for the specified period. Groups GL entries by tax rate into taxes payable (suoritettavat verot) and deductible taxes (vähennettävät verot) sections, with per-account breakdowns and reconciliation against VAT GL accounts.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
VAT report generation parameters
| period_start required | string^\d{4}-\d{2}-\d{2}$ First day of the VAT period (ISO date format: YYYY-MM-DD) |
| period_end required | string^\d{4}-\d{2}-\d{2}$ Last day of the VAT period (ISO date format: YYYY-MM-DD) |
{- "period_start": "string",
- "period_end": "string"
}{- "period": {
- "start": "string",
- "end": "string"
}, - "currency": "EUR",
- "company": {
- "name": "string",
- "business_id": "string"
}, - "sections": [
- {
- "type": "taxes_payable",
- "label": "string",
- "rate_groups": [
- {
- "vat_rate": "string",
- "total_debit": "string",
- "total_credit": "string",
- "tax_amount": "string",
- "vat_classes": [
- {
- "vat_class_code": "string",
- "total_debit": "string",
- "total_credit": "string",
- "tax_amount": "string",
- "net_base": "string",
- "calculated_vat_difference": "string",
- "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
], - "base_accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "net_bases": [
- {
- "vat_class_code": "string",
- "vat_rate": "string",
- "net_base": "string",
- "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "total": "string"
}, - {
- "type": "taxes_payable",
- "label": "string",
- "rate_groups": [
- {
- "vat_rate": "string",
- "total_debit": "string",
- "total_credit": "string",
- "tax_amount": "string",
- "vat_classes": [
- {
- "vat_class_code": "string",
- "total_debit": "string",
- "total_credit": "string",
- "tax_amount": "string",
- "net_base": "string",
- "calculated_vat_difference": "string",
- "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
], - "base_accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "net_bases": [
- {
- "vat_class_code": "string",
- "vat_rate": "string",
- "net_base": "string",
- "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "total": "string"
}
], - "taxes_payable_total": "string",
- "deductible_taxes_total": "string",
- "tax_payable": "string",
- "vat_payable_account_balance": "string",
- "vat_receivable_account_balance": "string",
- "reconciliation": {
- "vat_payable": {
- "section_total": "string",
- "account_balance": "string",
- "difference": "string"
}, - "vat_receivable": {
- "section_total": "string",
- "account_balance": "string",
- "difference": "string"
}, - "unplaceable_lines": [
- {
- "voucher_number": "string",
- "document_type": "string",
- "posting_date": "string",
- "account_code": "string",
- "amount": "string",
- "reason": "missing_vat_class"
}
]
}
}Compute the VAT report for the period and persist it as the draft VAT declaration snapshot, returning the persisted snapshot. Idempotent per period; a submitted (filed) declaration is immutable and returned unchanged. Returns 200 (not 201): this is an upsert of the single declaration for the period, which usually refreshes an existing draft rather than creating a new resource.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
VAT declaration period
| period_start required | string^\d{4}-\d{2}-\d{2}$ First day of the VAT period (ISO date format: YYYY-MM-DD) |
| period_end required | string^\d{4}-\d{2}-\d{2}$ Last day of the VAT period (ISO date format: YYYY-MM-DD) |
{- "period_start": "string",
- "period_end": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "period": {
- "start": "string",
- "end": "string"
}, - "status": "draft",
- "generated_at": "2019-08-24T14:15:22Z",
- "submitted_at": "2019-08-24T14:15:22Z",
- "report": {
- "period": {
- "start": "string",
- "end": "string"
}, - "currency": "EUR",
- "company": {
- "name": "string",
- "business_id": "string"
}, - "sections": [
- {
- "type": "taxes_payable",
- "label": "string",
- "rate_groups": [
- {
- "vat_rate": "string",
- "total_debit": "string",
- "total_credit": "string",
- "tax_amount": "string",
- "vat_classes": [
- {
- "vat_class_code": "string",
- "total_debit": "string",
- "total_credit": "string",
- "tax_amount": "string",
- "net_base": "string",
- "calculated_vat_difference": "string",
- "accounts": [
- {
- "account_code": null,
- "account_name": null,
- "debit": null,
- "credit": null
}
], - "base_accounts": [
- {
- "account_code": null,
- "account_name": null,
- "debit": null,
- "credit": null
}
]
}
], - "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "net_bases": [
- {
- "vat_class_code": "string",
- "vat_rate": "string",
- "net_base": "string",
- "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "total": "string"
}, - {
- "type": "taxes_payable",
- "label": "string",
- "rate_groups": [
- {
- "vat_rate": "string",
- "total_debit": "string",
- "total_credit": "string",
- "tax_amount": "string",
- "vat_classes": [
- {
- "vat_class_code": "string",
- "total_debit": "string",
- "total_credit": "string",
- "tax_amount": "string",
- "net_base": "string",
- "calculated_vat_difference": "string",
- "accounts": [
- {
- "account_code": null,
- "account_name": null,
- "debit": null,
- "credit": null
}
], - "base_accounts": [
- {
- "account_code": null,
- "account_name": null,
- "debit": null,
- "credit": null
}
]
}
], - "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "net_bases": [
- {
- "vat_class_code": "string",
- "vat_rate": "string",
- "net_base": "string",
- "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "total": "string"
}
], - "taxes_payable_total": "string",
- "deductible_taxes_total": "string",
- "tax_payable": "string",
- "vat_payable_account_balance": "string",
- "vat_receivable_account_balance": "string",
- "reconciliation": {
- "vat_payable": {
- "section_total": "string",
- "account_balance": "string",
- "difference": "string"
}, - "vat_receivable": {
- "section_total": "string",
- "account_balance": "string",
- "difference": "string"
}, - "unplaceable_lines": [
- {
- "voucher_number": "string",
- "document_type": "string",
- "posting_date": "string",
- "account_code": "string",
- "amount": "string",
- "reason": "missing_vat_class"
}
]
}
}
}Fetch the persisted VAT declaration snapshot for an exact period (period_start, period_end). A single snapshot exists per period; returns 404 when the period has not been generated yet.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| period_start required | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... First day of the VAT period (ISO date format: YYYY-MM-DD) |
| period_end required | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Last day of the VAT period (ISO date format: YYYY-MM-DD) |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "period": {
- "start": "string",
- "end": "string"
}, - "status": "draft",
- "generated_at": "2019-08-24T14:15:22Z",
- "submitted_at": "2019-08-24T14:15:22Z",
- "report": {
- "period": {
- "start": "string",
- "end": "string"
}, - "currency": "EUR",
- "company": {
- "name": "string",
- "business_id": "string"
}, - "sections": [
- {
- "type": "taxes_payable",
- "label": "string",
- "rate_groups": [
- {
- "vat_rate": "string",
- "total_debit": "string",
- "total_credit": "string",
- "tax_amount": "string",
- "vat_classes": [
- {
- "vat_class_code": "string",
- "total_debit": "string",
- "total_credit": "string",
- "tax_amount": "string",
- "net_base": "string",
- "calculated_vat_difference": "string",
- "accounts": [
- {
- "account_code": null,
- "account_name": null,
- "debit": null,
- "credit": null
}
], - "base_accounts": [
- {
- "account_code": null,
- "account_name": null,
- "debit": null,
- "credit": null
}
]
}
], - "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "net_bases": [
- {
- "vat_class_code": "string",
- "vat_rate": "string",
- "net_base": "string",
- "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "total": "string"
}, - {
- "type": "taxes_payable",
- "label": "string",
- "rate_groups": [
- {
- "vat_rate": "string",
- "total_debit": "string",
- "total_credit": "string",
- "tax_amount": "string",
- "vat_classes": [
- {
- "vat_class_code": "string",
- "total_debit": "string",
- "total_credit": "string",
- "tax_amount": "string",
- "net_base": "string",
- "calculated_vat_difference": "string",
- "accounts": [
- {
- "account_code": null,
- "account_name": null,
- "debit": null,
- "credit": null
}
], - "base_accounts": [
- {
- "account_code": null,
- "account_name": null,
- "debit": null,
- "credit": null
}
]
}
], - "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "net_bases": [
- {
- "vat_class_code": "string",
- "vat_rate": "string",
- "net_base": "string",
- "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "total": "string"
}
], - "taxes_payable_total": "string",
- "deductible_taxes_total": "string",
- "tax_payable": "string",
- "vat_payable_account_balance": "string",
- "vat_receivable_account_balance": "string",
- "reconciliation": {
- "vat_payable": {
- "section_total": "string",
- "account_balance": "string",
- "difference": "string"
}, - "vat_receivable": {
- "section_total": "string",
- "account_balance": "string",
- "difference": "string"
}, - "unplaceable_lines": [
- {
- "voucher_number": "string",
- "document_type": "string",
- "posting_date": "string",
- "account_code": "string",
- "amount": "string",
- "reason": "missing_vat_class"
}
]
}
}
}Fetch a previously generated VAT declaration snapshot by its id. Returns the full report payload as generated (or frozen as filed) plus its status and timestamps.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| snapshotId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... VAT declaration snapshot ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "period": {
- "start": "string",
- "end": "string"
}, - "status": "draft",
- "generated_at": "2019-08-24T14:15:22Z",
- "submitted_at": "2019-08-24T14:15:22Z",
- "report": {
- "period": {
- "start": "string",
- "end": "string"
}, - "currency": "EUR",
- "company": {
- "name": "string",
- "business_id": "string"
}, - "sections": [
- {
- "type": "taxes_payable",
- "label": "string",
- "rate_groups": [
- {
- "vat_rate": "string",
- "total_debit": "string",
- "total_credit": "string",
- "tax_amount": "string",
- "vat_classes": [
- {
- "vat_class_code": "string",
- "total_debit": "string",
- "total_credit": "string",
- "tax_amount": "string",
- "net_base": "string",
- "calculated_vat_difference": "string",
- "accounts": [
- {
- "account_code": null,
- "account_name": null,
- "debit": null,
- "credit": null
}
], - "base_accounts": [
- {
- "account_code": null,
- "account_name": null,
- "debit": null,
- "credit": null
}
]
}
], - "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "net_bases": [
- {
- "vat_class_code": "string",
- "vat_rate": "string",
- "net_base": "string",
- "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "total": "string"
}, - {
- "type": "taxes_payable",
- "label": "string",
- "rate_groups": [
- {
- "vat_rate": "string",
- "total_debit": "string",
- "total_credit": "string",
- "tax_amount": "string",
- "vat_classes": [
- {
- "vat_class_code": "string",
- "total_debit": "string",
- "total_credit": "string",
- "tax_amount": "string",
- "net_base": "string",
- "calculated_vat_difference": "string",
- "accounts": [
- {
- "account_code": null,
- "account_name": null,
- "debit": null,
- "credit": null
}
], - "base_accounts": [
- {
- "account_code": null,
- "account_name": null,
- "debit": null,
- "credit": null
}
]
}
], - "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "net_bases": [
- {
- "vat_class_code": "string",
- "vat_rate": "string",
- "net_base": "string",
- "accounts": [
- {
- "account_code": "string",
- "account_name": "string",
- "debit": "string",
- "credit": "string"
}
]
}
], - "total": "string"
}
], - "taxes_payable_total": "string",
- "deductible_taxes_total": "string",
- "tax_payable": "string",
- "vat_payable_account_balance": "string",
- "vat_receivable_account_balance": "string",
- "reconciliation": {
- "vat_payable": {
- "section_total": "string",
- "account_balance": "string",
- "difference": "string"
}, - "vat_receivable": {
- "section_total": "string",
- "account_balance": "string",
- "difference": "string"
}, - "unplaceable_lines": [
- {
- "voucher_number": "string",
- "document_type": "string",
- "posting_date": "string",
- "account_code": "string",
- "amount": "string",
- "reason": "missing_vat_class"
}
]
}
}
}Sales invoice management operations including searching, listing, creating, approval, and posting
Retrieve sales invoices for a company with optional filtering
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| status | Array of strings (SalesInvoiceItems) unique Items Enum: "draft" "approved" "rejected" "voided" Example: status=draft&status=approved Filter by one or more document statuses using repeated query parameters |
| kind | string (SalesInvoiceKind) Enum: "invoice" "credit_note" Example: kind=invoice Filter by invoice kind (invoice or credit_note) |
| party_id | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Example: party_id=123e4567-e89b-12d3-a456-426614174000 Filter by recipient party ID |
| cursor | string Pagination cursor from previous response |
| limit | integer [ 1 .. 100 ] Example: limit=10 Maximum number of results to return (1-100, default: 10) |
| invoice_date_from | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: invoice_date_from=2026-01-01 Filter by invoice date, inclusive lower bound (ISO date). Must be <= invoice_date_to when both are provided; an inverted range returns 400. |
| invoice_date_to | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: invoice_date_to=2026-01-31 Filter by invoice date, inclusive upper bound (ISO date). Must be >= invoice_date_from when both are provided; an inverted range returns 400. |
| due_date_from | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: due_date_from=2026-02-01 Filter by due date, inclusive lower bound (ISO date). Must be <= due_date_to when both are provided; an inverted range returns 400. |
| due_date_to | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: due_date_to=2026-02-28 Filter by due date, inclusive upper bound (ISO date). Must be >= due_date_from when both are provided; an inverted range returns 400. |
| overdue_as_of | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: overdue_as_of=2026-07-13 Return only overdue rows as of this calendar date: due date strictly before the given day AND payment status not |
| party_business_id | string [ 1 .. 64 ] characters Example: party_business_id=1234567-8 Case-insensitive prefix match on the recipient's business ID: the value must match from the start of the ID, so |
| amount_min | string^-?[0-9]+(\.[0-9]{1,8})?$ Example: amount_min=100.00 Filter by minimum gross amount (inclusive, plain decimal string). Must be <= amount_max when both are provided; an inverted range returns 400. |
| amount_max | string^-?[0-9]+(\.[0-9]{1,8})?$ Example: amount_max=5000.00 Filter by maximum gross amount (inclusive, plain decimal string). Must be >= amount_min when both are provided; an inverted range returns 400. |
| payment_status | Array of strings (InvoicePaymentStatus) unique Items Enum: "paid" "partially_paid" "unpaid" Example: payment_status=unpaid&payment_status=partially_paid Filter by one or more payment statuses using repeated query parameters |
| q | string [ 1 .. 255 ] characters Example: q=acme Case-insensitive free-text search; the match type fits the field: recipient name and description match as a substring, the recipient business ID matches as a prefix, and invoice number, |
| sort_by | string (InvoiceSortBy) Enum: "date" "created_at" "amount" "counterparty" Example: sort_by=date Sort order: |
{- "example_query": "/companies/{companyId}/sales-invoices?status=approved&limit=10",
- "data": [
- {
- "id": "652a1ef7-e89b-415b-9dca-a5ff15fd7eae",
- "kind": "invoice",
- "invoice_number": "INV-2026-0042",
- "description": "Consulting services",
- "invoice_date": "2026-01-15",
- "due_date": "2026-02-14",
- "currency": "EUR",
- "gross_amount": "124",
- "vat_amount": "24",
- "unsettled_amount": "124",
- "recipient": {
- "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
- "name": "Customer Company",
- "registration_country_code": "FI",
- "business_id": "1234567-8",
- "number": 42
}, - "status": "approved",
- "payment_status": "unpaid",
- "sending_status": "sent",
- "rejection_code": null,
- "rejection_reason": null
}
], - "meta": {
- "pagination": {
- "limit": 10,
- "has_more": true,
- "next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAyNi0wMi0yN1QxMDozMDo0NS4xMjNaIiwiZG9jdW1lbnRfaWQiOiI2NTJhMWVmNy1lODliLTQxNWItOWRjYS1hNWZmMTVmZDdlYWUifQ"
}
}
}Create a new sales invoice
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Sales invoice creation data
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
object or null | |
string or null | |
object or null | |
object or null | |
Array of objects or null | |
| files | Array of strings <uuid> [ items <uuid >^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... ] Optional array of file IDs to attach (replaces all existing files when provided; pass an empty array to clear all files) |
Array of strings or null | |
"invoice" (string) or null | |
| credit_reason | null |
| credited_sales_invoice_id | null |
{- "description": "string",
- "invoice_date": "2019-08-24",
- "due_date": "2019-08-24",
- "interest_rate": "string",
- "our_reference": "string",
- "your_reference": "string",
- "bank_account_id": "9335a679-63ab-44d5-9de9-e01e0c5a1fff",
- "currency": "EUR",
- "locale": "fi-FI",
- "invoicing_channel": "einvoice",
- "recipient": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "registration_country_code": "string",
- "business_id": "string"
}, - "recipient_invoicing_email": "string",
- "recipient_invoicing_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "recipient_einvoice": {
- "address": "string",
- "operator": "string"
}, - "lines": [
- {
- "product_id": "0d012afa-f885-4e65-aeca-37e27701e2d1",
- "title": "string",
- "description": "string",
- "quantity": "string",
- "unit_name": "string",
- "unit_price": "string",
- "discount_percentage": "string",
- "type": "services",
- "vat_rate": "string",
- "delivery_start_date": "2019-08-24",
- "delivery_end_date": "2019-08-24",
- "vat_class_code": "string"
}
], - "files": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "tags": [
- "string"
], - "kind": "credit_note",
- "credit_reason": "string",
- "credited_sales_invoice_id": "8fdec0e4-3a29-4ed0-b4d6-d6af3836d63e"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "document_date": "2019-08-24",
- "invoice_date": "2019-08-24",
- "due_date": "2019-08-24",
- "description": "string",
- "internal_notes": "string",
- "invoice_number": "string",
- "currency": "string",
- "invoicing_channel": "einvoice",
- "bank_account_id": "9335a679-63ab-44d5-9de9-e01e0c5a1fff",
- "our_reference": "string",
- "your_reference": "string",
- "sender_name": "string",
- "sender_domicile": "string",
- "sender_vat_number": "string",
- "sender_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "recipient": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "registration_country_code": "string",
- "business_id": "string",
- "number": 0
}, - "recipient_invoicing_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "recipient_invoicing_email": "string",
- "recipient_einvoice": {
- "address": "string",
- "operator": "string"
}, - "recipient_vat_number": "string",
- "bank_reference": "string",
- "gross_amount": "string",
- "vat_amount": "string",
- "interest_rate": "string",
- "locale": "string",
- "lines": [
- {
- "product_id": "0d012afa-f885-4e65-aeca-37e27701e2d1",
- "title": "string",
- "description": "string",
- "quantity": "string",
- "unit_price": "string",
- "unit_name": "string",
- "discount_percentage": "string",
- "type": "services",
- "vat_rate": "string",
- "vat_handling": "standard",
- "vat_amount": "string",
- "gross_amount": "string",
- "delivery_start_date": "2019-08-24",
- "delivery_end_date": "2019-08-24",
- "vat_class_code": "string"
}
], - "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "tags": [
- "string"
], - "status": "draft",
- "payment_status": "paid",
- "sending_status": "not_sent",
- "rejection_code": "string",
- "rejection_reason": "string",
- "kind": "invoice",
- "credited_sales_invoice_id": "8fdec0e4-3a29-4ed0-b4d6-d6af3836d63e",
- "credit_reason": "string",
- "unsettled_amount": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Retrieve sales invoice details
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| salesInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Sales invoice ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "document_date": "2019-08-24",
- "invoice_date": "2019-08-24",
- "due_date": "2019-08-24",
- "description": "string",
- "internal_notes": "string",
- "invoice_number": "string",
- "currency": "string",
- "invoicing_channel": "einvoice",
- "bank_account_id": "9335a679-63ab-44d5-9de9-e01e0c5a1fff",
- "our_reference": "string",
- "your_reference": "string",
- "sender_name": "string",
- "sender_domicile": "string",
- "sender_vat_number": "string",
- "sender_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "recipient": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "registration_country_code": "string",
- "business_id": "string",
- "number": 0
}, - "recipient_invoicing_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "recipient_invoicing_email": "string",
- "recipient_einvoice": {
- "address": "string",
- "operator": "string"
}, - "recipient_vat_number": "string",
- "bank_reference": "string",
- "gross_amount": "string",
- "vat_amount": "string",
- "interest_rate": "string",
- "locale": "string",
- "lines": [
- {
- "product_id": "0d012afa-f885-4e65-aeca-37e27701e2d1",
- "title": "string",
- "description": "string",
- "quantity": "string",
- "unit_price": "string",
- "unit_name": "string",
- "discount_percentage": "string",
- "type": "services",
- "vat_rate": "string",
- "vat_handling": "standard",
- "vat_amount": "string",
- "gross_amount": "string",
- "delivery_start_date": "2019-08-24",
- "delivery_end_date": "2019-08-24",
- "vat_class_code": "string"
}
], - "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "tags": [
- "string"
], - "status": "draft",
- "payment_status": "paid",
- "sending_status": "not_sent",
- "rejection_code": "string",
- "rejection_reason": "string",
- "kind": "invoice",
- "credited_sales_invoice_id": "8fdec0e4-3a29-4ed0-b4d6-d6af3836d63e",
- "credit_reason": "string",
- "unsettled_amount": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Update sales invoice details
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| salesInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Sales invoice ID |
Sales invoice update data
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null | |
string or null Reason for creating the credit note. Only valid for draft credit_note invoices; regular invoices return 400 if this field is provided. | |
string or null | |
object or null | |
string or null | |
object or null | |
object or null | |
Array of objects or null | |
| files | Array of strings <uuid> [ items <uuid >^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... ] Optional array of file IDs to attach (replaces all existing files when provided; pass an empty array to clear all files) |
Array of strings or null |
{- "description": "string",
- "internal_notes": "string",
- "invoice_date": "2019-08-24",
- "due_date": "2019-08-24",
- "interest_rate": "string",
- "our_reference": "string",
- "your_reference": "string",
- "bank_account_id": "9335a679-63ab-44d5-9de9-e01e0c5a1fff",
- "currency": "EUR",
- "locale": "fi-FI",
- "credit_reason": "string",
- "invoicing_channel": "einvoice",
- "recipient": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "registration_country_code": "string",
- "business_id": "string"
}, - "recipient_invoicing_email": "string",
- "recipient_invoicing_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "recipient_einvoice": {
- "address": "string",
- "operator": "string"
}, - "lines": [
- {
- "product_id": "0d012afa-f885-4e65-aeca-37e27701e2d1",
- "title": "string",
- "description": "string",
- "quantity": "string",
- "unit_name": "string",
- "unit_price": "string",
- "discount_percentage": "string",
- "type": "services",
- "vat_rate": "string",
- "delivery_start_date": "2019-08-24",
- "delivery_end_date": "2019-08-24",
- "vat_class_code": "string"
}
], - "files": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "tags": [
- "string"
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "document_date": "2019-08-24",
- "invoice_date": "2019-08-24",
- "due_date": "2019-08-24",
- "description": "string",
- "internal_notes": "string",
- "invoice_number": "string",
- "currency": "string",
- "invoicing_channel": "einvoice",
- "bank_account_id": "9335a679-63ab-44d5-9de9-e01e0c5a1fff",
- "our_reference": "string",
- "your_reference": "string",
- "sender_name": "string",
- "sender_domicile": "string",
- "sender_vat_number": "string",
- "sender_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "recipient": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "registration_country_code": "string",
- "business_id": "string",
- "number": 0
}, - "recipient_invoicing_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "recipient_invoicing_email": "string",
- "recipient_einvoice": {
- "address": "string",
- "operator": "string"
}, - "recipient_vat_number": "string",
- "bank_reference": "string",
- "gross_amount": "string",
- "vat_amount": "string",
- "interest_rate": "string",
- "locale": "string",
- "lines": [
- {
- "product_id": "0d012afa-f885-4e65-aeca-37e27701e2d1",
- "title": "string",
- "description": "string",
- "quantity": "string",
- "unit_price": "string",
- "unit_name": "string",
- "discount_percentage": "string",
- "type": "services",
- "vat_rate": "string",
- "vat_handling": "standard",
- "vat_amount": "string",
- "gross_amount": "string",
- "delivery_start_date": "2019-08-24",
- "delivery_end_date": "2019-08-24",
- "vat_class_code": "string"
}
], - "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "tags": [
- "string"
], - "status": "draft",
- "payment_status": "paid",
- "sending_status": "not_sent",
- "rejection_code": "string",
- "rejection_reason": "string",
- "kind": "invoice",
- "credited_sales_invoice_id": "8fdec0e4-3a29-4ed0-b4d6-d6af3836d63e",
- "credit_reason": "string",
- "unsettled_amount": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Delete a sales invoice
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| salesInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Sales invoice ID |
{- "error": "Forbidden",
- "code": "FORBIDDEN",
- "debug": "User does not have permission to perform this action",
- "timestamp": "2024-01-15T10:30:00Z"
}Approve a sales invoice. If any line items have null product_id, products will be automatically created from the line item data (title, description, unit price, VAT rate, etc.) during approval. All approved line items will have a product_id set.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| salesInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Sales invoice ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "document_date": "2019-08-24",
- "invoice_date": "2019-08-24",
- "due_date": "2019-08-24",
- "description": "string",
- "internal_notes": "string",
- "invoice_number": "string",
- "currency": "string",
- "invoicing_channel": "einvoice",
- "bank_account_id": "9335a679-63ab-44d5-9de9-e01e0c5a1fff",
- "our_reference": "string",
- "your_reference": "string",
- "sender_name": "string",
- "sender_domicile": "string",
- "sender_vat_number": "string",
- "sender_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "recipient": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "registration_country_code": "string",
- "business_id": "string",
- "number": 0
}, - "recipient_invoicing_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "recipient_invoicing_email": "string",
- "recipient_einvoice": {
- "address": "string",
- "operator": "string"
}, - "recipient_vat_number": "string",
- "bank_reference": "string",
- "gross_amount": "string",
- "vat_amount": "string",
- "interest_rate": "string",
- "locale": "string",
- "lines": [
- {
- "product_id": "0d012afa-f885-4e65-aeca-37e27701e2d1",
- "title": "string",
- "description": "string",
- "quantity": "string",
- "unit_price": "string",
- "unit_name": "string",
- "discount_percentage": "string",
- "type": "services",
- "vat_rate": "string",
- "vat_handling": "standard",
- "vat_amount": "string",
- "gross_amount": "string",
- "delivery_start_date": "2019-08-24",
- "delivery_end_date": "2019-08-24",
- "vat_class_code": "string"
}
], - "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "tags": [
- "string"
], - "status": "draft",
- "payment_status": "paid",
- "sending_status": "not_sent",
- "rejection_code": "string",
- "rejection_reason": "string",
- "kind": "invoice",
- "credited_sales_invoice_id": "8fdec0e4-3a29-4ed0-b4d6-d6af3836d63e",
- "credit_reason": "string",
- "unsettled_amount": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Send a sales invoice via the configured invoicing channel
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| salesInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Sales invoice ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "document_date": "2019-08-24",
- "invoice_date": "2019-08-24",
- "due_date": "2019-08-24",
- "description": "string",
- "internal_notes": "string",
- "invoice_number": "string",
- "currency": "string",
- "invoicing_channel": "einvoice",
- "bank_account_id": "9335a679-63ab-44d5-9de9-e01e0c5a1fff",
- "our_reference": "string",
- "your_reference": "string",
- "sender_name": "string",
- "sender_domicile": "string",
- "sender_vat_number": "string",
- "sender_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "recipient": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "registration_country_code": "string",
- "business_id": "string",
- "number": 0
}, - "recipient_invoicing_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "recipient_invoicing_email": "string",
- "recipient_einvoice": {
- "address": "string",
- "operator": "string"
}, - "recipient_vat_number": "string",
- "bank_reference": "string",
- "gross_amount": "string",
- "vat_amount": "string",
- "interest_rate": "string",
- "locale": "string",
- "lines": [
- {
- "product_id": "0d012afa-f885-4e65-aeca-37e27701e2d1",
- "title": "string",
- "description": "string",
- "quantity": "string",
- "unit_price": "string",
- "unit_name": "string",
- "discount_percentage": "string",
- "type": "services",
- "vat_rate": "string",
- "vat_handling": "standard",
- "vat_amount": "string",
- "gross_amount": "string",
- "delivery_start_date": "2019-08-24",
- "delivery_end_date": "2019-08-24",
- "vat_class_code": "string"
}
], - "files": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "type": "document",
- "mime_type": "string",
- "status": "upload_pending",
- "original_filename": "string"
}
], - "tags": [
- "string"
], - "status": "draft",
- "payment_status": "paid",
- "sending_status": "not_sent",
- "rejection_code": "string",
- "rejection_reason": "string",
- "kind": "invoice",
- "credited_sales_invoice_id": "8fdec0e4-3a29-4ed0-b4d6-d6af3836d63e",
- "credit_reason": "string",
- "unsettled_amount": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Post-approval recovery for an approved sales invoice with no GL voucher: optionally set or correct line vat_class_code values (audited with from/to), then synchronously attempt rule-based voucher generation. Corrections and generation run in one transaction — precondition failures (no effective posting rule, non-EUR currency, closed or missing fiscal period) return 400 with nothing applied. Corrections on an already-vouchered invoice are applied and reported as already_exists (the voucher is never regenerated); a request that changes nothing on an already-vouchered invoice returns 409. An empty request retries generation without changing lines.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| salesInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Sales invoice ID |
Line classification corrections to apply before generating (may be empty)
Array of objects Line classification corrections to apply before generating. Omit (or send empty) to retry generation without changing any line — the recovery path after posting rules were seeded. |
{- "line_classifications": [
- {
- "line_id": "string",
- "vat_class_code": "string"
}
]
}{- "corrected_line_ids": [
- "string"
], - "voucher_generation": {
- "status": "created",
- "voucher_id": "1b5a607b-e5eb-4b17-80b0-5739c041e81b"
}
}Get pre-filled data for creating a credit note from an existing sales invoice
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| salesInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Original sales invoice ID |
{- "description": "string",
- "invoice_date": "2019-08-24",
- "due_date": "2019-08-24",
- "currency": "string",
- "invoicing_channel": "einvoice",
- "bank_account_id": "9335a679-63ab-44d5-9de9-e01e0c5a1fff",
- "our_reference": "string",
- "your_reference": "string",
- "interest_rate": "string",
- "locale": "string",
- "recipient": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "registration_country_code": "string",
- "business_id": "string"
}, - "recipient_invoicing_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "recipient_invoicing_email": "string",
- "recipient_einvoice": {
- "address": "string",
- "operator": "string"
}, - "lines": [
- {
- "product_id": "0d012afa-f885-4e65-aeca-37e27701e2d1",
- "title": "string",
- "description": "string",
- "quantity": "string",
- "unit_price": "string",
- "unit_name": "string",
- "discount_percentage": "string",
- "type": "services",
- "vat_rate": "string",
- "delivery_start_date": "2019-08-24",
- "delivery_end_date": "2019-08-24",
- "vat_class_code": "string"
}
], - "tags": [
- "string"
], - "kind": "credit_note",
- "credited_sales_invoice_id": "8fdec0e4-3a29-4ed0-b4d6-d6af3836d63e",
- "credit_reason": "string"
}Get pre-filled data for creating a copy of an existing sales invoice
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| salesInvoiceId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Sales invoice ID to copy from |
{- "description": "string",
- "invoice_date": "2019-08-24",
- "due_date": "2019-08-24",
- "currency": "string",
- "invoicing_channel": "einvoice",
- "bank_account_id": "9335a679-63ab-44d5-9de9-e01e0c5a1fff",
- "our_reference": "string",
- "your_reference": "string",
- "interest_rate": "string",
- "locale": "string",
- "recipient": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "registration_country_code": "string",
- "business_id": "string"
}, - "recipient_invoicing_address": {
- "street": [
- "string"
], - "city": "string",
- "postal_code": "string",
- "region": "string",
- "country_code": "string"
}, - "recipient_invoicing_email": "string",
- "recipient_einvoice": {
- "address": "string",
- "operator": "string"
}, - "lines": [
- {
- "product_id": "0d012afa-f885-4e65-aeca-37e27701e2d1",
- "title": "string",
- "description": "string",
- "quantity": "string",
- "unit_price": "string",
- "unit_name": "string",
- "discount_percentage": "string",
- "type": "services",
- "vat_rate": "string",
- "delivery_start_date": "2019-08-24",
- "delivery_end_date": "2019-08-24",
- "vat_class_code": "string"
}
], - "tags": [
- "string"
], - "kind": "invoice",
- "credited_sales_invoice_id": null,
- "credit_reason": null
}Resolve settings with optional company or party context. Settings are resolved in order: party scope > company scope > global scope.
| company_id | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID for company-specific settings |
| party_id | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Party ID for party-specific settings (will resolve company_id if not provided) |
| namespace | string Example: namespace=sales_invoice,purchase_invoice Comma-separated list of namespaces to include |
{- "property1": null,
- "property2": null
}Retrieve tags for a company with optional search and pagination
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| query | string Example: query=important Search query (searches in tag names) |
| cursor | string Example: cursor=eyJuYW1lIjoic29tZS10YWciLCJpZCI6IjEyMzQ1In0 Pagination cursor from previous response |
| limit | integer [ 1 .. 100 ] Example: limit=100 Maximum number of results to return (default: 100) |
{- "data": [
- "string"
], - "meta": {
- "pagination": {
- "limit": 1,
- "has_more": true,
- "next_cursor": "string"
}
}
}List settlements for a company with cursor-based pagination. Each entry returns both settled documents (id, type, full amount), the settled amount, currency, match rule, status (active or rejected), and creation time. Supports filtering by status, settlement creation-date range (UTC, inclusive), and a document id (settlements where the document is on either side). Without a status filter, both active and rejected settlements are returned.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| cursor | string Pagination cursor from a previous response |
| limit | integer [ 1 .. 100 ] Example: limit=50 Maximum number of records to return (1-100, default: 50) |
| status | string (SettlementStatus) Enum: "active" "rejected" Filter by settlement status (active or rejected) |
| from_date | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Only settlements created on or after this date (UTC, inclusive, YYYY-MM-DD) |
| to_date | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Only settlements created on or before this date (UTC, inclusive, YYYY-MM-DD) |
| document_id | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Only settlements where this document is on either side |
{- "data": [
- {
- "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
- "document_a": {
- "id": "b1d3f8a2-1c4e-4f6a-9b2d-3e5a7c9d1f00",
- "type": "bank_transaction",
- "amount": "100.00"
}, - "document_b": {
- "id": "c2e4f9b3-2d5f-4a7b-8c3e-4f6b8d0e2a11",
- "type": "sales_invoice",
- "amount": "100.00"
}, - "amount": "60.00",
- "currency": "EUR",
- "rule_code": "MANUAL",
- "status": "active",
- "created_at": "2026-06-20T09:30:00.000Z"
}
], - "meta": {
- "pagination": {
- "limit": 50,
- "has_more": false
}
}
}Create a settlement between any two document types (memo, purchase_invoice, sales_invoice, expense_claim, bank_transaction). This records that a specific amount has been settled between the two documents, updating the relevant unsettled_amount fields. Supports type-aware matching: incoming documents match incoming, outgoing match outgoing, and same-type documents require opposite signs (e.g., invoice and credit note). Memos without amount cannot be reconciled.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Settlement creation data
| document_a_id required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... First document ID (memo, purchase_invoice, sales_invoice, expense_claim, or bank_transaction) |
| document_b_id required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Second document ID (memo, purchase_invoice, sales_invoice, expense_claim, or bank_transaction) |
| amount required | string^([1-9][0-9]*(\.[0-9]{1,8})?|0\.([1-9][0-9]{0... Settlement amount (positive decimal string, must be > 0) |
{- "document_a_id": "f5f1b8a4-b413-4922-a4b9-1097ae15b1b0",
- "document_b_id": "5755b0e6-dd6a-43e3-ae3e-2e974a49f8ff",
- "amount": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "document_a_id": "f5f1b8a4-b413-4922-a4b9-1097ae15b1b0",
- "document_b_id": "5755b0e6-dd6a-43e3-ae3e-2e974a49f8ff",
- "amount": "string",
- "updated_unsettled_amount_a": "string",
- "updated_unsettled_amount_b": "string"
}Soft-delete (reject) a settlement. If the settlement has a linked voucher and the voucher is in a locked or closed fiscal period, returns 409 Conflict. Otherwise marks the settlement as rejected and, if present, voids the voucher. Document unsettled amounts are recalculated. See TECH-569.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| settlementId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Settlement ID |
{- "error": "Invalid input",
- "code": "VALIDATION_ERROR",
- "debug": "Validation failed for field 'invoice_date'",
- "timestamp": "2024-01-15T10:30:00Z"
}Retrieve payment profile details for the current user
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
{- "iban": "string",
- "iban_updated_at": "2019-08-24T14:15:22Z"
}Update the IBAN payment profile for the current user
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Payment profile update data
| iban required | string IBAN (ISO country code + 16 digits) |
{- "iban": "string"
}{- "iban": "string",
- "iban_updated_at": "2019-08-24T14:15:22Z"
}Creates an invitation for a new member to join a company. An invitation email will be sent to the provided address. Returns 400 if the role is not a known company-scoped role, 403 if the caller may not assign the requested role (a caller lacking payments.write cannot assign a role that grants it), and 409 if a pending invitation already exists for the same email and company.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Invitation data
| email required | string <email> ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z... Email address to invite |
| role required | string non-empty Role to assign (name of a company-scoped role defined in the system) |
| first_name | string <= 255 characters First name of the invitee |
| last_name | string <= 255 characters Last name of the invitee |
| phone | string <= 50 characters Phone number of the invitee |
{- "email": "user@example.com",
- "role": "string",
- "first_name": "string",
- "last_name": "string",
- "phone": "string"
}{- "status": "pending",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "email": "user@example.com",
- "first_name": "string",
- "last_name": "string",
- "phone": "string",
- "role": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z"
}Canonical endpoint for company membership data. Returns active members, pending invitations, and expired invitations in a single paginated list. Use status=active for filtered selection (e.g. approver picker). Omit status for the full member-management view. Expired invitations are included so admins can resend or cancel them. Cancelled and undeliverable invitations are always excluded.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| limit | integer [ 1 .. 100 ] Example: limit=50 Maximum number of results to return (1-100, default: 50) |
| status | Array of strings (CompanyMemberItems) unique Items Enum: "active" "pending" "expired" Example: status=active&status=pending Filter by one or more member statuses using repeated query parameters |
| cursor | string Pagination cursor from previous response |
| q | string [ 1 .. 255 ] characters Example: q=alice Case-insensitive free-text search across member email, first name, and last name. SQL LIKE metacharacters ( |
{- "data": [
- {
- "status": "active",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "email": "user@example.com",
- "first_name": "string",
- "last_name": "string",
- "phone": "string",
- "role": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "pagination": {
- "limit": 1,
- "has_more": true,
- "next_cursor": "string"
}
}
}Returns a single company member by member ID. Used by the Members page detail panel when deep-linking to a specific member that may not be on the first page of the paginated list. Cancelled, undeliverable, and accepted invitations are treated as not found.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| memberId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Member ID |
{- "status": "expired",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "email": "user@example.com",
- "first_name": "string",
- "last_name": "string",
- "phone": "string",
- "role": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z"
}Removes a member from a company. For pending or expired members, their invitation is cancelled. For active members, their company membership is deleted. Returns 409 when an invitation is not in a cancellable state, when a company-local caller tries to remove themselves, or when removing the target would remove the company's last administrator (a provider role such as accountant does not count as the company's own admin). Callers acting via a platform role (superadmins) bypass both the self-removal and last-administrator guards, since they can re-grant access from outside the company.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| memberId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Member ID |
{- "error": "Forbidden",
- "code": "FORBIDDEN",
- "debug": "User does not have permission to perform this action",
- "timestamp": "2024-01-15T10:30:00Z"
}Refreshes a pending or expired invitation in place: clears the existing token slot, refreshes the expiry to 7 days from now, sets status back to pending, resets the auto-reminder lifecycle so reminders restart from this point, and re-triggers the invitation email. Returns 409 when the invitation is in a terminal state (accepted, cancelled, undeliverable) — diverges from getMember which returns 404 for those statuses, because resend treats the row as an existing-state-conflict rather than a not-found. Returns 409 also when a pending invitation already exists for the same email and company. Returns 404 when the invitation does not exist or does not belong to the specified company.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| memberId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Invitation ID |
{- "status": "pending",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "email": "user@example.com",
- "first_name": "string",
- "last_name": "string",
- "phone": "string",
- "role": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z"
}Changes the role of an active company member. Pending and expired invitations are not supported by this endpoint — those must be cancelled and re-invited with the desired role. Returns 200 with the updated member (idempotent when the role is unchanged). A caller may target their own membership. Returns 403 when the caller may not assign the target role (a caller lacking payments.write cannot assign a role that grants it). Returns 409 when the target is a pending or expired invitation, or when a company-local caller would remove the company's last administrator (a provider role such as accountant does not count as the company's own admin). Callers acting via a platform role (superadmins) bypass the last-administrator guard, since they can re-grant access at any time. Returns 422 when the target role is not a company-scoped role.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| memberId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Member ID |
New role assignment
| roleId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... UUID of the role to assign (must be a company-scoped role) |
{- "roleId": "7382d58e-652a-4905-b7c9-bcca1e0e5391"
}{- "status": "active",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "email": "user@example.com",
- "first_name": "string",
- "last_name": "string",
- "phone": "string",
- "role": "string",
- "created_at": "2019-08-24T14:15:22Z"
}Returns the company-scoped roles the caller may assign when inviting or re-roling members. Platform-scoped roles (e.g. superadmin) are never included.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string"
}
]
}Retrieve all active VAT classes (ALV-tunnisteet) from Netvisor standards. These are predefined codes used in Finnish accounting systems for VAT reporting and compliance. Names and descriptions are returned in the effective locale — see the locale query parameter for the full fallback and null semantics.
| locale | string^[A-Za-z]{2,3}(?:[-_][A-Za-z0-9]{2,8}){0,5}$ Example: locale=en BCP 47 locale code (e.g. "fi-FI", "en"). Only the language portion is used. Falls back to "fi" when omitted. If the requested/effective locale has no translation for a given row, its localized fields are returned as null — there is no per-field fallback to another locale. |
{- "data": [
- {
- "code": "KOMY",
- "name": "Domestic sales",
- "description": "Domestic sales",
- "is_active": true,
- "created_at": "2025-12-12T00:00:00Z",
- "updated_at": "2025-12-12T00:00:00Z"
}, - {
- "code": "EUOS",
- "name": "EU purchase",
- "description": "EU purchase",
- "is_active": true,
- "created_at": "2025-12-12T00:00:00Z",
- "updated_at": "2025-12-12T00:00:00Z"
}
]
}Retrieve VAT posting rules — the line shapes the backend uses to expand a (vatClassCode, documentType) tuple into voucher lines for a given posting date. Rules are system-wide, not company-scoped, and change rarely. When effective_at is omitted, all rules are returned (including past and future epochs) so the client can do its own time-based filtering. When effective_at is provided, only rules effective at that date are returned. A Cache-Control: private, max-age=3600 header is set so authenticated clients can cache the response for an hour.
| document_type | string (VatPostingRuleDocumentType) Enum: "purchase_invoice" "sales_invoice" "memo" Example: document_type=purchase_invoice Optional filter by document type the rule applies to. |
| effective_at | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: effective_at=2026-05-07 Optional ISO 8601 date (YYYY-MM-DD). When provided, only rules whose effective window covers this date are returned: |
{- "data": [
- {
- "id": "e4b2a1c0-1d2e-4f3a-9b8c-7a6d5e4f3a2b",
- "vat_class_code": "EUOS",
- "document_type": "purchase_invoice",
- "line_role": "expense",
- "gl_account_code": "4000",
- "amount_formula": "gross",
- "sign": 1,
- "sort_order": 10,
- "effective_from": "2024-09-01",
- "effective_until": null
}, - {
- "id": "f5c3b2d1-2e3f-4a4b-aa9d-8b7e6f5a4b3c",
- "vat_class_code": "EUOS",
- "document_type": "purchase_invoice",
- "line_role": "vat_receivable",
- "gl_account_code": "1763",
- "amount_formula": "reverse_vat",
- "sign": 1,
- "sort_order": 20,
- "effective_from": "2024-09-01",
- "effective_until": null
}, - {
- "id": "c1d2e3f4-5678-4abc-9def-0123456789ab",
- "vat_class_code": "EUOS",
- "document_type": "purchase_invoice",
- "line_role": "vat_payable",
- "gl_account_code": "2939",
- "amount_formula": "reverse_vat",
- "sign": -1,
- "sort_order": 30,
- "effective_from": "2024-09-01",
- "effective_until": null
}, - {
- "id": "d2e3f4a5-6789-4bcd-aef0-123456789abc",
- "vat_class_code": "EUOS",
- "document_type": "purchase_invoice",
- "line_role": "payable",
- "gl_account_code": "2871",
- "amount_formula": "gross",
- "sign": -1,
- "sort_order": 40,
- "effective_from": "2024-09-01",
- "effective_until": null
}
]
}Retrieve VAT rates for a given country, grouped into historical and current periods ordered newest-first. Returns an empty periods array for unknown country codes. Rate descriptions and period labels are returned in the effective locale — see the locale query parameter for the full fallback and null semantics.
| country required | string^[A-Za-z]{2}$ Example: country=FI ISO 3166-1 alpha-2 country code (e.g. "FI") |
| locale | string^[A-Za-z]{2,3}(?:[-_][A-Za-z0-9]{2,8}){0,5}$ Example: locale=en BCP 47 locale code (e.g. "fi-FI", "en"). Only the language portion is used. Falls back to "fi" when omitted. If the requested/effective locale has no translation for a given row, its localized fields are returned as null — there is no per-field fallback to another locale. |
{- "country": "FI",
- "periods": [
- {
- "valid_from": "2026-01-01",
- "valid_until": null,
- "label": "Finland 2026–present",
- "rates": [
- {
- "rate": "0.00",
- "description": "Veroton"
}, - {
- "rate": "10.00",
- "description": "Alennettu verokanta – sanoma- ja aikakauslehdet"
}, - {
- "rate": "13.50",
- "description": "Alennettu verokanta"
}, - {
- "rate": "25.50",
- "description": "Yleinen verokanta"
}, - {
- "rate": "100.00",
- "description": "Täysi vähennys"
}
]
}, - {
- "valid_from": "2024-09-01",
- "valid_until": "2024-12-31",
- "label": "Finland syys–joulukuu 2024",
- "rates": [
- {
- "rate": "0.00",
- "description": "Veroton"
}, - {
- "rate": "10.00",
- "description": "Alennettu verokanta"
}, - {
- "rate": "14.00",
- "description": "Alennettu verokanta – ruoka, ravintolat"
}, - {
- "rate": "25.50",
- "description": "Yleinen verokanta"
}, - {
- "rate": "100.00",
- "description": "Täysi vähennys"
}
]
}
]
}List vouchers for a company with cursor-based pagination. Filters by status, date range, document type, and voucher number. All vouchers include their lines.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| status | string (VoucherStatus) Enum: "valid" "voided" Example: status=valid Filter by voucher status |
| from_date | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: from_date=2024-01-01 Filter by posting date (from, inclusive) |
| to_date | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Example: to_date=2024-12-31 Filter by posting date (to, inclusive) |
| document_type | string (VoucherDocumentType) Enum: "sales_invoice" "purchase_invoice" "bank_transaction" "memo" "settlement" "year_end_close" Example: document_type=sales_invoice Filter by document type |
| document_id | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Example: document_id=12345678-1234-4234-8234-123456789abc Filter by source document ID (to find voucher for a specific document) |
| voucher_number | string non-empty Example: voucher_number=SI-1000 Filter by voucher number |
| limit | integer [ 1 .. 100 ] Example: limit=10 Maximum number of results to return (1-100) |
| cursor | string Pagination cursor from previous response |
| locale | string^[A-Za-z]{2,3}(?:[-_][A-Za-z0-9]{2,8}){0,5}$ Example: locale=en BCP 47 locale code (e.g. "fi-FI", "en") for |
{- "data": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "document_type": "sales_invoice",
- "currency": "EUR",
- "status": "valid",
- "posting_date": "2019-08-24",
- "lines": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "account_code": "string",
- "account_name": "string",
- "amount": "string",
- "memo": "string",
- "vat_rate": "string",
- "vat_class_code": "string"
}
], - "voucher_number": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "voided_by": "5ecfc985-14a9-4a71-a20e-8b1b8395f2ab",
- "voided_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "pagination": {
- "limit": 1,
- "has_more": true,
- "next_cursor": "string"
}
}
}Create a new GL voucher for a given document. Each voucher is tied to exactly one document (sales invoice, purchase invoice, bank transaction, memo, settlement). Vouchers are created as valid and are locked via fiscal period locking. Vouchers can be voided but cannot be deleted. Vouchers that are not locked, can be updated. A document can have only one voucher.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
Voucher creation data
| document_id required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Document ID - must exist and must not already have a voucher |
| posting_date | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Posting date (YYYY-MM-DD). Defaults to document document_date if not provided. Must be inside a non-locked fiscal period, or no fiscal period must exist for the date. |
| currency required | string Value: "EUR" Currency code |
required | Array of objects >= 2 items Voucher lines. Must have at least 2 lines. Lines must balance (sum of amounts = 0.00). |
{- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "posting_date": "2019-08-24",
- "currency": "EUR",
- "lines": [
- {
- "account_code": "string",
- "amount": "string",
- "memo": "string",
- "vat_rate": "string",
- "vat_class_code": "string"
}, - {
- "account_code": "string",
- "amount": "string",
- "memo": "string",
- "vat_rate": "string",
- "vat_class_code": "string"
}
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "document_type": "sales_invoice",
- "currency": "EUR",
- "status": "valid",
- "posting_date": "2019-08-24",
- "lines": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "account_code": "string",
- "account_name": "string",
- "amount": "string",
- "memo": "string",
- "vat_rate": "string",
- "vat_class_code": "string"
}
], - "voucher_number": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "voided_by": null,
- "voided_at": null
}Retrieve a specific GL voucher by ID with all its lines. Returns vouchers regardless of status (valid or voided).
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| voucherId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Voucher ID |
| locale | string^[A-Za-z]{2,3}(?:[-_][A-Za-z0-9]{2,8}){0,5}$ Example: locale=en BCP 47 locale code (e.g. "fi-FI", "en") for |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "document_type": "sales_invoice",
- "currency": "EUR",
- "status": "valid",
- "posting_date": "2019-08-24",
- "lines": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "account_code": "string",
- "account_name": "string",
- "amount": "string",
- "memo": "string",
- "vat_rate": "string",
- "vat_class_code": "string"
}
], - "voucher_number": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "voided_by": "5ecfc985-14a9-4a71-a20e-8b1b8395f2ab",
- "voided_at": "2019-08-24T14:15:22Z"
}Update an existing GL voucher. Vouchers can only be edited if they have status = "valid" and the voucher's posting_date falls within an unlocked fiscal period (fiscal period's lock_date is null or the voucher date is after the lock date). The endpoint updates both gl_voucher and gl_line tables in a single transaction, replacing all existing lines with the new lines. document_id cannot be changed.
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| voucherId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Voucher ID |
Voucher update data
| posting_date | string <date> ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[... Posting date (YYYY-MM-DD). If provided, must be inside an open/planned fiscal period and unlocked. |
required | Array of objects >= 2 items Voucher lines. Must have at least 2 lines. Lines must balance (sum of amounts = 0.00). All existing lines will be replaced. |
{- "posting_date": "2019-08-24",
- "lines": [
- {
- "account_code": "string",
- "amount": "string",
- "memo": "string",
- "vat_rate": "string",
- "vat_class_code": "string"
}, - {
- "account_code": "string",
- "amount": "string",
- "memo": "string",
- "vat_rate": "string",
- "vat_class_code": "string"
}
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "document_type": "sales_invoice",
- "currency": "EUR",
- "status": "valid",
- "posting_date": "2019-08-24",
- "lines": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "account_code": "string",
- "account_name": "string",
- "amount": "string",
- "memo": "string",
- "vat_rate": "string",
- "vat_class_code": "string"
}
], - "voucher_number": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "voided_by": null,
- "voided_at": null
}Void a GL voucher by transitioning it from "valid" to "voided". Voiding is a status flip: no reversing entry is posted, and the voucher with its lines is retained for the audit trail. Only vouchers with status "valid" can be voided; an already-voided voucher is rejected. Voiding is blocked when the voucher's posting_date falls within a locked or closed fiscal period, mirroring the update rules. A voided voucher is excluded from all reports and balances (the read layer filters status = "valid") but remains retrievable via get/list with status "voided".
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| voucherId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Voucher ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "document_type": "sales_invoice",
- "currency": "EUR",
- "status": "voided",
- "posting_date": "2019-08-24",
- "lines": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "account_code": "string",
- "account_name": "string",
- "amount": "string",
- "memo": "string",
- "vat_rate": "string",
- "vat_class_code": "string"
}
], - "voucher_number": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "voided_by": "5ecfc985-14a9-4a71-a20e-8b1b8395f2ab",
- "voided_at": "2019-08-24T14:15:22Z"
}Unvoid a GL voucher by transitioning it from "voided" back to "valid", the exact inverse of void. The void attribution fields (voided_by, voided_at) are cleared. Only vouchers with status "voided" can be unvoided; a voucher that is not voided is rejected. Unvoiding is blocked when the voucher's posting_date falls within a locked or closed fiscal period, mirroring the void and update rules. Once unvoided, the voucher re-enters all reports and balances (the read layer includes status = "valid").
| companyId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Company ID |
| voucherId required | string <uuid> ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA... Voucher ID |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "document_id": "b792e8ae-2cb4-4209-85b9-32be4c2fcdd6",
- "document_type": "sales_invoice",
- "currency": "EUR",
- "status": "valid",
- "posting_date": "2019-08-24",
- "lines": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "account_code": "string",
- "account_name": "string",
- "amount": "string",
- "memo": "string",
- "vat_rate": "string",
- "vat_class_code": "string"
}
], - "voucher_number": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "voided_by": null,
- "voided_at": null
}