# Numbero Public API - **OpenAPI Version:** `3.1.0` - **API Version:** `1.0.0` Integrate a Numbero company account with e-commerce platforms, warehouse systems, and other business applications. The API uses JSON over HTTPS. Company data endpoints require a company API key with the permission stated by the operation. Send the key as a Bearer token in the Authorization header. Public API requests do not require a CSRF token. Authenticated Public API access is available during an active trial period. After the trial ends, it requires an active subscription plan that includes Public API access, currently an Unlimited Plus plan. The unauthenticated status endpoint remains available independently of the company's subscription. Create and manage API keys in the Numbero company settings. The full key is displayed only once. A key can have a maximum lifetime of 365 days and can optionally be restricted to as many as 20 allowlist entries. Each entry may be an exact IPv4 or IPv6 address, such as 203.0.113.42 or 2001:db8::42, or a CIDR range, such as 203.0.113.0/24 or 2001:db8::/48. IPv4 prefix lengths must be between 0 and 32, and IPv6 prefix lengths between 0 and 128. Wildcards, host names, URLs, and addresses containing ports are not accepted. An empty IP allowlist permits requests from any address. Store API keys only on a server or in a secure secrets manager. Grant each integration only the permissions it requires. ## Servers - **URL:** `https://api.numbero.app/api/v1` - **Description:** Production ## Operations ### Check API status - **Method:** `GET` - **Path:** `/status` - **Tags:** Status Checks whether the Numbero Public API is reachable. This endpoint does not validate an API key or confirm access to company data. #### Responses ##### Status: 200 The API is available. ###### Content-Type: application/json - **`status` (required)** `string` **Example:** ```json { "status": "ok" } ``` ##### Status: 429 The request rate limit has been exceeded. Authenticated endpoints allow 120 requests per minute per API key, email delivery additionally allows 30 requests per minute per API key, authentication allows 300 attempts per minute per IP, and status allows 60 requests per minute per IP. ###### Content-Type: application/json - **`error` (required)** `string` - **`retry_after` (required)** `integer | string` — Seconds to wait before retrying. - **`status` (required)** `integer` **Example:** ```json { "status": 429, "error": "Too many requests.", "retry_after": 1 } ``` ### List bookkeeping records - **Method:** `GET` - **Path:** `/bookkeeping-records` - **Tags:** Bookkeeping records Returns a filtered, sorted, page-based list of documents belonging to the company associated with the API key. Templates and deleted documents are always excluded. When no sort parameters are supplied, results are ordered by most recent update. Requires an active trial or an active subscription plan with Public API access, currently Unlimited Plus. #### Parameters ##### `App-Locale` - **In:** `header` Preferred language for validation messages. Use a two-letter system locale supported by Numbero. If omitted or unsupported, Numbero uses the fallback locale. `string` ##### `page` - **In:** `query` Requested page number. `integer`, default: `1` ##### `per_page` - **In:** `query` Number of records per page. `integer`, default: `25` ##### `search` - **In:** `query` Searches document type, number, date, status, notes, line item names, and stored sender, recipient, payer, or carrier details. Record-number searches also ignore common separators. `[ "string", "null" ]` ##### `types[]` - **In:** `query` - **Style:** `form` - **Explode:** `true` Filter by one or more document types. Repeat the bracketed query key for every value. **Array of:** `string`, possible values: `"offer", "invoice", "waybill", "credit_note", "advance_invoice"` - Max items: `5` - Unique items: `true` ##### `statuses[]` - **In:** `query` - **Style:** `form` - **Explode:** `true` Filter by one or more document statuses. Repeat the bracketed query key for every value. **Array of:** `string`, possible values: `"draft", "sent", "partially_paid", "paid", "overdue", "overpaid", "unpaid", "canceled"` - Max items: `8` - Unique items: `true` ##### `date_from` - **In:** `query` Inclusive lower boundary for the document date. `string`, format: `date` ##### `date_to` - **In:** `query` Inclusive upper boundary for the document date. It cannot be earlier than date\_from. `string`, format: `date` ##### `label` - **In:** `query` Filter by an exact document label. `[ "string", "null" ]` ##### `sort_field` - **In:** `query` Field used to order the result. If only sort\_direction is supplied, the API sorts by date. `string`, possible values: `"date", "status", "recipient", "record_number", "total_with_vat"` ##### `sort_direction` - **In:** `query` Sort direction. `string`, possible values: `"asc", "desc"`, default: `"desc"` #### Responses ##### Status: 200 A page of bookkeeping records. ###### Content-Type: application/json - **`data` (required)** `array` **Items:** - **`created_at` (required)** `string | null`, format: `date-time` - **`currency_code` (required)** `string` - **`date` (required)** `string | null`, format: `date` - **`due_date` (required)** `string | null`, format: `date` - **`recipient` (required)** `object` - **`name` (required)** `string | null` - **`registration_number` (required)** `string | null` - **`record_number` (required)** `string | null` - **`status` (required)** `object` - **`total_with_vat` (required)** `number` - **`total_without_vat` (required)** `number` - **`type` (required)** `string`, possible values: `"offer", "invoice", "waybill", "credit_note", "advance_invoice"` - **`updated_at` (required)** `string | null`, format: `date-time` - **`uuid` (required)** `string`, format: `uuid` - **`links` (required)** `object` - **`first` (required)** `string`, format: `uri` - **`last` (required)** `string`, format: `uri` - **`next` (required)** `string | null`, format: `uri` - **`prev` (required)** `string | null`, format: `uri` - **`meta` (required)** `object` - **`current_page` (required)** `integer` - **`from` (required)** `integer | null` - **`last_page` (required)** `integer` - **`path` (required)** `string`, format: `uri` - **`per_page` (required)** `integer` - **`to` (required)** `integer | null` - **`total` (required)** `integer` **Example:** ```json { "data": [ { "uuid": "", "type": null, "status": null, "record_number": null, "date": null, "due_date": null, "currency_code": "EUR", "total_without_vat": 1, "total_with_vat": 1, "recipient": null, "created_at": null, "updated_at": null } ], "links": { "first": "", "last": "", "prev": null, "next": null }, "meta": { "current_page": 1, "from": null, "last_page": 1, "path": "", "per_page": 1, "to": null, "total": 0 } } ``` ##### Status: 401 The API key is missing, invalid, deleted, or otherwise cannot be resolved. ###### Content-Type: application/json - **`error` (required)** `object` - **`code` (required)** `string`, possible values: `"invalid_api_key", "api_access_suspended", "api_key_expired", "ip_address_not_allowed", "insufficient_permissions", "public_api_subscription_required", "feature_limit_exceeded", "document_not_found"` - **`message` (required)** `string` - **`feature`** `string`, possible values: `"documents", "sent_emails"` - **`limit`** `integer` - **`required_permission`** `string`, possible values: `"bookkeeping_records.list", "bookkeeping_records.create", "bookkeeping_records.send"` - **`usage`** `object` - **`current` (required)** `integer` - **`requested` (required)** `integer` **Example:** ```json { "error": { "code": "invalid_api_key", "message": "", "required_permission": "bookkeeping_records.list", "feature": "documents", "limit": 1, "usage": null } } ``` ##### Status: 402 The company has neither an active trial nor Public API access in its current plan, or another subscription feature limit has been reached. ###### Content-Type: application/json - **`error` (required)** `object` - **`code` (required)** `string`, possible values: `"invalid_api_key", "api_access_suspended", "api_key_expired", "ip_address_not_allowed", "insufficient_permissions", "public_api_subscription_required", "feature_limit_exceeded", "document_not_found"` - **`message` (required)** `string` - **`feature`** `string`, possible values: `"documents", "sent_emails"` - **`limit`** `integer` - **`required_permission`** `string`, possible values: `"bookkeeping_records.list", "bookkeeping_records.create", "bookkeeping_records.send"` - **`usage`** `object` - **`current` (required)** `integer` - **`requested` (required)** `integer` **Example:** ```json { "error": { "code": "invalid_api_key", "message": "", "required_permission": "bookkeeping_records.list", "feature": "documents", "limit": 1, "usage": null } } ``` ##### Status: 403 The key is suspended, expired, blocked by its IP allowlist, or lacks the required permission. ###### Content-Type: application/json - **`error` (required)** `object` - **`code` (required)** `string`, possible values: `"invalid_api_key", "api_access_suspended", "api_key_expired", "ip_address_not_allowed", "insufficient_permissions", "public_api_subscription_required", "feature_limit_exceeded", "document_not_found"` - **`message` (required)** `string` - **`feature`** `string`, possible values: `"documents", "sent_emails"` - **`limit`** `integer` - **`required_permission`** `string`, possible values: `"bookkeeping_records.list", "bookkeeping_records.create", "bookkeeping_records.send"` - **`usage`** `object` - **`current` (required)** `integer` - **`requested` (required)** `integer` **Example:** ```json { "error": { "code": "invalid_api_key", "message": "", "required_permission": "bookkeeping_records.list", "feature": "documents", "limit": 1, "usage": null } } ``` ##### Status: 422 One or more request values are invalid. Error keys identify the invalid request fields. Human-readable messages can be localized and must not be used as stable machine-readable identifiers. ###### Content-Type: application/json - **`errors` (required)** `object` - **`message` (required)** `string` **Example:** ```json { "message": "", "errors": { "additionalProperty": [ "" ] } } ``` ##### Status: 429 The request rate limit has been exceeded. Authenticated endpoints allow 120 requests per minute per API key, email delivery additionally allows 30 requests per minute per API key, authentication allows 300 attempts per minute per IP, and status allows 60 requests per minute per IP. ###### Content-Type: application/json - **`error` (required)** `string` - **`retry_after` (required)** `integer | string` — Seconds to wait before retrying. - **`status` (required)** `integer` **Example:** ```json { "status": 429, "error": "Too many requests.", "retry_after": 1 } ``` ### Create a bookkeeping record - **Method:** `POST` - **Path:** `/bookkeeping-records` - **Tags:** Bookkeeping records Creates a non-template income document for the company associated with the API key. Numbero assigns the document owner, number, draft status, sender snapshot, and calculated totals. Requires an active trial or an active subscription plan with Public API access, currently Unlimited Plus. Document creation counts against the company's document feature allowance. #### Parameters ##### `App-Locale` - **In:** `header` Preferred language for validation messages. Use a two-letter system locale supported by Numbero. If omitted or unsupported, Numbero uses the fallback locale. `string` #### Request Body ##### Content-Type: application/json - **`currency_code` (required)** `string` — A currency code supported by Numbero. Input is normalized to uppercase. - **`date` (required)** `string`, format: `date` — Document date in YYYY-MM-DD format. - **`items` (required)** `array` **Items:** - **`measurement` (required)** `string` - **`name` (required)** `string` - **`price` (required)** `number` - **`quantity` (required)** `number` - **`description`** `string | null` - **`discount`** `number | null`, default: `0` - **`sku`** `string | null` - **`vat_percent`** `number | null` — Required for VAT-registered companies and prohibited for non-VAT-registered companies. - **`vat_reference_uuid`** `string | null`, format: `uuid` — Must identify a VAT reference belonging to the API key's company and may be used only when vat\_percent is zero or null. - **`lang` (required)** `string` — A two-letter document language supported by Numbero. - **`recipient` (required)** `object` - **`country` (required)** `string` — A two-letter country code supported by Numbero. Input is normalized to lowercase. - **`is_legal` (required)** `boolean` - **`name` (required)** `string` - **`save_as_partner` (required)** `boolean` — When true, Numbero adds the recipient and supplied payment methods to the company's partner list. - **`address`** `string | null` - **`email`** `string | null`, format: `email` - **`internal_notes`** `string | null` — Allowed only when save\_as\_partner is true. - **`notes`** `string | null` - **`payment_methods`** `array` **Items:** - **`account_number` (required)** `string` - **`bank_name` (required)** `string` - **`swift_code` (required)** `string` - **`phone_number`** `string | null` - **`phone_prefix`** `string | null` — Derived from country when omitted. - **`registration_number`** `string | null` — Required for legal entities and validated for the selected country. - **`vat_registration_number`** `string | null` — When supplied, it is validated for the selected country. - **`tax_by_group` (required)** `boolean` — Whether VAT and totals are rounded by VAT-rate group. - **`type` (required)** `string`, possible values: `"offer", "invoice", "waybill", "credit_note", "advance_invoice"` - **`additional_price_rows`** `array` — Positive previously-paid rows deducted from the total. **Items:** - **`amount` (required)** `number` - **`description` (required)** `string` - **`carrier`** `object` — Allowed only for waybills. When supplied, is\_legal, country, and name are required. - **`country` (required)** `string` - **`is_legal` (required)** `boolean` - **`name` (required)** `string` - **`driver`** `string | null` - **`issuing_address`** `string | null` - **`receipt_address`** `string | null` - **`registration_number`** `string | null` — Required when the carrier is a legal entity. - **`vehicle_model`** `string | null` - **`vehicle_plate`** `string | null` - **`currency_rate`** `number | null` — Required when currency\_code differs from the company's base currency. Numbero uses 1 for the base currency. At most five decimal places. - **`deal_type`** `object` — Not allowed for offers. - **`deal_type_custom`** `string | null` — Required only when deal\_type is other; prohibited otherwise. - **`due_date`** `string | null`, format: `date` — Cannot be earlier than date. - **`label`** `string | null` - **`late_fee_percent`** `number | null` - **`notes`** `string | null` - **`payment_type`** `object` — Not allowed for offers. - **`payment_type_custom`** `string | null` — Required only when payment\_type is other; prohibited otherwise. - **`prepaid_amount`** `number | null` — Allowed only for advance invoices. **Example:** ```json { "label": null, "lang": "en", "type": "offer", "currency_code": "EUR", "currency_rate": null, "tax_by_group": true, "date": "", "due_date": null, "late_fee_percent": null, "notes": null, "payment_type": "cash", "payment_type_custom": null, "deal_type": "goods", "deal_type_custom": null, "prepaid_amount": null, "recipient": { "name": "", "country": "lv", "is_legal": true, "registration_number": null, "vat_registration_number": null, "email": null, "address": null, "phone_prefix": null, "phone_number": null, "notes": null, "internal_notes": null, "save_as_partner": true, "payment_methods": [] }, "carrier": { "is_legal": true, "country": "", "name": "", "registration_number": null, "driver": null, "vehicle_model": null, "vehicle_plate": null, "issuing_address": null, "receipt_address": null }, "items": [ { "sku": null, "name": "", "description": null, "measurement": "", "quantity": -999999999.999999, "discount": 0, "vat_percent": null, "price": -999999999.999999, "vat_reference_uuid": null } ], "additional_price_rows": [ { "description": "", "amount": 0.01 } ] } ``` #### Responses ##### Status: 201 The bookkeeping record was created. ###### Content-Type: application/json - **`additional_price_rows` (required)** `array` **Items:** - **`amount` (required)** `number` - **`description` (required)** `string` - **`carrier` (required)** `object` - **`category` (required)** `string` - **`color` (required)** `string | null` - **`created_at` (required)** `string | null`, format: `date-time` - **`currency_code` (required)** `string` - **`currency_rate` (required)** `number` - **`date` (required)** `string | null`, format: `date` - **`deal_type` (required)** `object` - **`deal_type_custom` (required)** `string | null` - **`due_date` (required)** `string | null`, format: `date` - **`has_discount` (required)** `boolean` - **`has_multi_discount` (required)** `boolean` - **`has_multi_vat` (required)** `boolean` - **`hide_currency_rate` (required)** `boolean` - **`is_final` (required)** `boolean` - **`is_template` (required)** `boolean` - **`items` (required)** `array` **Items:** - **`description` (required)** `string | null` - **`discount` (required)** `number | null` - **`measurement` (required)** `string` - **`name` (required)** `string` - **`price` (required)** `number` - **`quantity` (required)** `number` - **`sequence_no` (required)** `integer` - **`sku` (required)** `string | null` - **`total_with_vat` (required)** `number` - **`total_with_vat_local` (required)** `number` - **`total_without_vat` (required)** `number` - **`total_without_vat_local` (required)** `number` - **`uuid` (required)** `string`, format: `uuid` - **`vat_amount` (required)** `number` - **`vat_amount_local` (required)** `number` - **`vat_percent` (required)** `number | null` - **`vat_reference_uuid` (required)** `string | null`, format: `uuid` - **`label` (required)** `string | null` - **`lang` (required)** `string | null` - **`late_fee_percent` (required)** `number | null` - **`notes` (required)** `string | null` - **`number_format` (required)** `string | null` - **`number_iterator` (required)** `integer | null` - **`payment_type` (required)** `object` - **`payment_type_custom` (required)** `string | null` - **`prepaid_amount` (required)** `number | null` - **`recipient` (required)** `object` - **`record_number` (required)** `string | null` - **`sender` (required)** `object` - **`address`** `string | null` - **`country`** `string | null` - **`email`** `string | null` - **`name`** `string | null` - **`notes`** `string | null` - **`payment_methods`** `array` **Items:** - **`account_number`** `string | null` - **`bank_name`** `string | null` - **`is_primary`** `boolean` - **`name`** `string | null` - **`swift_code`** `string | null` - **`type`** `string` - **`phone_number`** `string | null` - **`phone_prefix`** `string | null` - **`registration_number`** `string | null` - **`vat_registration_number`** `string | null` - **`website`** `string | null` - **`signature` (required)** `object | null` - **`status` (required)** `object` - **`tax_by_group` (required)** `boolean` - **`total_with_vat` (required)** `number` - **`total_with_vat_local` (required)** `number` - **`total_without_vat` (required)** `number` - **`total_without_vat_local` (required)** `number` - **`type` (required)** `string`, possible values: `"offer", "invoice", "waybill", "credit_note", "advance_invoice"` - **`updated_at` (required)** `string | null`, format: `date-time` - **`uuid` (required)** `string`, format: `uuid` - **`vat_amount` (required)** `number` - **`vat_amount_local` (required)** `number` **Example:** ```json { "uuid": "", "category": "income", "type": "offer", "status": "draft", "label": null, "is_template": false, "is_final": true, "lang": null, "number_format": null, "number_iterator": null, "record_number": null, "date": null, "due_date": null, "currency_code": "", "currency_rate": 1, "hide_currency_rate": true, "tax_by_group": true, "has_discount": true, "has_multi_discount": true, "has_multi_vat": true, "late_fee_percent": null, "payment_type": "cash", "payment_type_custom": null, "deal_type": "goods", "deal_type_custom": null, "notes": null, "color": null, "sender": { "name": null, "registration_number": null, "vat_registration_number": null, "email": null, "address": null, "country": null, "website": null, "phone_prefix": null, "phone_number": null, "notes": null, "payment_methods": [], "additionalProperty": "anything" }, "recipient": { "uuid": "", "is_legal": true, "internal_notes": null, "preferences": { "additionalProperty": "anything" } }, "carrier": { "name": null, "registration_number": null, "driver": null, "vehicle_model": null, "vehicle_plate": null, "issuing_address": null, "receipt_address": null, "additionalProperty": "anything" }, "signature": null, "items": [ { "uuid": "", "sequence_no": 0, "sku": null, "name": "", "description": null, "measurement": "", "quantity": 1, "discount": null, "vat_percent": null, "price": 1, "vat_reference_uuid": null, "vat_amount": 1, "total_without_vat": 1, "total_with_vat": 1, "vat_amount_local": 1, "total_without_vat_local": 1, "total_with_vat_local": 1 } ], "additional_price_rows": [ { "description": "", "amount": 0.01 } ], "prepaid_amount": null, "vat_amount": 1, "total_without_vat": 1, "total_with_vat": 1, "vat_amount_local": 1, "total_without_vat_local": 1, "total_with_vat_local": 1, "created_at": null, "updated_at": null } ``` ##### Status: 401 The API key is missing, invalid, deleted, or otherwise cannot be resolved. ###### Content-Type: application/json - **`error` (required)** `object` - **`code` (required)** `string`, possible values: `"invalid_api_key", "api_access_suspended", "api_key_expired", "ip_address_not_allowed", "insufficient_permissions", "public_api_subscription_required", "feature_limit_exceeded", "document_not_found"` - **`message` (required)** `string` - **`feature`** `string`, possible values: `"documents", "sent_emails"` - **`limit`** `integer` - **`required_permission`** `string`, possible values: `"bookkeeping_records.list", "bookkeeping_records.create", "bookkeeping_records.send"` - **`usage`** `object` - **`current` (required)** `integer` - **`requested` (required)** `integer` **Example:** ```json { "error": { "code": "invalid_api_key", "message": "", "required_permission": "bookkeeping_records.list", "feature": "documents", "limit": 1, "usage": null } } ``` ##### Status: 402 The company has neither an active trial nor Public API access in its current plan, or another subscription feature limit has been reached. ###### Content-Type: application/json - **`error` (required)** `object` - **`code` (required)** `string`, possible values: `"invalid_api_key", "api_access_suspended", "api_key_expired", "ip_address_not_allowed", "insufficient_permissions", "public_api_subscription_required", "feature_limit_exceeded", "document_not_found"` - **`message` (required)** `string` - **`feature`** `string`, possible values: `"documents", "sent_emails"` - **`limit`** `integer` - **`required_permission`** `string`, possible values: `"bookkeeping_records.list", "bookkeeping_records.create", "bookkeeping_records.send"` - **`usage`** `object` - **`current` (required)** `integer` - **`requested` (required)** `integer` **Example:** ```json { "error": { "code": "invalid_api_key", "message": "", "required_permission": "bookkeeping_records.list", "feature": "documents", "limit": 1, "usage": null } } ``` ##### Status: 403 The key is suspended, expired, blocked by its IP allowlist, or lacks the required permission. ###### Content-Type: application/json - **`error` (required)** `object` - **`code` (required)** `string`, possible values: `"invalid_api_key", "api_access_suspended", "api_key_expired", "ip_address_not_allowed", "insufficient_permissions", "public_api_subscription_required", "feature_limit_exceeded", "document_not_found"` - **`message` (required)** `string` - **`feature`** `string`, possible values: `"documents", "sent_emails"` - **`limit`** `integer` - **`required_permission`** `string`, possible values: `"bookkeeping_records.list", "bookkeeping_records.create", "bookkeeping_records.send"` - **`usage`** `object` - **`current` (required)** `integer` - **`requested` (required)** `integer` **Example:** ```json { "error": { "code": "invalid_api_key", "message": "", "required_permission": "bookkeeping_records.list", "feature": "documents", "limit": 1, "usage": null } } ``` ##### Status: 422 One or more request values are invalid. Error keys identify the invalid request fields. Human-readable messages can be localized and must not be used as stable machine-readable identifiers. ###### Content-Type: application/json - **`errors` (required)** `object` - **`message` (required)** `string` **Example:** ```json { "message": "", "errors": { "additionalProperty": [ "" ] } } ``` ##### Status: 429 The request rate limit has been exceeded. Authenticated endpoints allow 120 requests per minute per API key, email delivery additionally allows 30 requests per minute per API key, authentication allows 300 attempts per minute per IP, and status allows 60 requests per minute per IP. ###### Content-Type: application/json - **`error` (required)** `string` - **`retry_after` (required)** `integer | string` — Seconds to wait before retrying. - **`status` (required)** `integer` **Example:** ```json { "status": 429, "error": "Too many requests.", "retry_after": 1 } ``` ### Send a bookkeeping record by email - **Method:** `POST` - **Path:** `/bookkeeping-records/{uuid}/send` - **Tags:** Bookkeeping records Queues an email containing the document PDF and UBL XML attachment. The document must belong to the API key's company and must not be a template or deleted. Requires an active trial or an active subscription plan with Public API access, currently Unlimited Plus. A successful response confirms that the delivery job was queued, not that the destination mail server accepted the email. #### Parameters ##### `App-Locale` - **In:** `header` Preferred language for validation messages. Use a two-letter system locale supported by Numbero. If omitted or unsupported, Numbero uses the fallback locale. `string` ##### `uuid` required - **In:** `path` Bookkeeping record UUID. `string`, format: `uuid` #### Request Body ##### Content-Type: application/json - **`email` (required)** `string`, format: `email` — Primary recipient. Input is trimmed and normalized to lowercase. - **`bcc`** `array | null` — Up to five unique blind-copy addresses. The primary email address cannot also appear in this array. Stored company BCC defaults are not added automatically. - **`message`** `string | null` — When omitted or null, the company default for the document type is used. Document variables are replaced before the email is queued. - **`subject`** `string | null` — When omitted or null, the company default for the document type is used. Supported variables: {NUMBER}, {ISSUED\_AT}, {DUE\_AT}, {LATE\_FEE\_RATE}, {CLIENT\_NAME}, {TOTAL\_AMOUNT}, and {DOCUMENT\_TYPE}. Legacy equivalents prefixed with @ are also supported. **Example:** ```json { "email": "", "bcc": [ "" ], "subject": null, "message": null } ``` #### Responses ##### Status: 202 The email delivery job was queued. ###### Content-Type: application/json - **`status` (required)** `string` - **`uuid` (required)** `string`, format: `uuid` **Example:** ```json { "status": "queued", "uuid": "" } ``` ##### Status: 401 The API key is missing, invalid, deleted, or otherwise cannot be resolved. ###### Content-Type: application/json - **`error` (required)** `object` - **`code` (required)** `string`, possible values: `"invalid_api_key", "api_access_suspended", "api_key_expired", "ip_address_not_allowed", "insufficient_permissions", "public_api_subscription_required", "feature_limit_exceeded", "document_not_found"` - **`message` (required)** `string` - **`feature`** `string`, possible values: `"documents", "sent_emails"` - **`limit`** `integer` - **`required_permission`** `string`, possible values: `"bookkeeping_records.list", "bookkeeping_records.create", "bookkeeping_records.send"` - **`usage`** `object` - **`current` (required)** `integer` - **`requested` (required)** `integer` **Example:** ```json { "error": { "code": "invalid_api_key", "message": "", "required_permission": "bookkeeping_records.list", "feature": "documents", "limit": 1, "usage": null } } ``` ##### Status: 402 The company has neither an active trial nor Public API access in its current plan, or another subscription feature limit has been reached. ###### Content-Type: application/json - **`error` (required)** `object` - **`code` (required)** `string`, possible values: `"invalid_api_key", "api_access_suspended", "api_key_expired", "ip_address_not_allowed", "insufficient_permissions", "public_api_subscription_required", "feature_limit_exceeded", "document_not_found"` - **`message` (required)** `string` - **`feature`** `string`, possible values: `"documents", "sent_emails"` - **`limit`** `integer` - **`required_permission`** `string`, possible values: `"bookkeeping_records.list", "bookkeeping_records.create", "bookkeeping_records.send"` - **`usage`** `object` - **`current` (required)** `integer` - **`requested` (required)** `integer` **Example:** ```json { "error": { "code": "invalid_api_key", "message": "", "required_permission": "bookkeeping_records.list", "feature": "documents", "limit": 1, "usage": null } } ``` ##### Status: 403 The key is suspended, expired, blocked by its IP allowlist, or lacks the required permission. ###### Content-Type: application/json - **`error` (required)** `object` - **`code` (required)** `string`, possible values: `"invalid_api_key", "api_access_suspended", "api_key_expired", "ip_address_not_allowed", "insufficient_permissions", "public_api_subscription_required", "feature_limit_exceeded", "document_not_found"` - **`message` (required)** `string` - **`feature`** `string`, possible values: `"documents", "sent_emails"` - **`limit`** `integer` - **`required_permission`** `string`, possible values: `"bookkeeping_records.list", "bookkeeping_records.create", "bookkeeping_records.send"` - **`usage`** `object` - **`current` (required)** `integer` - **`requested` (required)** `integer` **Example:** ```json { "error": { "code": "invalid_api_key", "message": "", "required_permission": "bookkeeping_records.list", "feature": "documents", "limit": 1, "usage": null } } ``` ##### Status: 404 The document does not exist in the API key's company, is a template, or has been deleted. ###### Content-Type: application/json - **`error` (required)** `object` - **`code` (required)** `string`, possible values: `"invalid_api_key", "api_access_suspended", "api_key_expired", "ip_address_not_allowed", "insufficient_permissions", "public_api_subscription_required", "feature_limit_exceeded", "document_not_found"` - **`message` (required)** `string` - **`feature`** `string`, possible values: `"documents", "sent_emails"` - **`limit`** `integer` - **`required_permission`** `string`, possible values: `"bookkeeping_records.list", "bookkeeping_records.create", "bookkeeping_records.send"` - **`usage`** `object` - **`current` (required)** `integer` - **`requested` (required)** `integer` **Example:** ```json { "error": { "code": "invalid_api_key", "message": "", "required_permission": "bookkeeping_records.list", "feature": "documents", "limit": 1, "usage": null } } ``` ##### Status: 422 One or more request values are invalid. Error keys identify the invalid request fields. Human-readable messages can be localized and must not be used as stable machine-readable identifiers. ###### Content-Type: application/json - **`errors` (required)** `object` - **`message` (required)** `string` **Example:** ```json { "message": "", "errors": { "additionalProperty": [ "" ] } } ``` ##### Status: 429 The request rate limit has been exceeded. Authenticated endpoints allow 120 requests per minute per API key, email delivery additionally allows 30 requests per minute per API key, authentication allows 300 attempts per minute per IP, and status allows 60 requests per minute per IP. ###### Content-Type: application/json - **`error` (required)** `string` - **`retry_after` (required)** `integer | string` — Seconds to wait before retrying. - **`status` (required)** `integer` **Example:** ```json { "status": 429, "error": "Too many requests.", "retry_after": 1 } ``` ## Schemas ### StatusResponse - **Type:**`object` * **`status` (required)** `string` **Example:** ```json { "status": "ok" } ``` ### BookkeepingRecordType - **Type:**`string` **Example:** ### BookkeepingRecordStatus - **Type:**`string` **Example:** ### PaymentType - **Type:**`string` **Example:** ### DealType - **Type:**`string` **Example:** ### CreateBookkeepingRecordRequest - **Type:**`object` Do not send server-managed fields such as category, status, is\_template, is\_final, document numbering fields, sender, logo, color, signature, discount flags, or line sequence numbers. Numbero returns a validation error when a specifically prohibited field is supplied. - **`currency_code` (required)** `string` — A currency code supported by Numbero. Input is normalized to uppercase. - **`date` (required)** `string`, format: `date` — Document date in YYYY-MM-DD format. - **`items` (required)** `array` **Items:** - **`measurement` (required)** `string` - **`name` (required)** `string` - **`price` (required)** `number` - **`quantity` (required)** `number` - **`description`** `string | null` - **`discount`** `number | null`, default: `0` - **`sku`** `string | null` - **`vat_percent`** `number | null` — Required for VAT-registered companies and prohibited for non-VAT-registered companies. - **`vat_reference_uuid`** `string | null`, format: `uuid` — Must identify a VAT reference belonging to the API key's company and may be used only when vat\_percent is zero or null. - **`lang` (required)** `string` — A two-letter document language supported by Numbero. - **`recipient` (required)** `object` - **`country` (required)** `string` — A two-letter country code supported by Numbero. Input is normalized to lowercase. - **`is_legal` (required)** `boolean` - **`name` (required)** `string` - **`save_as_partner` (required)** `boolean` — When true, Numbero adds the recipient and supplied payment methods to the company's partner list. - **`address`** `string | null` - **`email`** `string | null`, format: `email` - **`internal_notes`** `string | null` — Allowed only when save\_as\_partner is true. - **`notes`** `string | null` - **`payment_methods`** `array` **Items:** - **`account_number` (required)** `string` - **`bank_name` (required)** `string` - **`swift_code` (required)** `string` - **`phone_number`** `string | null` - **`phone_prefix`** `string | null` — Derived from country when omitted. - **`registration_number`** `string | null` — Required for legal entities and validated for the selected country. - **`vat_registration_number`** `string | null` — When supplied, it is validated for the selected country. - **`tax_by_group` (required)** `boolean` — Whether VAT and totals are rounded by VAT-rate group. - **`type` (required)** `string`, possible values: `"offer", "invoice", "waybill", "credit_note", "advance_invoice"` - **`additional_price_rows`** `array` — Positive previously-paid rows deducted from the total. **Items:** - **`amount` (required)** `number` - **`description` (required)** `string` - **`carrier`** `object` — Allowed only for waybills. When supplied, is\_legal, country, and name are required. - **`country` (required)** `string` - **`is_legal` (required)** `boolean` - **`name` (required)** `string` - **`driver`** `string | null` - **`issuing_address`** `string | null` - **`receipt_address`** `string | null` - **`registration_number`** `string | null` — Required when the carrier is a legal entity. - **`vehicle_model`** `string | null` - **`vehicle_plate`** `string | null` - **`currency_rate`** `number | null` — Required when currency\_code differs from the company's base currency. Numbero uses 1 for the base currency. At most five decimal places. - **`deal_type`** `object` — Not allowed for offers. - **`deal_type_custom`** `string | null` — Required only when deal\_type is other; prohibited otherwise. - **`due_date`** `string | null`, format: `date` — Cannot be earlier than date. - **`label`** `string | null` - **`late_fee_percent`** `number | null` - **`notes`** `string | null` - **`payment_type`** `object` — Not allowed for offers. - **`payment_type_custom`** `string | null` — Required only when payment\_type is other; prohibited otherwise. - **`prepaid_amount`** `number | null` — Allowed only for advance invoices. **Example:** ```json { "label": null, "lang": "en", "type": "offer", "currency_code": "EUR", "currency_rate": null, "tax_by_group": true, "date": "", "due_date": null, "late_fee_percent": null, "notes": null, "payment_type": "cash", "payment_type_custom": null, "deal_type": "goods", "deal_type_custom": null, "prepaid_amount": null, "recipient": { "name": "", "country": "lv", "is_legal": true, "registration_number": null, "vat_registration_number": null, "email": null, "address": null, "phone_prefix": null, "phone_number": null, "notes": null, "internal_notes": null, "save_as_partner": true, "payment_methods": [] }, "carrier": { "is_legal": true, "country": "", "name": "", "registration_number": null, "driver": null, "vehicle_model": null, "vehicle_plate": null, "issuing_address": null, "receipt_address": null }, "items": [ { "sku": null, "name": "", "description": null, "measurement": "", "quantity": -999999999.999999, "discount": 0, "vat_percent": null, "price": -999999999.999999, "vat_reference_uuid": null } ], "additional_price_rows": [ { "description": "", "amount": 0.01 } ] } ``` ### RecipientInput - **Type:**`object` * **`country` (required)** `string` — A two-letter country code supported by Numbero. Input is normalized to lowercase. * **`is_legal` (required)** `boolean` * **`name` (required)** `string` * **`save_as_partner` (required)** `boolean` — When true, Numbero adds the recipient and supplied payment methods to the company's partner list. * **`address`** `string | null` * **`email`** `string | null`, format: `email` * **`internal_notes`** `string | null` — Allowed only when save\_as\_partner is true. * **`notes`** `string | null` * **`payment_methods`** `array` **Items:** - **`account_number` (required)** `string` - **`bank_name` (required)** `string` - **`swift_code` (required)** `string` * **`phone_number`** `string | null` * **`phone_prefix`** `string | null` — Derived from country when omitted. * **`registration_number`** `string | null` — Required for legal entities and validated for the selected country. * **`vat_registration_number`** `string | null` — When supplied, it is validated for the selected country. **Example:** ```json { "name": "", "country": "lv", "is_legal": true, "registration_number": null, "vat_registration_number": null, "email": null, "address": null, "phone_prefix": null, "phone_number": null, "notes": null, "internal_notes": null, "save_as_partner": true, "payment_methods": [ { "account_number": "", "bank_name": "", "swift_code": "" } ] } ``` ### RecipientPaymentMethodInput - **Type:**`object` Do not send type. Numbero stores the method as a bank account. - **`account_number` (required)** `string` - **`bank_name` (required)** `string` - **`swift_code` (required)** `string` **Example:** ```json { "account_number": "", "bank_name": "", "swift_code": "" } ``` ### CarrierInput - **Type:**`object` Allowed only for waybills. When supplied, is\_legal, country, and name are required. - **`country` (required)** `string` - **`is_legal` (required)** `boolean` - **`name` (required)** `string` - **`driver`** `string | null` - **`issuing_address`** `string | null` - **`receipt_address`** `string | null` - **`registration_number`** `string | null` — Required when the carrier is a legal entity. - **`vehicle_model`** `string | null` - **`vehicle_plate`** `string | null` **Example:** ```json { "is_legal": true, "country": "", "name": "", "registration_number": null, "driver": null, "vehicle_model": null, "vehicle_plate": null, "issuing_address": null, "receipt_address": null } ``` ### BookkeepingRecordItemInput - **Type:**`object` Do not send sequence\_no. Numbero assigns line order from the array order and calculates VAT, discounts, and totals. - **`measurement` (required)** `string` - **`name` (required)** `string` - **`price` (required)** `number` - **`quantity` (required)** `number` - **`description`** `string | null` - **`discount`** `number | null`, default: `0` - **`sku`** `string | null` - **`vat_percent`** `number | null` — Required for VAT-registered companies and prohibited for non-VAT-registered companies. - **`vat_reference_uuid`** `string | null`, format: `uuid` — Must identify a VAT reference belonging to the API key's company and may be used only when vat\_percent is zero or null. **Example:** ```json { "sku": null, "name": "", "description": null, "measurement": "", "quantity": -999999999.999999, "discount": 0, "vat_percent": null, "price": -999999999.999999, "vat_reference_uuid": null } ``` ### AdditionalPriceRow - **Type:**`object` * **`amount` (required)** `number` * **`description` (required)** `string` **Example:** ```json { "description": "", "amount": 0.01 } ``` ### SendBookkeepingRecordRequest - **Type:**`object` * **`email` (required)** `string`, format: `email` — Primary recipient. Input is trimmed and normalized to lowercase. * **`bcc`** `array | null` — Up to five unique blind-copy addresses. The primary email address cannot also appear in this array. Stored company BCC defaults are not added automatically. * **`message`** `string | null` — When omitted or null, the company default for the document type is used. Document variables are replaced before the email is queued. * **`subject`** `string | null` — When omitted or null, the company default for the document type is used. Supported variables: {NUMBER}, {ISSUED\_AT}, {DUE\_AT}, {LATE\_FEE\_RATE}, {CLIENT\_NAME}, {TOTAL\_AMOUNT}, and {DOCUMENT\_TYPE}. Legacy equivalents prefixed with @ are also supported. **Example:** ```json { "email": "", "bcc": [ "" ], "subject": null, "message": null } ``` ### QueuedEmailResponse - **Type:**`object` * **`status` (required)** `string` * **`uuid` (required)** `string`, format: `uuid` **Example:** ```json { "status": "queued", "uuid": "" } ``` ### BookkeepingRecordSummary - **Type:**`object` * **`created_at` (required)** `string | null`, format: `date-time` * **`currency_code` (required)** `string` * **`date` (required)** `string | null`, format: `date` * **`due_date` (required)** `string | null`, format: `date` * **`recipient` (required)** `object` - **`name` (required)** `string | null` - **`registration_number` (required)** `string | null` * **`record_number` (required)** `string | null` * **`status` (required)** `object` * **`total_with_vat` (required)** `number` * **`total_without_vat` (required)** `number` * **`type` (required)** `string`, possible values: `"offer", "invoice", "waybill", "credit_note", "advance_invoice"` * **`updated_at` (required)** `string | null`, format: `date-time` * **`uuid` (required)** `string`, format: `uuid` **Example:** ```json { "uuid": "", "type": "offer", "status": "draft", "record_number": null, "date": null, "due_date": null, "currency_code": "EUR", "total_without_vat": 1, "total_with_vat": 1, "recipient": { "name": null, "registration_number": null }, "created_at": null, "updated_at": null } ``` ### BookkeepingRecordRecipientSummary - **Type:**`object` * **`name` (required)** `string | null` * **`registration_number` (required)** `string | null` **Example:** ```json { "name": null, "registration_number": null } ``` ### PaginationLinks - **Type:**`object` * **`first` (required)** `string`, format: `uri` * **`last` (required)** `string`, format: `uri` * **`next` (required)** `string | null`, format: `uri` * **`prev` (required)** `string | null`, format: `uri` **Example:** ```json { "first": "", "last": "", "prev": null, "next": null } ``` ### PaginationMeta - **Type:**`object` * **`current_page` (required)** `integer` * **`from` (required)** `integer | null` * **`last_page` (required)** `integer` * **`path` (required)** `string`, format: `uri` * **`per_page` (required)** `integer` * **`to` (required)** `integer | null` * **`total` (required)** `integer` **Example:** ```json { "current_page": 1, "from": null, "last_page": 1, "path": "", "per_page": 1, "to": null, "total": 0 } ``` ### PaginatedBookkeepingRecords - **Type:**`object` * **`data` (required)** `array` **Items:** - **`created_at` (required)** `string | null`, format: `date-time` - **`currency_code` (required)** `string` - **`date` (required)** `string | null`, format: `date` - **`due_date` (required)** `string | null`, format: `date` - **`recipient` (required)** `object` - **`name` (required)** `string | null` - **`registration_number` (required)** `string | null` - **`record_number` (required)** `string | null` - **`status` (required)** `object` - **`total_with_vat` (required)** `number` - **`total_without_vat` (required)** `number` - **`type` (required)** `string`, possible values: `"offer", "invoice", "waybill", "credit_note", "advance_invoice"` - **`updated_at` (required)** `string | null`, format: `date-time` - **`uuid` (required)** `string`, format: `uuid` * **`links` (required)** `object` - **`first` (required)** `string`, format: `uri` - **`last` (required)** `string`, format: `uri` - **`next` (required)** `string | null`, format: `uri` - **`prev` (required)** `string | null`, format: `uri` * **`meta` (required)** `object` - **`current_page` (required)** `integer` - **`from` (required)** `integer | null` - **`last_page` (required)** `integer` - **`path` (required)** `string`, format: `uri` - **`per_page` (required)** `integer` - **`to` (required)** `integer | null` - **`total` (required)** `integer` **Example:** ```json { "data": [ { "uuid": "", "type": null, "status": null, "record_number": null, "date": null, "due_date": null, "currency_code": "EUR", "total_without_vat": 1, "total_with_vat": 1, "recipient": null, "created_at": null, "updated_at": null } ], "links": { "first": "", "last": "", "prev": null, "next": null }, "meta": { "current_page": 1, "from": null, "last_page": 1, "path": "", "per_page": 1, "to": null, "total": 0 } } ``` ### BookkeepingRecord - **Type:**`object` * **`additional_price_rows` (required)** `array` **Items:** - **`amount` (required)** `number` - **`description` (required)** `string` * **`carrier` (required)** `object` * **`category` (required)** `string` * **`color` (required)** `string | null` * **`created_at` (required)** `string | null`, format: `date-time` * **`currency_code` (required)** `string` * **`currency_rate` (required)** `number` * **`date` (required)** `string | null`, format: `date` * **`deal_type` (required)** `object` * **`deal_type_custom` (required)** `string | null` * **`due_date` (required)** `string | null`, format: `date` * **`has_discount` (required)** `boolean` * **`has_multi_discount` (required)** `boolean` * **`has_multi_vat` (required)** `boolean` * **`hide_currency_rate` (required)** `boolean` * **`is_final` (required)** `boolean` * **`is_template` (required)** `boolean` * **`items` (required)** `array` **Items:** - **`description` (required)** `string | null` - **`discount` (required)** `number | null` - **`measurement` (required)** `string` - **`name` (required)** `string` - **`price` (required)** `number` - **`quantity` (required)** `number` - **`sequence_no` (required)** `integer` - **`sku` (required)** `string | null` - **`total_with_vat` (required)** `number` - **`total_with_vat_local` (required)** `number` - **`total_without_vat` (required)** `number` - **`total_without_vat_local` (required)** `number` - **`uuid` (required)** `string`, format: `uuid` - **`vat_amount` (required)** `number` - **`vat_amount_local` (required)** `number` - **`vat_percent` (required)** `number | null` - **`vat_reference_uuid` (required)** `string | null`, format: `uuid` * **`label` (required)** `string | null` * **`lang` (required)** `string | null` * **`late_fee_percent` (required)** `number | null` * **`notes` (required)** `string | null` * **`number_format` (required)** `string | null` * **`number_iterator` (required)** `integer | null` * **`payment_type` (required)** `object` * **`payment_type_custom` (required)** `string | null` * **`prepaid_amount` (required)** `number | null` * **`recipient` (required)** `object` * **`record_number` (required)** `string | null` * **`sender` (required)** `object` - **`address`** `string | null` - **`country`** `string | null` - **`email`** `string | null` - **`name`** `string | null` - **`notes`** `string | null` - **`payment_methods`** `array` **Items:** - **`account_number`** `string | null` - **`bank_name`** `string | null` - **`is_primary`** `boolean` - **`name`** `string | null` - **`swift_code`** `string | null` - **`type`** `string` - **`phone_number`** `string | null` - **`phone_prefix`** `string | null` - **`registration_number`** `string | null` - **`vat_registration_number`** `string | null` - **`website`** `string | null` * **`signature` (required)** `object | null` * **`status` (required)** `object` * **`tax_by_group` (required)** `boolean` * **`total_with_vat` (required)** `number` * **`total_with_vat_local` (required)** `number` * **`total_without_vat` (required)** `number` * **`total_without_vat_local` (required)** `number` * **`type` (required)** `string`, possible values: `"offer", "invoice", "waybill", "credit_note", "advance_invoice"` * **`updated_at` (required)** `string | null`, format: `date-time` * **`uuid` (required)** `string`, format: `uuid` * **`vat_amount` (required)** `number` * **`vat_amount_local` (required)** `number` **Example:** ```json { "uuid": "", "category": "income", "type": "offer", "status": "draft", "label": null, "is_template": false, "is_final": true, "lang": null, "number_format": null, "number_iterator": null, "record_number": null, "date": null, "due_date": null, "currency_code": "", "currency_rate": 1, "hide_currency_rate": true, "tax_by_group": true, "has_discount": true, "has_multi_discount": true, "has_multi_vat": true, "late_fee_percent": null, "payment_type": "cash", "payment_type_custom": null, "deal_type": "goods", "deal_type_custom": null, "notes": null, "color": null, "sender": { "name": null, "registration_number": null, "vat_registration_number": null, "email": null, "address": null, "country": null, "website": null, "phone_prefix": null, "phone_number": null, "notes": null, "payment_methods": [], "additionalProperty": "anything" }, "recipient": { "uuid": "", "is_legal": true, "internal_notes": null, "preferences": { "additionalProperty": "anything" } }, "carrier": { "name": null, "registration_number": null, "driver": null, "vehicle_model": null, "vehicle_plate": null, "issuing_address": null, "receipt_address": null, "additionalProperty": "anything" }, "signature": null, "items": [ { "uuid": "", "sequence_no": 0, "sku": null, "name": "", "description": null, "measurement": "", "quantity": 1, "discount": null, "vat_percent": null, "price": 1, "vat_reference_uuid": null, "vat_amount": 1, "total_without_vat": 1, "total_with_vat": 1, "vat_amount_local": 1, "total_without_vat_local": 1, "total_with_vat_local": 1 } ], "additional_price_rows": [ { "description": "", "amount": 0.01 } ], "prepaid_amount": null, "vat_amount": 1, "total_without_vat": 1, "total_with_vat": 1, "vat_amount_local": 1, "total_without_vat_local": 1, "total_with_vat_local": 1, "created_at": null, "updated_at": null } ``` ### PartySnapshot - **Type:**`object` * **`address`** `string | null` * **`country`** `string | null` * **`email`** `string | null` * **`name`** `string | null` * **`notes`** `string | null` * **`payment_methods`** `array` **Items:** - **`account_number`** `string | null` - **`bank_name`** `string | null` - **`is_primary`** `boolean` - **`name`** `string | null` - **`swift_code`** `string | null` - **`type`** `string` * **`phone_number`** `string | null` * **`phone_prefix`** `string | null` * **`registration_number`** `string | null` * **`vat_registration_number`** `string | null` * **`website`** `string | null` **Example:** ```json { "name": null, "registration_number": null, "vat_registration_number": null, "email": null, "address": null, "country": null, "website": null, "phone_prefix": null, "phone_number": null, "notes": null, "payment_methods": [ { "type": "", "name": null, "account_number": null, "bank_name": null, "swift_code": null, "is_primary": true, "additionalProperty": "anything" } ], "additionalProperty": "anything" } ``` ### RecipientSnapshot - **Type:** **Example:** ### CarrierSnapshot - **Type:**`object` * **`driver`** `string | null` * **`issuing_address`** `string | null` * **`name`** `string | null` * **`receipt_address`** `string | null` * **`registration_number`** `string | null` * **`vehicle_model`** `string | null` * **`vehicle_plate`** `string | null` **Example:** ```json { "name": null, "registration_number": null, "driver": null, "vehicle_model": null, "vehicle_plate": null, "issuing_address": null, "receipt_address": null, "additionalProperty": "anything" } ``` ### PaymentMethodSnapshot - **Type:**`object` * **`account_number`** `string | null` * **`bank_name`** `string | null` * **`is_primary`** `boolean` * **`name`** `string | null` * **`swift_code`** `string | null` * **`type`** `string` **Example:** ```json { "type": "", "name": null, "account_number": null, "bank_name": null, "swift_code": null, "is_primary": true, "additionalProperty": "anything" } ``` ### BookkeepingRecordItem - **Type:**`object` * **`description` (required)** `string | null` * **`discount` (required)** `number | null` * **`measurement` (required)** `string` * **`name` (required)** `string` * **`price` (required)** `number` * **`quantity` (required)** `number` * **`sequence_no` (required)** `integer` * **`sku` (required)** `string | null` * **`total_with_vat` (required)** `number` * **`total_with_vat_local` (required)** `number` * **`total_without_vat` (required)** `number` * **`total_without_vat_local` (required)** `number` * **`uuid` (required)** `string`, format: `uuid` * **`vat_amount` (required)** `number` * **`vat_amount_local` (required)** `number` * **`vat_percent` (required)** `number | null` * **`vat_reference_uuid` (required)** `string | null`, format: `uuid` **Example:** ```json { "uuid": "", "sequence_no": 0, "sku": null, "name": "", "description": null, "measurement": "", "quantity": 1, "discount": null, "vat_percent": null, "price": 1, "vat_reference_uuid": null, "vat_amount": 1, "total_without_vat": 1, "total_with_vat": 1, "vat_amount_local": 1, "total_without_vat_local": 1, "total_with_vat_local": 1 } ``` ### ApiErrorResponse - **Type:**`object` * **`error` (required)** `object` - **`code` (required)** `string`, possible values: `"invalid_api_key", "api_access_suspended", "api_key_expired", "ip_address_not_allowed", "insufficient_permissions", "public_api_subscription_required", "feature_limit_exceeded", "document_not_found"` - **`message` (required)** `string` - **`feature`** `string`, possible values: `"documents", "sent_emails"` - **`limit`** `integer` - **`required_permission`** `string`, possible values: `"bookkeeping_records.list", "bookkeeping_records.create", "bookkeeping_records.send"` - **`usage`** `object` - **`current` (required)** `integer` - **`requested` (required)** `integer` **Example:** ```json { "error": { "code": "invalid_api_key", "message": "", "required_permission": "bookkeeping_records.list", "feature": "documents", "limit": 1, "usage": null } } ``` ### ApiError - **Type:**`object` * **`code` (required)** `string`, possible values: `"invalid_api_key", "api_access_suspended", "api_key_expired", "ip_address_not_allowed", "insufficient_permissions", "public_api_subscription_required", "feature_limit_exceeded", "document_not_found"` * **`message` (required)** `string` * **`feature`** `string`, possible values: `"documents", "sent_emails"` * **`limit`** `integer` * **`required_permission`** `string`, possible values: `"bookkeeping_records.list", "bookkeeping_records.create", "bookkeeping_records.send"` * **`usage`** `object` - **`current` (required)** `integer` - **`requested` (required)** `integer` **Example:** ```json { "code": "invalid_api_key", "message": "", "required_permission": "bookkeeping_records.list", "feature": "documents", "limit": 1, "usage": { "current": 0, "requested": 0 } } ``` ### FeatureUsage - **Type:**`object` * **`current` (required)** `integer` * **`requested` (required)** `integer` **Example:** ```json { "current": 0, "requested": 0 } ``` ### ValidationErrorResponse - **Type:**`object` * **`errors` (required)** `object` * **`message` (required)** `string` **Example:** ```json { "message": "", "errors": { "additionalProperty": [ "" ] } } ``` ### RateLimitErrorResponse - **Type:**`object` * **`error` (required)** `string` * **`retry_after` (required)** `integer | string` — Seconds to wait before retrying. * **`status` (required)** `integer` **Example:** ```json { "status": 429, "error": "Too many requests.", "retry_after": 1 } ```