First request
<?xml version="1.0" encoding="utf-8"?>
<request method="getAccountInfo">
</request>XML API v1.1
All 78 XML v1.1 methods, each with its request fields, required flags, accepted values, a full request and response example and the error messages it returns.
Use a server-side integration. Never expose an account token in browser code or a public repository.
The Invoicera XML API v1.1 reference documents 78 methods in 11 groups, 622 request fields and 221 error messages. Each method lists its request fields, required flags, accepted values, a full request and response example and its errors. OAuth scopes, JSON payloads and REST calls are not part of this interface.
Getting started
The interface accepts one XML request per HTTPS POST. Start with getAccountInfo, retain the Invoicera identifiers that later calls return, then test one create-and-read workflow in a non-production data set.
The account owner finds the API token in Invoicera under My Account, on the Invoicera API tab. Keep it in a server-side secret store.
Send the token as the HTTP Basic username and the XML document in the xml_request form field.
Parse the status attribute on the root response element before reading identifiers, records or paging attributes.
Read the created or updated record back, record its Invoicera identifier and prevent retries from creating duplicate commercial records.
<?xml version="1.0" encoding="utf-8"?>
<request method="getAccountInfo">
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<account>
<company>[COMPANY_NAME]</company>
<name>[ACCOUNT_OWNER_NAME]</name>
<country_code>USA</country_code>
<currency_code>USD</currency_code>
</account>
</response>curl --request POST \
--user "$INVOICERA_API_TOKEN:X" \
--data-urlencode 'xml_request=<?xml version="1.0" encoding="utf-8"?><request method="getAccountInfo"></request>' \
https://api.invoicera.com/xml/1.1/<?php
$token = getenv('INVOICERA_API_TOKEN');
$xml = '<?xml version="1.0" encoding="utf-8"?>'
. '<request method="listClient"><filter><page>1</page><per_page_record>10</per_page_record></filter></request>';
$ch = curl_init('https://api.invoicera.com/xml/1.1/');
curl_setopt_array($ch, [
CURLOPT_USERPWD => $token . ':X',
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['xml_request' => $xml]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$body = curl_exec($ch);
curl_close($ch);
$response = simplexml_load_string($body);
if ((string) $response['status'] !== '200') {
// handle the error message in (string) $response
}
Certificate checks stay on, the body is URL-encoded and the token is read from the environment.
Conventions
Dates, numbers, codes, paging, empty elements and identifiers work the same way across the interface. Read these once before using the method tables below.
The API has one entry point: https://api.invoicera.com/xml/1.1/.
The version, 1.1, is part of the path. This reference covers version 1.1 only.
Send every request over HTTPS. Never send your token over plain HTTP.
Each request carries your API token in the HTTP Authorization header, using Basic authentication.
Use the token as the username. Only the token is checked: send any short value as the password, such as X.
The account owner finds the token in Invoicera under My Account, on the Invoicera API tab.
Changing the account password resets the token. Update the token in your integration after a password change.
Keep the token on your server. Do not put it in browser code, mobile apps, URLs, logs or source control.
Send an HTTP POST with a form-encoded body. Put the XML document in a field named xml_request.
Send one method per request. The method name goes in the method attribute of the root <request> element and is case-sensitive.
Start the document with <?xml version="1.0" encoding="utf-8"?>.
Escape &, < and > inside values (&, <, >). A document that does not parse is rejected with status 400.
Every response is an XML document with a root <response> element.
Read the status attribute on <response>, not the HTTP status line. A status of 200 means the call worked.
Other status values carry a short message as the element text, for example <response status="400">Date is invalid.</response>.
Some calls that handle several records return status 200 with a <failure> list, or status 400 with <invalid> and <success> lists. Check the whole body.
List methods take page and per_page_record inside <filter>.
page starts at 1. per_page_record accepts 1 to 100 and defaults to 100. A larger value returns 100 records.
The list element carries page, per_page_record and total_pages attributes, and the number of matching records in total_records (total on listClient, listStaff and listExpenseCategory). Keep requesting pages until page equals total_pages.
Send dates as YYYY-MM-DD, for example 2026-01-15.
Responses return dates as YYYY-MM-DD or as date and time, YYYY-MM-DD HH:MM:SS.
Send amounts, rates, quantities and percentages as plain numbers with up to two decimal places, for example 1250.50.
Do not include currency symbols or thousands separators.
currency and currency_code take a three-letter currency code, such as USD or GBP.
country takes the country code Invoicera stores, as in the old example USA.
language takes one of en, po, fr, de, ru, dt, it, sp, swd, por, ind or cro.
When createClient leaves out country or currency, your account's country and base currency are used.
An empty element, such as <discount></discount>, is treated as not supplied and takes the default.
On line items, send every element shown in the method's example, even if empty. Several methods reject a line that leaves out <type>, <discount> or <discount_type>.
Use the identifiers Invoicera returns, such as client_id and invoice_id. Do not use display numbers in their place.
Delete and send methods accept the identifier element more than once, to act on several records in one request.
This reference does not publish a fixed request limit. Some plans limit how many invoices and clients can be created, or invoices sent, each day or in total. Ask Invoicera for the allowance on your account before planning bulk imports.
Start with getAccountInfo. It needs no fields and returns your company name, country and currency, so it proves the token works without touching billing records.
Status codes
The result of a call is carried in the status attribute of the XML response. Do not treat an HTTP 200 response as proof that the requested billing operation succeeded. Each method below lists the messages it can return.
| Status | Meaning |
|---|---|
200 | The call worked. |
400 | The request was not valid: no token, XML that does not parse, or a field that failed a check. The message says which. |
401 | The account linked to the token is not active. |
403 | The token is not recognised, the plan does not include API access, or the record belongs to another account. Also returned as Authentication failed when HTTP authentication fails. |
404 | No record matched. List calls return this when nothing matches the filter. |
426 | Your plan limit for this kind of record has been reached. |
500 | Invoicera could not complete the request. |
501 | The method name is not recognised. |
Do not display raw server errors to end users or log account tokens, complete XML documents, client addresses, invoice notes or other commercial data.
Method index
Begin with one end-to-end record path. Test the response, duplicate protection, retry behaviour and reconciliation before adding another resource. The methods act on the same records your team manages in Invoicera invoicing.
Call reference
Open a method to see its fields and examples. Required means the element must be sent; where a description says an element may be empty, send it empty to take the default. Values in [SQUARE_BRACKETS] are placeholders for your own data.
9 methods
createInvoiceCreate an invoice with its line items. Returns the new invoice_id.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
client | element | No | Container for the client being billed. | |
client/client_id | integer (Invoicera identifier) | Yes | Identifier of an existing client in your account. Use the client_id returned by createClient or listClient. | |
client/address | string | No | Client address to print on the document. If left out, no address is copied to the document. | |
invoice_title | string | No | Title shown on the invoice. | |
number | string | No | Document number shown on the invoice. If left out, or if the number is already in use, Invoicera assigns the next number in your sequence. | |
date | date (YYYY-MM-DD) | No | Document date. Defaults to today when left out. | |
due_date | date (YYYY-MM-DD) | No | Date payment is due. | |
late_fee | integer (Invoicera identifier) | No | Identifier of an active late-fee rule. Get it from listLateFee. Leave empty for no late fee. | |
schedule_date | date (YYYY-MM-DD) | No | Date the document is scheduled for. | |
po_number | string | No | Purchase order or reference number shown on the document. | |
status | string | No | Document status. See allowed values. |
|
notes | string | No | Notes shown on the document. | |
terms | string | No | Terms shown on the document, such as payment terms. | |
items | element | No | Container for one or more line items. Repeat <item> for each line. | |
items/item | element · repeatable | No | One line item. | |
items/item/name | string | Yes | Line item name. Required on every line. | |
items/item/type | string | Yes | Line item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected. |
|
items/item/description | string | No | Line item description. | |
items/item/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
items/item/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
items/item/discount | decimal (up to 2 decimal places) | No | Discount on the line. Read as a percentage or a fixed amount, depending on discount_type. | |
items/item/discount_type | string | No | How discount is applied: Percent or Fixed. An empty element is treated as Percent. |
|
items/item/tax1_name | string | No | Name of the first tax on the line, for example VAT. | |
items/item/tax2_name | string | No | Name of the second tax on the line. | |
items/item/tax1_type | string | No | Type of the first tax. Only Normal is accepted. Defaults to Normal. |
|
items/item/tax1_percent | decimal (up to 2 decimal places) | No | Rate of the first tax, as a percentage. | |
items/item/tax2_percent | decimal (up to 2 decimal places) | No | Rate of the second tax, as a percentage. | |
items/item/tax2_type | string | No | Type of the second tax: Normal or Compound. Compound applies the second tax on top of the first. Defaults to Normal. |
|
additional_charges | element | No | Container for one or more extra charges, such as shipping. | |
additional_charges/additional_charge | element · repeatable | No | One extra charge. | |
additional_charges/additional_charge/name | string | No | Name of the charge, for example Shipping. | |
additional_charges/additional_charge/type | string | No | How amount is applied: Percent or Fixed. Defaults to Percent. |
|
additional_charges/additional_charge/amount | decimal (up to 2 decimal places) | No | Charge value, read as a percentage or a fixed amount depending on type. | |
custom_fields | element | No | Container for up to four custom fields. | |
custom_fields/custom_field | element · repeatable | No | One custom field. | |
custom_fields/custom_field/label | string | No | Custom field label. | |
custom_fields/custom_field/value | string | No | Custom field value. |
<?xml version="1.0" encoding="utf-8"?>
<request method="createInvoice">
<client>
<client_id>[CLIENT_ID]</client_id>
<address>[ADDRESS]</address>
</client>
<invoice_title>[INVOICE_TITLE]</invoice_title>
<number></number>
<date>2026-01-15</date>
<due_date>2026-02-14</due_date>
<late_fee></late_fee>
<schedule_date></schedule_date>
<po_number>[PO_NUMBER]</po_number>
<status>draft</status>
<notes>[NOTES]</notes>
<terms>[TERMS]</terms>
<items>
<item>
<name>[ITEM_NAME]</name>
<type>Service</type>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
<tax1_name>[TAX_NAME]</tax1_name>
<tax2_name></tax2_name>
<tax1_type>Normal</tax1_type>
<tax1_percent>10</tax1_percent>
<tax2_percent></tax2_percent>
<tax2_type></tax2_type>
</item>
</items>
<additional_charges>
<additional_charge>
<name>Shipping</name>
<type>Fixed</type>
<amount>10.00</amount>
</additional_charge>
</additional_charges>
<custom_fields>
<custom_field>
<label>[CUSTOM_FIELD_LABEL]</label>
<value>[CUSTOM_FIELD_VALUE]</value>
</custom_field>
</custom_fields>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<invoice_id>[INVOICE_ID]</invoice_id>
</response>| Path | Description |
|---|---|
invoice_id | Identifier of the new invoice. |
| Status | Message | When |
|---|---|---|
400 | Client id is not exists. | client_id does not belong to your account. |
400 | Date is invalid. | A date is not a real date in YYYY-MM-DD form. |
400 | Due Date is invalid. | due_date is not a valid date. |
400 | Late Fee is invalid or inactive. | late_fee is not an active late-fee identifier. |
400 | Schedule Date is invalid. | schedule_date is not a valid date. |
400 | Name is required. | A line has no name. |
400 | Cost is invalid. | unit_cost is not a number with up to two decimal places. |
400 | Quantity is invalid. | quantity is negative or not a number. |
400 | Type is invalid. | type is not Product or Service, or the element is missing. |
400 | Discount type is invalid. | discount_type is not Percent or Fixed. |
400 | Tax1 type is invalid. | tax1_type is not Normal. |
400 | Tax2 type is invalid. | tax2_type is not Normal or Compound. |
updateInvoiceReplace the details of an existing invoice. Returns the invoice_id.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
invoice_id | integer (Invoicera identifier) | Yes | Invoice identifier returned by createInvoice or listInvoice. | |
client | element | No | Container for the client being billed. | |
client/client_id | integer (Invoicera identifier) | Yes | Identifier of an existing client in your account. Use the client_id returned by createClient or listClient. | |
client/address | string | No | Client address to print on the document. If left out, no address is copied to the document. | |
invoice_title | string | No | Title shown on the invoice. | |
number | string | No | Document number shown on the invoice. If left out, or if the number is already in use, Invoicera assigns the next number in your sequence. | |
date | date (YYYY-MM-DD) | No | Invoice date. | |
due_date | date (YYYY-MM-DD) | No | Date payment is due. | |
late_fee | integer (Invoicera identifier) | No | Identifier of an active late-fee rule. Get it from listLateFee. Leave empty for no late fee. | |
schedule_date | date (YYYY-MM-DD) | No | Date the document is scheduled for. | |
po_number | string | No | Purchase order or reference number shown on the document. | |
status | string | No | Invoice status. When the request includes lines, any other value saves the invoice as a draft. |
|
notes | string | No | Notes shown on the document. | |
terms | string | No | Terms shown on the document, such as payment terms. | |
items | element | No | Container for one or more line items. Repeat <item> for each line. | |
items/item | element · repeatable | No | One line item. | |
items/item/name | string | Yes | Line item name. Required on every line. | |
items/item/type | string | Yes | Line item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected. |
|
items/item/description | string | No | Line item description. | |
items/item/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
items/item/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
items/item/discount | decimal (up to 2 decimal places) | No | Discount on the line. Read as a percentage or a fixed amount, depending on discount_type. | |
items/item/discount_type | string | Yes | How discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent. |
|
items/item/tax1_name | string | No | Name of the first tax on the line, for example VAT. | |
items/item/tax1_percent | decimal (up to 2 decimal places) | No | Rate of the first tax, as a percentage. | |
items/item/tax1_type | string | No | Type of the first tax. Only Normal is accepted. Defaults to Normal. |
|
items/item/tax2_name | string | No | Name of the second tax on the line. | |
items/item/tax2_percent | decimal (up to 2 decimal places) | No | Rate of the second tax, as a percentage. | |
items/item/tax2_type | string | No | Type of the second tax: Normal or Compound. Compound applies the second tax on top of the first. Defaults to Normal. |
|
additional_charges | element | No | Container for one or more extra charges, such as shipping. | |
additional_charges/additional_charge | element · repeatable | No | One extra charge. | |
additional_charges/additional_charge/name | string | No | Name of the charge, for example Shipping. | |
additional_charges/additional_charge/type | string | No | How amount is applied: Percent or Fixed. Defaults to Percent. |
|
additional_charges/additional_charge/amount | decimal (up to 2 decimal places) | No | Charge value, read as a percentage or a fixed amount depending on type. |
<?xml version="1.0" encoding="utf-8"?>
<request method="updateInvoice">
<invoice_id>[INVOICE_ID]</invoice_id>
<client>
<client_id>[CLIENT_ID]</client_id>
<address>[ADDRESS]</address>
</client>
<invoice_title>[INVOICE_TITLE]</invoice_title>
<number></number>
<date>2026-01-15</date>
<due_date>2026-02-14</due_date>
<late_fee></late_fee>
<schedule_date></schedule_date>
<po_number>[PO_NUMBER]</po_number>
<status>sent</status>
<notes>[NOTES]</notes>
<terms>[TERMS]</terms>
<items>
<item>
<name>[ITEM_NAME]</name>
<type>Service</type>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
<tax1_name>[TAX_NAME]</tax1_name>
<tax1_percent>10</tax1_percent>
<tax1_type>Normal</tax1_type>
<tax2_name></tax2_name>
<tax2_percent></tax2_percent>
<tax2_type></tax2_type>
</item>
</items>
<additional_charges>
<additional_charge>
<name>Shipping</name>
<type>Fixed</type>
<amount>10.00</amount>
</additional_charge>
</additional_charges>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<invoice_id>[INVOICE_ID]</invoice_id>
</response>| Path | Description |
|---|---|
invoice_id | Identifier of the updated invoice. |
| Status | Message | When |
|---|---|---|
403 | Client id is invalid. | client_id does not belong to your account. |
400 | Date is invalid. | A date is not a real date in YYYY-MM-DD form. |
400 | Due Date is invalid. | due_date is not a valid date. |
400 | Late Fee is invalid or inactive. | late_fee is not an active late-fee identifier. |
400 | Schedule Date is invalid. | schedule_date is not a valid date. |
400 | Name is required. | A line has no name. |
400 | Cost is invalid. | unit_cost is not a number with up to two decimal places. |
400 | Quantity is invalid. | quantity is negative or not a number. |
400 | Type is invalid. | type is not Product or Service, or the element is missing. |
400 | Discount type is invalid. | discount_type is not Percent or Fixed. |
400 | Tax1 type is invalid. | tax1_type is not Normal. |
400 | Tax2 type is invalid. | tax2_type is not Normal or Compound. |
400 | Invoice id is invalid. | invoice_id is not an invoice in your account. |
deleteInvoiceDelete one or more invoices.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
invoice_id | integer (Invoicera identifier) · repeatable | Yes | Invoice to delete. Repeat the element to delete more than one invoice. |
<?xml version="1.0" encoding="utf-8"?>
<request method="deleteInvoice">
<invoice_id>[INVOICE_ID]</invoice_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Path | Description |
|---|---|
failure | Present only when some invoices could not be deleted. Lists their identifiers. |
getInvoiceReturn one invoice with its lines, extra charges and payments.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
invoice_id | integer (Invoicera identifier) | Yes | Invoice to return. One identifier per request. |
<?xml version="1.0" encoding="utf-8"?>
<request method="getInvoice">
<invoice_id>[INVOICE_ID]</invoice_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<invoice>
<client>
<client_id>[CLIENT_ID]</client_id>
<address>[CLIENT_ADDRESS]</address>
</client>
<invoice_title>[INVOICE_TITLE]</invoice_title>
<number>[INVOICE_NUMBER]</number>
<date>2026-01-15</date>
<po_number>[PO_NUMBER]</po_number>
<total_discount>0.00</total_discount>
<total_tax>10.00</total_tax>
<net_balance>110.00</net_balance>
<late_fee>0.00</late_fee>
<late_fee_id>0</late_fee_id>
<total_paid>0.00</total_paid>
<outstanding>110.00</outstanding>
<invoice_status>Draft</invoice_status>
<status>Active</status>
<invoice_due_date>2026-02-14</invoice_due_date>
<invoice_schedule_date></invoice_schedule_date>
<notes>[NOTES]</notes>
<terms>[TERMS]</terms>
<currency>USD</currency>
<items>
<item>
<item_id>[INVOICE_ITEM_ID]</item_id>
<type>Services</type>
<name>[ITEM_NAME]</name>
<description>[ITEM_DESCRIPTION]</description>
<unit_cost>50.00</unit_cost>
<quantity>2.00</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
<tax1_name>[TAX_NAME]</tax1_name>
<tax1_percent>10</tax1_percent>
<tax1_type>Normal</tax1_type>
<tax2_name></tax2_name>
<tax2_percent></tax2_percent>
<tax2_type></tax2_type>
</item>
</items>
<additional_charges>
<charge>
<name>[CHARGE_NAME]</name>
<type>Fixed</type>
<amount>0.00</amount>
</charge>
</additional_charges>
<transactions>
<transaction>
<method>[PAYMENT_METHOD]</method>
<notes>[PAYMENT_NOTES]</notes>
<amount>0.00</amount>
<date>2026-01-20</date>
</transaction>
</transactions>
</invoice>
</response>| Path | Description |
|---|---|
invoice/client | Client identifier and billing address. |
invoice/number | Invoice number. |
invoice/date | Invoice date. |
invoice/total_discount | Total discount. |
invoice/total_tax | Total tax. |
invoice/net_balance | Invoice total after discounts and taxes. |
invoice/late_fee | Late fee charged. |
invoice/late_fee_id | Late-fee rule applied, or 0. |
invoice/total_paid | Amount paid so far. |
invoice/outstanding | Amount still due. |
invoice/invoice_status | Commercial status, for example Draft, Sent, Viewed, Paid or Partial-Paid. |
invoice/status | Record status: Active, Archived or Cancel. |
invoice/invoice_due_date | Due date. |
invoice/currency | Currency code. |
invoice/items/item | One entry per line. Line type is returned as Products or Services. |
invoice/additional_charges/charge | One entry per extra charge. |
invoice/transactions/transaction | One entry per recorded payment. |
| Status | Message | When |
|---|---|---|
400 | Invoice id is invalid. | The invoice does not exist in your account. |
listInvoiceReturn a page of invoices, newest invoice number first by default.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
filter | element | No | Container for search and paging options. All are optional. | |
filter/client_id | integer (Invoicera identifier) | No | Return only records for this client. | |
filter/date_from | date (YYYY-MM-DD) | No | Return only records dated on or after this date. | |
filter/date_to | date (YYYY-MM-DD) | No | Return only records dated on or before this date. | |
filter/invoice_number | string | No | Return only the invoice with this exact number. | |
filter/invoice_record_status | string | No | Record status to return. See allowed values. Defaults to Active. |
|
filter/invoice_status | string | No | Invoice status to return. See allowed values. |
|
filter/page | integer | No | Page to return. Defaults to 1. | |
filter/per_page_record | integer | No | Records per page, from 1 to 100. Defaults to 100. Values above 100 return 100. | |
filter/sort_column | string | No | Column to sort by. See allowed values. |
|
filter/sort_order | string | No | Sort direction: asc or desc. Defaults to desc. |
|
<?xml version="1.0" encoding="utf-8"?>
<request method="listInvoice">
<filter>
<client_id></client_id>
<date_from></date_from>
<date_to></date_to>
<invoice_number></invoice_number>
<invoice_record_status></invoice_record_status>
<invoice_status></invoice_status>
<page>1</page>
<per_page_record>25</per_page_record>
<sort_column>number</sort_column>
<sort_order>desc</sort_order>
</filter>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<invoices page="1" per_page_record="100" total_pages="1" total_records="1">
<invoice>
<!-- one invoice record -->
</invoice>
</invoices>
</response>| Path | Description |
|---|---|
invoices@page | Page returned. |
invoices@per_page_record | Records per page. |
invoices@total_pages | Number of pages. |
invoices@total_records | Number of matching invoices. |
invoices/invoice | One entry per invoice. |
| Status | Message | When |
|---|---|---|
400 | Per page record is invalid. | per_page_record is not a whole number of 1 or more. |
400 | Page is invalid. | page is not a whole number of 1 or more. |
404 | Data not found. Kindly check the request. | No record matches the filter. |
sendInvoiceMailEmail one or more invoices to the client, with a PDF copy. Each invoice is marked as sent.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
invoice_id | integer (Invoicera identifier) · repeatable | Yes | Invoice to email. Repeat the element to send more than one invoice. |
<?xml version="1.0" encoding="utf-8"?>
<request method="sendInvoiceMail">
<invoice_id>[INVOICE_ID]</invoice_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<invoice_id>[INVOICE_ID]</invoice_id>
</response>| Path | Description |
|---|---|
invoice_id | Each invoice that was sent. |
| Status | Message | When |
|---|---|---|
400 | Message varies | One or more invoices could not be sent. The response lists them in <invalid> and the sent ones in <success>. |
400 | Invalid data. | No invoice identifier was supplied. |
addInvoiceItemAdd one or more lines to an existing invoice. Returns the new line identifiers.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
invoice_id | integer (Invoicera identifier) | Yes | Invoice identifier returned by createInvoice or listInvoice. | |
items | element | No | Container for one or more line items. Repeat <item> for each line. | |
items/item | element · repeatable | No | One line item. | |
items/item/name | string | Yes | Line item name. Required on every line. | |
items/item/type | string | Yes | Line item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected. |
|
items/item/description | string | No | Line item description. | |
items/item/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
items/item/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
items/item/discount | decimal (up to 2 decimal places) | Yes | Discount on the line, read as a percentage or a fixed amount depending on discount_type. Send the element on every line; an empty element means no discount. | |
items/item/discount_type | string | Yes | How discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent. |
|
items/item/tax1_name | string | No | Name of the first tax on the line, for example VAT. | |
items/item/tax2_name | string | No | Name of the second tax on the line. | |
items/item/tax1_percent | decimal (up to 2 decimal places) | No | Rate of the first tax, as a percentage. | |
items/item/tax2_percent | decimal (up to 2 decimal places) | No | Rate of the second tax, as a percentage. |
<?xml version="1.0" encoding="utf-8"?>
<request method="addInvoiceItem">
<invoice_id>[INVOICE_ID]</invoice_id>
<items>
<item>
<name>[ITEM_NAME]</name>
<type>Service</type>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
<tax1_name>[TAX_NAME]</tax1_name>
<tax2_name></tax2_name>
<tax1_percent>10</tax1_percent>
<tax2_percent></tax2_percent>
</item>
</items>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<invoice_id>[INVOICE_ID]</invoice_id>
<invoice_items>
<invoice_item_id>[INVOICE_ITEM_ID]</invoice_item_id>
</invoice_items>
</response>| Path | Description |
|---|---|
invoice_id | Invoice the lines were added to. |
invoice_items/invoice_item_id | One identifier per new line. Keep it for later updates. |
| Status | Message | When |
|---|---|---|
400 | Name is required. | A line has no name. |
400 | Cost is invalid. | unit_cost is not a number with up to two decimal places. |
400 | Quantity is invalid. | quantity is negative or not a number. |
400 | Type is invalid. | type is not Product or Service, or the element is missing. |
400 | Discount type is invalid. | discount_type is not Percent or Fixed. |
400 | Discount is invalid. | discount is missing or is not a number with up to two decimal places. |
updateInvoiceItemChange one or more existing lines on an invoice.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
invoice_id | integer (Invoicera identifier) | Yes | Invoice identifier returned by createInvoice or listInvoice. | |
items | element | No | Container for one or more line items. Repeat <item> for each line. | |
items/item | element · repeatable | No | One line item. | |
items/item/invoice_item_id | integer (Invoicera identifier) | Yes | Identifier of the invoice line to change. Returned by addInvoiceItem and getInvoice. | |
items/item/type | string | Yes | Line item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected. |
|
items/item/name | string | Yes | Line item name. Required on every line. | |
items/item/description | string | No | Line item description. | |
items/item/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
items/item/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
items/item/discount | decimal (up to 2 decimal places) | Yes | Discount on the line, read as a percentage or a fixed amount depending on discount_type. Send the element on every line; an empty element means no discount. | |
items/item/discount_type | string | Yes | How discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent. |
|
items/item/tax1_name | string | No | Name of the first tax on the line, for example VAT. | |
items/item/tax2_name | string | No | Name of the second tax on the line. | |
items/item/tax1_percent | decimal (up to 2 decimal places) | No | Rate of the first tax, as a percentage. | |
items/item/tax2_percent | decimal (up to 2 decimal places) | No | Rate of the second tax, as a percentage. |
<?xml version="1.0" encoding="utf-8"?>
<request method="updateInvoiceItem">
<invoice_id>[INVOICE_ID]</invoice_id>
<items>
<item>
<invoice_item_id>[INVOICE_ITEM_ID]</invoice_item_id>
<type>Service</type>
<name>[ITEM_NAME]</name>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
<tax1_name>[TAX_NAME]</tax1_name>
<tax2_name></tax2_name>
<tax1_percent>10</tax1_percent>
<tax2_percent></tax2_percent>
</item>
</items>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Status | Message | When |
|---|---|---|
400 | Invoice item is invalid. | invoice_item_id does not belong to the invoice. |
400 | Name is required. | A line has no name. |
400 | Cost is invalid. | unit_cost is not a number with up to two decimal places. |
400 | Quantity is invalid. | quantity is negative or not a number. |
400 | Type is invalid. | type is not Product or Service, or the element is missing. |
400 | Discount type is invalid. | discount_type is not Percent or Fixed. |
400 | Discount is invalid. | discount is missing or is not a number with up to two decimal places. |
deleteInvoiceItemDelete a line from an invoice.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
invoice_id | integer (Invoicera identifier) · repeatable | Yes | Invoice identifier returned by createInvoice or listInvoice. | |
invoice_item_id | integer (Invoicera identifier) · repeatable | Yes | Identifier of the invoice line to delete. |
<?xml version="1.0" encoding="utf-8"?>
<request method="deleteInvoiceItem">
<invoice_id>[INVOICE_ID]</invoice_id>
<invoice_item_id>[INVOICE_ITEM_ID]</invoice_item_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>9 methods
createEstimateCreate an estimate with its line items. Returns the new estimate_id.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
client | element | No | Container for the client being billed. | |
client/client_id | integer (Invoicera identifier) | Yes | Identifier of an existing client in your account. Use the client_id returned by createClient or listClient. | |
client/address | string | No | Client address to print on the document. If left out, no address is copied to the document. | |
estimate_title | string | No | Title shown on the estimate. | |
number | string | No | Estimate number. If left out, or if the number is already in use, Invoicera assigns the next number in your sequence. | |
date | date (YYYY-MM-DD) | No | Document date. Defaults to today when left out. | |
schedule_date | date (YYYY-MM-DD) | No | Date the document is scheduled for. | |
po_number | string | No | Purchase order or reference number shown on the document. | |
status | string | No | Estimate status. The value is saved as you send it and is not checked, so send one of the listed values. |
|
notes | string | No | Notes shown on the document. | |
terms | string | No | Terms shown on the document, such as payment terms. | |
items | element | No | Container for one or more line items. Repeat <item> for each line. | |
items/item | element · repeatable | No | One line item. | |
items/item/name | string | Yes | Line item name. Required on every line. | |
items/item/type | string | Yes | Line item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected. |
|
items/item/description | string | No | Line item description. | |
items/item/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
items/item/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
items/item/discount | decimal (up to 2 decimal places) | No | Discount on the line. Read as a percentage or a fixed amount, depending on discount_type. | |
items/item/discount_type | string | Yes | How discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent. |
|
items/item/tax1_name | string | No | Name of the first tax on the line, for example VAT. | |
items/item/tax1_percent | decimal (up to 2 decimal places) | No | Rate of the first tax, as a percentage. | |
items/item/tax2_name | string | No | Name of the second tax on the line. | |
items/item/tax2_percent | decimal (up to 2 decimal places) | No | Rate of the second tax, as a percentage. |
<?xml version="1.0" encoding="utf-8"?>
<request method="createEstimate">
<client>
<client_id>[CLIENT_ID]</client_id>
<address>[ADDRESS]</address>
</client>
<estimate_title>[ESTIMATE_TITLE]</estimate_title>
<number></number>
<date>2026-01-15</date>
<schedule_date></schedule_date>
<po_number>[PO_NUMBER]</po_number>
<status>draft</status>
<notes>[NOTES]</notes>
<terms>[TERMS]</terms>
<items>
<item>
<name>[ITEM_NAME]</name>
<type>Service</type>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
<tax1_name>[TAX_NAME]</tax1_name>
<tax1_percent>10</tax1_percent>
<tax2_name></tax2_name>
<tax2_percent></tax2_percent>
</item>
</items>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<estimate_id>[ESTIMATE_ID]</estimate_id>
</response>| Path | Description |
|---|---|
estimate_id | Identifier of the new estimate. |
| Status | Message | When |
|---|---|---|
400 | Name is required. | A line has no name. |
400 | Cost is invalid. | unit_cost is not a number with up to two decimal places. |
400 | Quantity is invalid. | quantity is negative or not a number. |
400 | Type is invalid. | type is not Product or Service, or the element is missing. |
400 | Discount type is invalid. | discount_type is not Percent or Fixed. |
400 | Tax1 type is invalid. | tax1_type is not Normal. |
400 | Tax2 type is invalid. | tax2_type is not Normal or Compound. |
updateEstimateReplace the details of an existing estimate.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
estimate_id | integer (Invoicera identifier) | Yes | Estimate identifier returned by createEstimate or listEstimate. | |
client | element | No | Container for the client being billed. | |
client/client_id | integer (Invoicera identifier) | Yes | Identifier of an existing client in your account. Use the client_id returned by createClient or listClient. | |
client/address | string | No | Client address to print on the document. If left out, no address is copied to the document. | |
number | string | No | Estimate number. If left out, or if the number is already in use, Invoicera assigns the next number in your sequence. | |
date | date (YYYY-MM-DD) | No | Estimate date. | |
schedule_date | date (YYYY-MM-DD) | No | Date the document is scheduled for. | |
po_number | string | No | Purchase order or reference number shown on the document. | |
status | string | No | Estimate status. The value is saved as you send it and is not checked, so send one of the listed values. |
|
notes | string | No | Notes shown on the document. | |
terms | string | No | Terms shown on the document, such as payment terms. | |
items | element | No | Container for one or more line items. Repeat <item> for each line. | |
items/item | element · repeatable | No | One line item. | |
items/item/name | string | Yes | Line item name. Required on every line. | |
items/item/type | string | Yes | Line item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected. |
|
items/item/description | string | No | Line item description. | |
items/item/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
items/item/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
items/item/discount | decimal (up to 2 decimal places) | No | Discount on the line. Read as a percentage or a fixed amount, depending on discount_type. | |
items/item/discount_type | string | Yes | How discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent. |
|
items/item/tax1_name | string | No | Name of the first tax on the line, for example VAT. | |
items/item/tax1_percent | decimal (up to 2 decimal places) | No | Rate of the first tax, as a percentage. | |
items/item/tax2_name | string | No | Name of the second tax on the line. | |
items/item/tax2_percent | decimal (up to 2 decimal places) | No | Rate of the second tax, as a percentage. |
<?xml version="1.0" encoding="utf-8"?>
<request method="updateEstimate">
<estimate_id>[ESTIMATE_ID]</estimate_id>
<client>
<client_id>[CLIENT_ID]</client_id>
<address>[ADDRESS]</address>
</client>
<number></number>
<date>2026-01-15</date>
<schedule_date></schedule_date>
<po_number>[PO_NUMBER]</po_number>
<status>draft</status>
<notes>[NOTES]</notes>
<terms>[TERMS]</terms>
<items>
<item>
<name>[ITEM_NAME]</name>
<type>Service</type>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
<tax1_name>[TAX_NAME]</tax1_name>
<tax1_percent>10</tax1_percent>
<tax2_name></tax2_name>
<tax2_percent></tax2_percent>
</item>
</items>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Status | Message | When |
|---|---|---|
400 | Name is required. | A line has no name. |
400 | Cost is invalid. | unit_cost is not a number with up to two decimal places. |
400 | Quantity is invalid. | quantity is negative or not a number. |
400 | Type is invalid. | type is not Product or Service, or the element is missing. |
400 | Discount type is invalid. | discount_type is not Percent or Fixed. |
400 | Tax1 type is invalid. | tax1_type is not Normal. |
400 | Tax2 type is invalid. | tax2_type is not Normal or Compound. |
deleteEstimateDelete one or more estimates.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
estimate_id | integer (Invoicera identifier) · repeatable | Yes | Estimate to delete. Repeat the element to delete more than one estimate. |
<?xml version="1.0" encoding="utf-8"?>
<request method="deleteEstimate">
<estimate_id>[ESTIMATE_ID]</estimate_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Path | Description |
|---|---|
failure | Present only when some estimates could not be deleted. |
getEstimateReturn one estimate with its lines.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
estimate_id | integer (Invoicera identifier) | Yes | Estimate to return. One identifier per request. |
<?xml version="1.0" encoding="utf-8"?>
<request method="getEstimate">
<estimate_id>[ESTIMATE_ID]</estimate_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<estimate>
<client>
<client_id>[CLIENT_ID]</client_id>
<organization>[CLIENT_ORGANISATION]</organization>
<address>[CLIENT_ADDRESS]</address>
</client>
<estimate_id>[ESTIMATE_ID]</estimate_id>
<estimate_status>Draft</estimate_status>
<estimate_title>[ESTIMATE_TITLE]</estimate_title>
<number>[ESTIMATE_NUMBER]</number>
<date>2026-01-15</date>
<po_number></po_number>
<total_discount>0.00</total_discount>
<total_tax>0.00</total_tax>
<notes></notes>
<terms></terms>
<items>
<item>
<item_id>[ESTIMATE_ITEM_ID]</item_id>
<name>[ITEM_NAME]</name>
<type>Products</type>
<description>[ITEM_DESCRIPTION]</description>
<unit_cost>50.00</unit_cost>
<quantity>1.00</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
</item>
</items>
</estimate>
</response>| Path | Description |
|---|---|
estimate/client | Client identifier, organisation and address. |
estimate/estimate_id | Estimate identifier. |
estimate/estimate_status | Estimate status. |
estimate/number | Estimate number. |
estimate/items/item | One entry per line. |
listEstimateReturn a page of estimates. Filter by client, number, status or date.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
filter | element | No | Container for search and paging options. All are optional. | |
filter/client_id | integer (Invoicera identifier) | No | Return only records for this client. | |
filter/date_from | date (YYYY-MM-DD) | No | Return only records dated on or after this date. | |
filter/date_to | date (YYYY-MM-DD) | No | Return only records dated on or before this date. | |
filter/estimate_number | string | No | Return only the estimate with this number. | |
filter/status | string | No | Estimate status to return, for example Draft or Sent. With no value, active estimates are returned. | |
filter/page | integer | No | Page to return. Defaults to 1. | |
filter/per_page_record | integer | No | Records per page, from 1 to 100. Defaults to 100. Values above 100 return 100. | |
filter/sort_column | string | No | Column to sort by. See allowed values. |
|
filter/sort_order | string | No | Sort direction: asc or desc. Defaults to desc. |
|
<?xml version="1.0" encoding="utf-8"?>
<request method="listEstimate">
<filter>
<client_id></client_id>
<date_from></date_from>
<date_to></date_to>
<estimate_number></estimate_number>
<status></status>
<page>1</page>
<per_page_record>25</per_page_record>
<sort_column>number</sort_column>
<sort_order>desc</sort_order>
</filter>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<estimates page="1" per_page_record="100" total_pages="1" total_records="1">
<estimate>
<!-- one estimate record -->
</estimate>
</estimates>
</response>| Path | Description |
|---|---|
estimates@page | Page returned. |
estimates@total_records | Number of matching estimates. |
estimates/estimate | One entry per estimate. |
| Status | Message | When |
|---|---|---|
400 | Per page record is invalid. | per_page_record is not a whole number of 1 or more. |
400 | Page is invalid. | page is not a whole number of 1 or more. |
404 | Data not found. Kindly check the request. | No record matches the filter. |
sendEstimateMailEmail one or more estimates to the client. Each estimate is marked as sent.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
estimate_id | integer (Invoicera identifier) · repeatable | Yes | Estimate to email. Repeat the element to send more than one estimate. |
<?xml version="1.0" encoding="utf-8"?>
<request method="sendEstimateMail">
<estimate_id>[ESTIMATE_ID]</estimate_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<success>
<estimate_id>[ESTIMATE_ID]</estimate_id>
</success>
</response>| Path | Description |
|---|---|
success/estimate_id | Each estimate that was sent. |
addEstimateItemAdd one or more lines to an existing estimate. Returns the new line identifiers.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
estimate_id | integer (Invoicera identifier) | Yes | Estimate identifier returned by createEstimate or listEstimate. | |
items | element | No | Container for one or more line items. Repeat <item> for each line. | |
items/item | element · repeatable | No | One line item. | |
items/item/name | string | No | Line item name. | |
items/item/type | string | Yes | Line item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected. |
|
items/item/description | string | No | Line item description. | |
items/item/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
items/item/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
items/item/discount | decimal (up to 2 decimal places) | Yes | Discount on the line, read as a percentage or a fixed amount depending on discount_type. Send the element on every line; an empty element means no discount. | |
items/item/discount_type | string | Yes | How discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent. |
|
items/item/tax1_name | string | No | Name of the first tax on the line, for example VAT. | |
items/item/tax2_name | string | No | Name of the second tax on the line. | |
items/item/tax1_percent | decimal (up to 2 decimal places) | No | Rate of the first tax, as a percentage. | |
items/item/tax2_percent | decimal (up to 2 decimal places) | No | Rate of the second tax, as a percentage. |
<?xml version="1.0" encoding="utf-8"?>
<request method="addEstimateItem">
<estimate_id>[ESTIMATE_ID]</estimate_id>
<items>
<item>
<name>[ITEM_NAME]</name>
<type>Service</type>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
<tax1_name>[TAX_NAME]</tax1_name>
<tax2_name></tax2_name>
<tax1_percent>10</tax1_percent>
<tax2_percent></tax2_percent>
</item>
</items>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<estimate_id>[ESTIMATE_ID]</estimate_id>
<estimate_items>
<estimate_item_id>[ESTIMATE_ITEM_ID]</estimate_item_id>
</estimate_items>
</response>| Path | Description |
|---|---|
estimate_items/estimate_item_id | One identifier per new line. |
| Status | Message | When |
|---|---|---|
400 | Cost is invalid. | unit_cost is not a number with up to two decimal places. |
400 | Quantity is invalid. | quantity is negative or not a number. |
400 | Type is invalid. | type is not Product or Service, or the element is missing. |
400 | Discount type is invalid. | discount_type is not Percent or Fixed. |
400 | Discount is invalid. | discount is missing or is not a number with up to two decimal places. |
updateEstimateItemChange one or more existing lines on an estimate.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
estimate_id | integer (Invoicera identifier) | Yes | Estimate identifier returned by createEstimate or listEstimate. | |
items | element | No | Container for one or more line items. Repeat <item> for each line. | |
items/item | element · repeatable | No | One line item. | |
items/item/estimate_item_id | integer (Invoicera identifier) | Yes | Identifier of the estimate line to change. Returned by addEstimateItem and getEstimate. | |
items/item/name | string | No | Line item name. | |
items/item/type | string | Yes | Line item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected. |
|
items/item/description | string | No | Line item description. | |
items/item/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
items/item/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
items/item/discount | decimal (up to 2 decimal places) | Yes | Discount on the line, read as a percentage or a fixed amount depending on discount_type. Send the element on every line; an empty element means no discount. | |
items/item/discount_type | string | Yes | How discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent. |
|
items/item/tax1_name | string | No | Name of the first tax on the line, for example VAT. | |
items/item/tax2_name | string | No | Name of the second tax on the line. | |
items/item/tax1_percent | decimal (up to 2 decimal places) | No | Rate of the first tax, as a percentage. | |
items/item/tax2_percent | decimal (up to 2 decimal places) | No | Rate of the second tax, as a percentage. |
<?xml version="1.0" encoding="utf-8"?>
<request method="updateEstimateItem">
<estimate_id>[ESTIMATE_ID]</estimate_id>
<items>
<item>
<estimate_item_id>[ESTIMATE_ITEM_ID]</estimate_item_id>
<name>[ITEM_NAME]</name>
<type>Service</type>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
<tax1_name>[TAX_NAME]</tax1_name>
<tax2_name></tax2_name>
<tax1_percent>10</tax1_percent>
<tax2_percent></tax2_percent>
</item>
</items>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Status | Message | When |
|---|---|---|
400 | Estimate item is invalid. | estimate_item_id does not belong to the estimate. |
400 | Cost is invalid. | unit_cost is not a number with up to two decimal places. |
400 | Quantity is invalid. | quantity is negative or not a number. |
400 | Type is invalid. | type is not Product or Service, or the element is missing. |
400 | Discount type is invalid. | discount_type is not Percent or Fixed. |
400 | Discount is invalid. | discount is missing or is not a number with up to two decimal places. |
deleteEstimateItemDelete a line from an estimate.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
estimate_id | integer (Invoicera identifier) · repeatable | Yes | Estimate identifier returned by createEstimate or listEstimate. | |
estimate_item_id | integer (Invoicera identifier) · repeatable | Yes | Identifier of the estimate line to delete. |
<?xml version="1.0" encoding="utf-8"?>
<request method="deleteEstimateItem">
<estimate_id>[ESTIMATE_ID]</estimate_id>
<estimate_item_id>[ESTIMATE_ITEM_ID]</estimate_item_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>8 methods
createRecurringCreate a recurring invoice profile with its line items. Returns the new recurring_id.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
client | element | No | Container for the client being billed. | |
client/client_id | integer (Invoicera identifier) | Yes | Identifier of an existing client in your account. Use the client_id returned by createClient or listClient. | |
client/address | string | No | Client address to print on the document. If left out, no address is copied to the document. | |
recurring_title | string | No | Title shown on each invoice the recurring profile creates. | |
date | date (YYYY-MM-DD) | No | Date of the first invoice. Defaults to today. | |
po_number | string | No | Purchase order or reference number shown on the document. | |
notes | string | No | Notes shown on the document. | |
terms | string | No | Terms shown on the document, such as payment terms. | |
frequency | string | No | How often an invoice is created. See allowed values. An unrecognised value is saved as 1 Week. |
|
occurence | integer | No | Whole number stored as the profile's occurrence count. The element name is spelt occurence. | |
items | element | No | Container for one or more line items. Repeat <item> for each line. | |
items/item | element · repeatable | No | One line item. | |
items/item/name | string | Yes | Line item name. Required on every line. | |
items/item/type | string | No | Line item type: Product or Service. Any other value, or no element, is saved as Product. |
|
items/item/description | string | No | Line item description. | |
items/item/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
items/item/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
items/item/discount | decimal (up to 2 decimal places) | No | Discount on the line. Read as a percentage or a fixed amount, depending on discount_type. | |
items/item/discount_type | string | No | How discount is applied: Percent or Fixed. An empty element is treated as Percent. |
|
items/item/tax1_name | string | No | Name of the first tax on the line, for example VAT. | |
items/item/tax2_name | string | No | Name of the second tax on the line. | |
items/item/tax1_percent | decimal (up to 2 decimal places) | No | Rate of the first tax, as a percentage. | |
items/item/tax2_percent | decimal (up to 2 decimal places) | No | Rate of the second tax, as a percentage. |
<?xml version="1.0" encoding="utf-8"?>
<request method="createRecurring">
<client>
<client_id>[CLIENT_ID]</client_id>
<address>[ADDRESS]</address>
</client>
<recurring_title>[RECURRING_TITLE]</recurring_title>
<date>2026-01-15</date>
<po_number>[PO_NUMBER]</po_number>
<notes>[NOTES]</notes>
<terms>[TERMS]</terms>
<frequency>1 Month</frequency>
<occurence>12</occurence>
<items>
<item>
<name>[ITEM_NAME]</name>
<type>Service</type>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
<tax1_name>[TAX_NAME]</tax1_name>
<tax2_name></tax2_name>
<tax1_percent>10</tax1_percent>
<tax2_percent></tax2_percent>
</item>
</items>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<recurring_id>[RECURRING_ID]</recurring_id>
</response>| Path | Description |
|---|---|
recurring_id | Identifier of the new recurring profile. |
| Status | Message | When |
|---|---|---|
400 | Date is invalid. | date is not a valid date. |
400 | Name is required. | A line has no name. |
400 | Cost is invalid. | unit_cost is not a number with up to two decimal places. |
400 | Quantity is invalid. | quantity is negative or not a number. |
400 | Discount type is invalid. | discount_type is not Percent or Fixed. |
updateRecurringChange an existing recurring invoice profile. Fields you leave out are unchanged.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
recurring_id | integer (Invoicera identifier) | Yes | Recurring profile identifier returned by createRecurring or listRecurring. | |
client | element | No | Container for the client being billed. | |
client/client_id | integer (Invoicera identifier) | Yes | Identifier of an existing client in your account. Use the client_id returned by createClient or listClient. | |
client/address | string | No | Client address to print on the document. If left out, no address is copied to the document. | |
recurring_title | string | No | Title shown on each invoice the recurring profile creates. | |
date | date (YYYY-MM-DD) | No | Date of the first invoice. | |
po_number | string | No | Purchase order or reference number shown on the document. | |
notes | string | No | Notes shown on the document. | |
terms | string | No | Terms shown on the document, such as payment terms. | |
frequency | string | No | How often an invoice is created. See allowed values. An unrecognised value is saved as 1 Week. |
|
occurence | integer | No | Whole number stored as the profile's occurrence count. The element name is spelt occurence. | |
items | element | No | Container for one or more line items. Repeat <item> for each line. | |
items/item | element · repeatable | No | One line item. | |
items/item/name | string | Yes | Line item name. Required on every line. | |
items/item/type | string | No | Line item type: Product or Service. Any other value, or no element, is saved as Product. |
|
items/item/description | string | No | Line item description. | |
items/item/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
items/item/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
items/item/discount | decimal (up to 2 decimal places) | No | Discount on the line. Read as a percentage or a fixed amount, depending on discount_type. | |
items/item/discount_type | string | Yes | How discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent. |
|
items/item/tax1_name | string | No | Name of the first tax on the line, for example VAT. | |
items/item/tax2_name | string | No | Name of the second tax on the line. | |
items/item/tax1_percent | decimal (up to 2 decimal places) | No | Rate of the first tax, as a percentage. | |
items/item/tax2_percent | decimal (up to 2 decimal places) | No | Rate of the second tax, as a percentage. |
<?xml version="1.0" encoding="utf-8"?>
<request method="updateRecurring">
<recurring_id>[RECURRING_ID]</recurring_id>
<client>
<client_id>[CLIENT_ID]</client_id>
<address>[ADDRESS]</address>
</client>
<recurring_title>[RECURRING_TITLE]</recurring_title>
<date>2026-01-15</date>
<po_number>[PO_NUMBER]</po_number>
<notes>[NOTES]</notes>
<terms>[TERMS]</terms>
<frequency>1 Month</frequency>
<occurence>12</occurence>
<items>
<item>
<name>[ITEM_NAME]</name>
<type>Service</type>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
<tax1_name>[TAX_NAME]</tax1_name>
<tax2_name></tax2_name>
<tax1_percent>10</tax1_percent>
<tax2_percent></tax2_percent>
</item>
</items>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<recurring_id>[RECURRING_ID]</recurring_id>
</response>| Path | Description |
|---|---|
recurring_id | Identifier of the updated profile. |
| Status | Message | When |
|---|---|---|
400 | Name is required. | A line has no name. |
400 | Cost is invalid. | unit_cost is not a number with up to two decimal places. |
400 | Quantity is invalid. | quantity is negative or not a number. |
400 | Discount type is invalid. | discount_type is not Percent or Fixed. |
deleteRecurringDelete one or more recurring invoice profiles.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
recurring_id | integer (Invoicera identifier) · repeatable | Yes | Recurring profile to delete. Repeat the element to delete more than one. |
<?xml version="1.0" encoding="utf-8"?>
<request method="deleteRecurring">
<recurring_id>[RECURRING_ID]</recurring_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Path | Description |
|---|---|
failure | Present only when some profiles could not be deleted. |
getRecurringReturn one recurring invoice profile with its lines.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
recurring_id | integer (Invoicera identifier) | Yes | Recurring profile to return. One identifier per request. |
<?xml version="1.0" encoding="utf-8"?>
<request method="getRecurring">
<recurring_id>[RECURRING_ID]</recurring_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<recurring>
<client>
<client_id>[CLIENT_ID]</client_id>
<organization>[CLIENT_ORGANISATION]</organization>
<address>[CLIENT_ADDRESS]</address>
</client>
<recurring_id>[RECURRING_ID]</recurring_id>
<recurring_status>Active</recurring_status>
<recurring_title>[RECURRING_TITLE]</recurring_title>
<number>[PROFILE_NUMBER]</number>
<date>2026-01-15</date>
<frequency>1 Month</frequency>
<occurence>12</occurence>
<po_number></po_number>
<total_discount>0.00</total_discount>
<total_tax>0.00</total_tax>
<notes></notes>
<terms></terms>
<items>
<item>
<recurring_item_id>[RECURRING_ITEM_ID]</recurring_item_id>
<name>[ITEM_NAME]</name>
<type>Products</type>
<description>[ITEM_DESCRIPTION]</description>
<unit_cost>50.00</unit_cost>
<quantity>1.00</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
</item>
</items>
</recurring>
</response>| Path | Description |
|---|---|
recurring/recurring_id | Profile identifier. |
recurring/recurring_status | Profile status. |
recurring/frequency | How often invoices are created. |
recurring/occurence | Occurrence count stored on the profile. |
recurring/items/item | One entry per line. |
listRecurringReturn a page of recurring invoice profiles.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
filter | element | No | Container for search and paging options. All are optional. | |
filter/client_id | integer (Invoicera identifier) | No | Return only records for this client. | |
filter/date_from | date (YYYY-MM-DD) | No | Return only records dated on or after this date. | |
filter/date_to | date (YYYY-MM-DD) | No | Return only records dated on or before this date. | |
filter/recurring_number | string | No | Return only the recurring profile with this number. | |
filter/recurring_record_status | string | No | Record status to return. See allowed values. Defaults to Active. |
|
filter/page | integer | No | Page to return. Defaults to 1. | |
filter/per_page_record | integer | No | Records per page, from 1 to 100. Defaults to 100. Values above 100 return 100. |
<?xml version="1.0" encoding="utf-8"?>
<request method="listRecurring">
<filter>
<client_id></client_id>
<date_from></date_from>
<date_to></date_to>
<recurring_number></recurring_number>
<recurring_record_status></recurring_record_status>
<page>1</page>
<per_page_record>25</per_page_record>
</filter>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<recurrings page="1" per_page_record="100" total_pages="1" total_records="1">
<recurring>
<!-- one recurring record -->
</recurring>
</recurrings>
</response>| Path | Description |
|---|---|
recurrings@total_records | Number of matching profiles. |
recurrings/recurring | One entry per profile. |
| Status | Message | When |
|---|---|---|
400 | Per page record is invalid. | per_page_record is not a whole number of 1 or more. |
400 | Page is invalid. | page is not a whole number of 1 or more. |
404 | Data not found. Kindly check the request. | No record matches the filter. |
addRecurringItemAdd one or more lines to a recurring invoice profile. Returns the new line identifiers.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
recurring_id | integer (Invoicera identifier) | Yes | Recurring profile identifier returned by createRecurring or listRecurring. | |
items | element | No | Container for one or more line items. Repeat <item> for each line. | |
items/item | element · repeatable | No | One line item. | |
items/item/name | string | No | Line item name. | |
items/item/type | string | Yes | Line item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected. |
|
items/item/description | string | No | Line item description. | |
items/item/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
items/item/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
items/item/discount | decimal (up to 2 decimal places) | Yes | Discount on the line, read as a percentage or a fixed amount depending on discount_type. Send the element on every line; an empty element means no discount. | |
items/item/discount_type | string | Yes | How discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent. |
|
<?xml version="1.0" encoding="utf-8"?>
<request method="addRecurringItem">
<recurring_id>[RECURRING_ID]</recurring_id>
<items>
<item>
<name>[ITEM_NAME]</name>
<type>Service</type>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
</item>
</items>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<recurring_id>[RECURRING_ID]</recurring_id>
<recurring_items>
<recurring_item_id>[RECURRING_ITEM_ID]</recurring_item_id>
</recurring_items>
</response>| Path | Description |
|---|---|
recurring_items/recurring_item_id | One identifier per new line. |
| Status | Message | When |
|---|---|---|
400 | Cost is invalid. | unit_cost is not a number with up to two decimal places. |
400 | Quantity is invalid. | quantity is negative or not a number. |
400 | Type is invalid. | type is not Product or Service, or the element is missing. |
400 | Discount type is invalid. | discount_type is not Percent or Fixed. |
400 | Discount is invalid. | discount is missing or is not a number with up to two decimal places. |
updateRecurringItemChange one or more existing lines on a recurring invoice profile.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
recurring_id | integer (Invoicera identifier) | Yes | Recurring profile identifier returned by createRecurring or listRecurring. | |
items | element | No | Container for one or more line items. Repeat <item> for each line. | |
items/item | element · repeatable | No | One line item. | |
items/item/recurring_item_id | integer (Invoicera identifier) | Yes | Identifier of the recurring-profile line to change. Returned by addRecurringItem and getRecurring. | |
items/item/name | string | No | Line item name. | |
items/item/type | string | Yes | Line item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected. |
|
items/item/description | string | No | Line item description. | |
items/item/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
items/item/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
items/item/discount | decimal (up to 2 decimal places) | Yes | Discount on the line, read as a percentage or a fixed amount depending on discount_type. Send the element on every line; an empty element means no discount. | |
items/item/discount_type | string | Yes | How discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent. |
|
items/item/tax1_name | string | No | Name of the first tax on the line, for example VAT. | |
items/item/tax2_name | string | No | Name of the second tax on the line. | |
items/item/tax1_percent | decimal (up to 2 decimal places) | No | Rate of the first tax, as a percentage. | |
items/item/tax2_percent | decimal (up to 2 decimal places) | No | Rate of the second tax, as a percentage. |
<?xml version="1.0" encoding="utf-8"?>
<request method="updateRecurringItem">
<recurring_id>[RECURRING_ID]</recurring_id>
<items>
<item>
<recurring_item_id>[RECURRING_ITEM_ID]</recurring_item_id>
<name>[ITEM_NAME]</name>
<type>Service</type>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
<tax1_name>[TAX_NAME]</tax1_name>
<tax2_name></tax2_name>
<tax1_percent>10</tax1_percent>
<tax2_percent></tax2_percent>
</item>
</items>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Status | Message | When |
|---|---|---|
400 | Recurring item is invalid. | recurring_item_id does not belong to the profile. |
400 | Cost is invalid. | unit_cost is not a number with up to two decimal places. |
400 | Quantity is invalid. | quantity is negative or not a number. |
400 | Type is invalid. | type is not Product or Service, or the element is missing. |
400 | Discount type is invalid. | discount_type is not Percent or Fixed. |
400 | Discount is invalid. | discount is missing or is not a number with up to two decimal places. |
deleteRecurringItemDelete a line from a recurring invoice profile.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
recurring_id | integer (Invoicera identifier) · repeatable | Yes | Recurring profile identifier returned by createRecurring or listRecurring. | |
recurring_item_id | integer (Invoicera identifier) · repeatable | Yes | Identifier of the recurring-profile line to delete. |
<?xml version="1.0" encoding="utf-8"?>
<request method="deleteRecurringItem">
<recurring_id>[RECURRING_ID]</recurring_id>
<recurring_item_id>[RECURRING_ITEM_ID]</recurring_item_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>5 methods
createClientCreate a client. Returns the new client_id.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
name | string | Yes | Contact name for the client. Required. | |
organization | string | Yes | Organisation or company name of the client. Required. | |
email | string | No | Client email address. Checked for a valid format when supplied. | |
username | string | No | Login name for the client portal. At least five characters: letters, numbers and - _ . @ only. Must be unique. Generated for you when left out. | |
work_phone | string | No | Work phone number. | |
address | string | No | Primary postal address. | |
country | string | No | Country code, as in the old example USA. Defaults to your account country when left out. An unknown code is rejected. | |
language | string | No | Language for documents the client receives. See allowed values. |
|
currency | string | No | Three-letter currency code for the client, for example USD. Defaults to your base currency when left out. An unknown code is rejected. | |
custom_fields | element | No | Container for up to four custom fields. | |
custom_fields/custom_field | element · repeatable | No | One custom field. | |
custom_fields/custom_field/label | string | No | Custom field label. | |
custom_fields/custom_field/value | string | No | Custom field value. |
<?xml version="1.0" encoding="utf-8"?>
<request method="createClient">
<name>[NAME]</name>
<organization>[CLIENT_ORGANISATION]</organization>
<email>[EMAIL]</email>
<username>[USERNAME]</username>
<work_phone>[PHONE]</work_phone>
<address>[ADDRESS]</address>
<country>USA</country>
<language>en</language>
<currency>USD</currency>
<custom_fields>
<custom_field>
<label>[CUSTOM_FIELD_LABEL]</label>
<value>[CUSTOM_FIELD_VALUE]</value>
</custom_field>
</custom_fields>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<client_id>[CLIENT_ID]</client_id>
</response>| Path | Description |
|---|---|
client_id | Identifier of the new client. |
| Status | Message | When |
|---|---|---|
400 | Please provide mandatory data. | name or organization is missing. |
400 | Email is invalid. | email is not a valid address. |
400 | Username [...] already exists. | username is taken. |
400 | Username is invalid. | username is shorter than five characters or uses other characters. |
400 | Country code is invalid. | country is not a known code. |
400 | Currency code is invalid. | currency is not a known code. |
400 | Language is invalid. | language is not in the allowed list. |
426 | Message varies | Your plan does not allow more clients. The message names the limit. |
updateClientChange an existing client.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
client_id | integer (Invoicera identifier) | Yes | Client identifier returned by createClient or listClient. | |
name | string | Yes | Contact name for the client. Required, even when you are not changing it. | |
organization | string | Yes | Organisation or company name of the client. Required, even when you are not changing it. | |
email | string | No | Email address. | |
username | string | No | Login name for the client portal. At least five characters: letters, numbers and - _ . @ only. Must be unique. | |
work_phone | string | No | Work phone number. | |
address | string | No | Primary postal address. | |
country | string | No | Country code, as in the old example USA. An unknown code is rejected. | |
language | string | No | Language for documents the client receives. See allowed values. |
|
currency | string | No | Three-letter currency code for the client, for example USD. An unknown code is rejected. | |
additional_contacts | element | No | Container for extra client contacts. | |
additional_contacts/contact | element · repeatable | No | One extra contact. | |
additional_contacts/contact/a_name | string | No | Name of the extra contact. | |
additional_contacts/contact/a_email | string | No | Email address of the extra contact. | |
custom_fields | element | No | Container for up to four custom fields. | |
custom_fields/custom_field | element · repeatable | No | One custom field. | |
custom_fields/custom_field/label | string | No | Custom field label. | |
custom_fields/custom_field/value | string | No | Custom field value. |
<?xml version="1.0" encoding="utf-8"?>
<request method="updateClient">
<client_id>[CLIENT_ID]</client_id>
<name>[NAME]</name>
<organization>[CLIENT_ORGANISATION]</organization>
<email>[EMAIL]</email>
<username>[USERNAME]</username>
<work_phone>[PHONE]</work_phone>
<address>[ADDRESS]</address>
<country>USA</country>
<language>en</language>
<currency>USD</currency>
<additional_contacts>
<contact>
<a_name>[CONTACT_NAME]</a_name>
<a_email>[CONTACT_EMAIL]</a_email>
</contact>
</additional_contacts>
<custom_fields>
<custom_field>
<label>[CUSTOM_FIELD_LABEL]</label>
<value>[CUSTOM_FIELD_VALUE]</value>
</custom_field>
</custom_fields>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
[CLIENT_ID]
</response>| Path | Description |
|---|---|
(text) | The client identifier, returned as plain text inside <response>. |
| Status | Message | When |
|---|---|---|
400 | Email is invalid. | |
400 | Username is invalid. | |
400 | Country code is invalid. | |
400 | Currency code is invalid. | |
400 | Language is invalid. | |
400 | Client id is invalid. | client_id is not a whole number. |
400 | Please provide mandatory data. | name or organization is missing. |
400 | Currency can not be changed. | currency differs from the client's currency and the client already has invoices that are not drafts. |
deleteClientDelete one or more clients.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
client_id | integer (Invoicera identifier) · repeatable | Yes | Client to delete. Repeat the element to delete more than one client. |
<?xml version="1.0" encoding="utf-8"?>
<request method="deleteClient">
<client_id>[CLIENT_ID]</client_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Path | Description |
|---|---|
failure | Present only when some clients could not be deleted. |
getClientReturn one client with contact details and credits.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
client_id | integer (Invoicera identifier) | Yes | Client to return. One identifier per request. |
<?xml version="1.0" encoding="utf-8"?>
<request method="getClient">
<client_id>[CLIENT_ID]</client_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<client>
<client_id>[CLIENT_ID]</client_id>
<name>[CLIENT_NAME]</name>
<organization>[CLIENT_ORGANISATION]</organization>
<address>[CLIENT_ADDRESS]</address>
<email>[CLIENT_EMAIL]</email>
<work_phone>[CLIENT_PHONE]</work_phone>
<currency>USD</currency>
<credits>
<credit>
<amount>0.00</amount>
<payment_method>[PAYMENT_METHOD]</payment_method>
<payment_note></payment_note>
<credit_date>2026-01-15 00:00:00</credit_date>
</credit>
</credits>
</client>
</response>| Path | Description |
|---|---|
client/client_id | Client identifier. |
client/name | Contact name. |
client/organization | Organisation name. |
client/email | Email address. |
client/currency | Client currency code. |
client/credits/credit | One entry per credit held for the client. |
listClientReturn a page of clients, newest first.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
filter | element | No | Container for search and paging options. All are optional. | |
filter/client_id | integer (Invoicera identifier) | No | Return only records for this client. | |
filter/client_email | string | No | Return only the client with this business email address. | |
filter/client_status | string | No | Client status to return. See allowed values. Defaults to Active. |
|
filter/page | integer | No | Page to return. Defaults to 1. | |
filter/per_page_record | integer | No | Records per page, from 1 to 100. Defaults to 100. Values above 100 return 100. |
<?xml version="1.0" encoding="utf-8"?>
<request method="listClient">
<filter>
<client_id></client_id>
<client_email></client_email>
<client_status></client_status>
<page>1</page>
<per_page_record>25</per_page_record>
</filter>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<clients page="1" per_page_record="100" total_pages="1" total="1">
<client>
<!-- one client record -->
</client>
</clients>
</response>| Path | Description |
|---|---|
clients/client | One entry per client. |
| Status | Message | When |
|---|---|---|
400 | Per page record is invalid. | per_page_record is not a whole number of 1 or more. |
400 | Page is invalid. | page is not a whole number of 1 or more. |
404 | Data not found. Kindly check the request. | No record matches the filter. |
5 methods
createStaffCreate a staff member. Returns the new staff_id.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
name | string | Yes | Staff member name. Required. | |
username | string | Yes | Login name for the staff member. Required and must be unique. | |
email | string | Yes | Staff member email address. Required. | |
billing_rate | decimal (up to 2 decimal places) | No | Hourly billing rate for the staff member. | |
user_access_own_record | string | No | Yes limits the staff member to records they own. No gives access to all records. |
|
assigned_clients | element | No | Container for the clients this staff member may work with. Repeat <client_id> for each client. | |
assigned_clients/client_id | integer (Invoicera identifier) · repeatable | No | Identifier of a client to assign. |
<?xml version="1.0" encoding="utf-8"?>
<request method="createStaff">
<name>[NAME]</name>
<username>[USERNAME]</username>
<email>[EMAIL]</email>
<billing_rate>50.00</billing_rate>
<user_access_own_record>No</user_access_own_record>
<assigned_clients>
<client_id>[CLIENT_ID]</client_id>
</assigned_clients>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<staff_id>[STAFF_ID]</staff_id>
</response>| Path | Description |
|---|---|
staff_id | Identifier of the new staff member. |
| Status | Message | When |
|---|---|---|
400 | Email is invalid. | |
400 | Billing rate is invalid. | |
400 | Client is invalid. | An assigned client_id does not belong to your account. |
updateStaffChange an existing staff member.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
staff_id | integer (Invoicera identifier) | Yes | Staff identifier returned by createStaff or listStaff. | |
name | string | No | Staff member name. | |
username | string | No | Login name for the staff member. | |
email | string | No | Staff member email address. | |
billing_rate | decimal (up to 2 decimal places) | No | Hourly billing rate for the staff member. | |
user_access_own_record | string | No | Yes limits the staff member to records they own. No gives access to all records. |
|
assigned_clients | element | No | Container for the clients this staff member may work with. Repeat <client_id> for each client. | |
assigned_clients/client_id | integer (Invoicera identifier) · repeatable | No | Identifier of a client to assign. |
<?xml version="1.0" encoding="utf-8"?>
<request method="updateStaff">
<staff_id>[STAFF_ID]</staff_id>
<name>[NAME]</name>
<username>[USERNAME]</username>
<email>[EMAIL]</email>
<billing_rate>50.00</billing_rate>
<user_access_own_record>No</user_access_own_record>
<assigned_clients>
<client_id>[CLIENT_ID]</client_id>
</assigned_clients>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Status | Message | When |
|---|---|---|
400 | Email is invalid. | |
400 | Billing rate is invalid. | |
400 | Client is invalid. |
deleteStaffDelete one or more staff members.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
staff_id | integer (Invoicera identifier) · repeatable | Yes | Staff member to delete. Repeat the element to delete more than one. |
<?xml version="1.0" encoding="utf-8"?>
<request method="deleteStaff">
<staff_id>[STAFF_ID]</staff_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Path | Description |
|---|---|
failure | Present only when some staff could not be deleted. |
| Status | Message | When |
|---|---|---|
400 | Staff is invalid. |
getStaffReturn one staff member.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
staff_id | integer (Invoicera identifier) | Yes | Staff member to return. One identifier per request. |
<?xml version="1.0" encoding="utf-8"?>
<request method="getStaff">
<staff_id>[STAFF_ID]</staff_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<staff>
<staff_id>[STAFF_ID]</staff_id>
<bill_rate>20.00</bill_rate>
<name>[STAFF_NAME]</name>
<username>[STAFF_USERNAME]</username>
<email>[STAFF_EMAIL]</email>
<user_level>2</user_level>
<access_own_record>No</access_own_record>
<status>Active</status>
<date_added>2026-01-15 00:00:00</date_added>
<last_login></last_login>
<assigned_clients>
<client_id>[CLIENT_ID]</client_id>
</assigned_clients>
</staff>
</response>| Path | Description |
|---|---|
staff/staff_id | Staff identifier. |
staff/bill_rate | Billing rate. |
staff/access_own_record | Yes or No. |
staff/status | Active, Archived or Deleted. |
staff/assigned_clients/client_id | Assigned clients. |
listStaffReturn a page of staff members, newest first.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
filter | element | No | Container for search and paging options. All are optional. | |
filter/email | string | No | Return only the staff member with this email address. | |
filter/status | string | No | Status to return. See allowed values. Defaults to Active. |
|
filter/page | integer | No | Page to return. Defaults to 1. | |
filter/per_page_record | integer | No | Records per page, from 1 to 100. Defaults to 100. Values above 100 return 100. |
<?xml version="1.0" encoding="utf-8"?>
<request method="listStaff">
<filter>
<email></email>
<status></status>
<page>1</page>
<per_page_record>25</per_page_record>
</filter>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<staff_users page="1" per_page_record="100" total_pages="1" total="1">
<staff>
<!-- one staff record -->
</staff>
</staff_users>
</response>| Path | Description |
|---|---|
staff_users/staff | One entry per staff member. |
| Status | Message | When |
|---|---|---|
400 | Per page record is invalid. | per_page_record is not a whole number of 1 or more. |
400 | Page is invalid. | page is not a whole number of 1 or more. |
404 | Data not found. Kindly check the request. | No record matches the filter. |
10 methods
createProductCreate a product. Returns the new product_id.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
name | string | Yes | Product name. Required. A product with the same name is rejected. | |
quantity | decimal (up to 2 decimal places) | No | Quantity held for the product. | |
unitcost | decimal (up to 2 decimal places) | No | Price per unit. The element name is unitcost, without an underscore. | |
description | string | No | Description. |
<?xml version="1.0" encoding="utf-8"?>
<request method="createProduct">
<name>[NAME]</name>
<quantity>2</quantity>
<unitcost>25.00</unitcost>
<description>[DESCRIPTION]</description>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<product_id>[PRODUCT_ID]</product_id>
</response>| Path | Description |
|---|---|
product_id | Identifier of the new product. |
| Status | Message | When |
|---|---|---|
400 | Quantity is invalid. | |
400 | Unit cost is invalid. | |
400 | Product- [name] already exists. | A product with this name exists. |
400 | Please provide valid data. |
updateProductChange an existing product.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
product_id | integer (Invoicera identifier) | Yes | Product identifier returned by createProduct or listProduct. | |
name | string | No | Product name. | |
quantity | decimal (up to 2 decimal places) | No | Quantity held for the product. | |
unitcost | decimal (up to 2 decimal places) | No | Price per unit. The element name is unitcost, without an underscore. | |
description | string | No | Description. |
<?xml version="1.0" encoding="utf-8"?>
<request method="updateProduct">
<product_id>[PRODUCT_ID]</product_id>
<name>[NAME]</name>
<quantity>2</quantity>
<unitcost>25.00</unitcost>
<description>[DESCRIPTION]</description>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Status | Message | When |
|---|---|---|
400 | Product id is invalid. | |
403 | Product is not associated with your account. |
deleteProductDelete one or more products.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
product_id | integer (Invoicera identifier) · repeatable | Yes | Product to delete. Repeat the element to delete more than one. |
<?xml version="1.0" encoding="utf-8"?>
<request method="deleteProduct">
<product_id>[PRODUCT_ID]</product_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Path | Description |
|---|---|
failure | Present only when some products could not be deleted. |
getProductReturn one product.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
product_id | integer (Invoicera identifier) | Yes | Product to return. One identifier per request. |
<?xml version="1.0" encoding="utf-8"?>
<request method="getProduct">
<product_id>[PRODUCT_ID]</product_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<product>
<product_id>[PRODUCT_ID]</product_id>
<product_name>[PRODUCT_NAME]</product_name>
<unit_cost>10.00</unit_cost>
<quantity>1</quantity>
<description>[DESCRIPTION]</description>
<date>2026-01-15 00:00:00</date>
<status>Active</status>
</product>
</response>| Path | Description |
|---|---|
product/product_id | Product identifier. |
product/product_name | Name. |
product/unit_cost | Price per unit. |
product/quantity | Quantity held. |
product/date | Date added. |
product/status | Active, Archive or Deleted. |
| Status | Message | When |
|---|---|---|
400 | Product id is invalid. |
listProductReturn a page of products.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
filter | element | No | Container for search and paging options. All are optional. | |
filter/product_id | integer (Invoicera identifier) | No | Return only this product. | |
filter/item_name | string | No | Return only items with this name. | |
filter/item_cost | decimal (up to 2 decimal places) | No | Return only items with this unit cost. | |
filter/item_status | string | No | Item status to return. See allowed values. Defaults to Active. |
|
filter/page | integer | No | Page to return. Defaults to 1. | |
filter/per_page_record | integer | No | Records per page, from 1 to 100. Defaults to 100. Values above 100 return 100. |
<?xml version="1.0" encoding="utf-8"?>
<request method="listProduct">
<filter>
<product_id></product_id>
<item_name></item_name>
<item_cost></item_cost>
<item_status></item_status>
<page>1</page>
<per_page_record>25</per_page_record>
</filter>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<products page="1" per_page_record="100" total_pages="1" total_records="1">
<product>
<!-- one product record -->
</product>
</products>
</response>| Path | Description |
|---|---|
products/product | One entry per product. |
| Status | Message | When |
|---|---|---|
400 | Per page record is invalid. | per_page_record is not a whole number of 1 or more. |
400 | Page is invalid. | page is not a whole number of 1 or more. |
404 | Data not found. Kindly check the request. | No record matches the filter. |
createServiceCreate a service. Returns the new service_id.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
name | string | Yes | Service name. Required. A service with the same name is rejected. | |
cost | decimal (up to 2 decimal places) | No | Price per unit of the service. | |
unit | string | No | Unit the service is charged in. See allowed values. |
|
description | string | No | Description. |
<?xml version="1.0" encoding="utf-8"?>
<request method="createService">
<name>[NAME]</name>
<cost>40.00</cost>
<unit>Hour</unit>
<description>[DESCRIPTION]</description>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<service_id>[SERVICE_ID]</service_id>
</response>| Path | Description |
|---|---|
service_id | Identifier of the new service. |
| Status | Message | When |
|---|---|---|
400 | Cost is invalid. | |
400 | Unit is invalid. | unit is not one of the allowed values. |
400 | Service- [name] already exists. | |
400 | Please provide valid data. |
updateServiceChange an existing service.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
service_id | integer (Invoicera identifier) | Yes | Service identifier returned by createService or listService. | |
name | string | No | Service name. | |
cost | decimal (up to 2 decimal places) | No | Price per unit of the service. | |
unit | string | No | Unit the service is charged in. See allowed values. |
|
description | string | No | Description. |
<?xml version="1.0" encoding="utf-8"?>
<request method="updateService">
<service_id>[SERVICE_ID]</service_id>
<name>[NAME]</name>
<cost>40.00</cost>
<unit>Hour</unit>
<description>[DESCRIPTION]</description>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Status | Message | When |
|---|---|---|
400 | Service id is invalid. | |
400 | Unit is invalid. | |
403 | Service is not associated with your account. |
deleteServiceDelete one or more services.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
service_id | integer (Invoicera identifier) · repeatable | Yes | Service to delete. Repeat the element to delete more than one. |
<?xml version="1.0" encoding="utf-8"?>
<request method="deleteService">
<service_id>[SERVICE_ID]</service_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Path | Description |
|---|---|
failure | Present only when some services could not be deleted. |
getServiceReturn one service.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
service_id | integer (Invoicera identifier) | Yes | Service to return. One identifier per request. |
<?xml version="1.0" encoding="utf-8"?>
<request method="getService">
<service_id>[SERVICE_ID]</service_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<service>
<service_id>[SERVICE_ID]</service_id>
<service_name>[SERVICE_NAME]</service_name>
<unit_cost>50.00</unit_cost>
<quantity>Hour</quantity>
<description>[DESCRIPTION]</description>
<date>2026-01-15 00:00:00</date>
<status>Active</status>
</service>
</response>| Path | Description |
|---|---|
service/service_id | Service identifier. |
service/service_name | Name. |
service/unit_cost | Price per unit. |
service/quantity | The unit the service is charged in (for example Hour). The element is named quantity. |
service/status | Active, Archive or Deleted. |
| Status | Message | When |
|---|---|---|
400 | Service id is invalid. |
listServiceReturn a page of services.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
filter | element | No | Container for search and paging options. All are optional. | |
filter/service_id | integer (Invoicera identifier) | No | Return only this service. | |
filter/item_name | string | No | Return only items with this name. | |
filter/item_cost | decimal (up to 2 decimal places) | No | Return only items with this unit cost. | |
filter/item_status | string | No | Item status to return. See allowed values. Defaults to Active. |
|
filter/page | integer | No | Page to return. Defaults to 1. | |
filter/per_page_record | integer | No | Records per page, from 1 to 100. Defaults to 100. Values above 100 return 100. |
<?xml version="1.0" encoding="utf-8"?>
<request method="listService">
<filter>
<service_id></service_id>
<item_name></item_name>
<item_cost></item_cost>
<item_status></item_status>
<page>1</page>
<per_page_record>25</per_page_record>
</filter>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<services page="1" per_page_record="100" total_pages="1" total_records="1">
<service>
<!-- one service record -->
</service>
</services>
</response>| Path | Description |
|---|---|
services/service | One entry per service. |
| Status | Message | When |
|---|---|---|
400 | Per page record is invalid. | per_page_record is not a whole number of 1 or more. |
400 | Page is invalid. | page is not a whole number of 1 or more. |
404 | Data not found. Kindly check the request. | No record matches the filter. |
9 methods
createExpenseRecord an expense. Returns the new expense_id.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
project_id | integer (Invoicera identifier) | No | Project to link the expense to, if any. | |
client_id | integer (Invoicera identifier) | No | Client to link the expense to, if any. | |
expense_category_id | integer (Invoicera identifier) | Yes | Expense category identifier. Get it from listExpenseCategory. | |
amount | decimal (up to 2 decimal places) | Yes | Expense amount. Must be greater than zero. | |
vendor | string | No | Supplier or vendor name. | |
date | date (YYYY-MM-DD) | Yes | Expense date. Required. | |
tax1 | integer (Invoicera identifier) | No | Identifier of the first tax to apply. Get it from listTax. | |
tax2 | integer (Invoicera identifier) | No | Identifier of the second tax to apply. Get it from listTax. | |
notes | string | No | Notes stored with the expense. | |
recurring_frequency | integer | No | Whole number. A value makes the expense recurring. Send the element empty for a one-off expense. | |
recurring_end_date | date (YYYY-MM-DD) | No | Date the recurring expense stops. |
<?xml version="1.0" encoding="utf-8"?>
<request method="createExpense">
<project_id>[PROJECT_ID]</project_id>
<client_id>[CLIENT_ID]</client_id>
<expense_category_id>[CATEGORY_ID]</expense_category_id>
<amount>10.00</amount>
<vendor>[VENDOR_NAME]</vendor>
<date>2026-01-15</date>
<tax1>[TAX_ID]</tax1>
<tax2></tax2>
<notes>[NOTES]</notes>
<recurring_frequency></recurring_frequency>
<recurring_end_date></recurring_end_date>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<expense_id>[EXPENSE_ID]</expense_id>
</response>| Path | Description |
|---|---|
expense_id | Identifier of the new expense. |
| Status | Message | When |
|---|---|---|
400 | Expense category id is invalid. | |
400 | Amount is invalid. | amount is missing, zero or negative. |
400 | Date is invalid. | |
400 | Tax-1 id is invalid. | |
400 | Tax-2 id is invalid. | |
400 | Recurring frequency is invalid. | |
400 | Recurring end date is invalid. | |
400 | Project id is invalid. | |
400 | Client id is invalid. |
updateExpenseChange an existing expense.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
expense_id | integer (Invoicera identifier) | Yes | Expense identifier returned by createExpense or listExpense. | |
project_id | integer (Invoicera identifier) | No | Project to link the expense to, if any. | |
client_id | integer (Invoicera identifier) | No | Client to link the expense to, if any. | |
expense_category_id | integer (Invoicera identifier) | No | Expense category identifier. Get it from listExpenseCategory. | |
amount | decimal (up to 2 decimal places) | No | Expense amount. Must be greater than zero. | |
vendor | string | No | Supplier or vendor name. | |
date | date (YYYY-MM-DD) | No | Expense date. | |
tax1 | integer (Invoicera identifier) | No | Identifier of the first tax to apply. Get it from listTax. | |
tax2 | integer (Invoicera identifier) | No | Identifier of the second tax to apply. Get it from listTax. | |
notes | string | No | Notes stored with the expense. | |
recurring_frequency | integer | No | Whole number. A value makes the expense recurring. Send the element empty for a one-off expense. | |
recurring_end_date | date (YYYY-MM-DD) | No | Date the recurring expense stops. |
<?xml version="1.0" encoding="utf-8"?>
<request method="updateExpense">
<expense_id>[EXPENSE_ID]</expense_id>
<project_id>[PROJECT_ID]</project_id>
<client_id>[CLIENT_ID]</client_id>
<expense_category_id>[CATEGORY_ID]</expense_category_id>
<amount>10.00</amount>
<vendor>[VENDOR_NAME]</vendor>
<date>2026-01-15</date>
<tax1>[TAX_ID]</tax1>
<tax2></tax2>
<notes>[NOTES]</notes>
<recurring_frequency></recurring_frequency>
<recurring_end_date></recurring_end_date>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
[EXPENSE_ID]
</response>| Path | Description |
|---|---|
(text) | The expense identifier, returned as plain text. |
| Status | Message | When |
|---|---|---|
400 | Expense id is invalid. | |
403 | Expense is not associated with your account. |
deleteExpenseDelete one or more expenses.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
expense_id | integer (Invoicera identifier) · repeatable | Yes | Expense to delete. Repeat the element to delete more than one. |
<?xml version="1.0" encoding="utf-8"?>
<request method="deleteExpense">
<expense_id>[EXPENSE_ID]</expense_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Path | Description |
|---|---|
failure | Present only when some expenses could not be deleted. |
getExpenseReturn one expense.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
expense_id | integer (Invoicera identifier) | Yes | Expense to return. One identifier per request. |
<?xml version="1.0" encoding="utf-8"?>
<request method="getExpense">
<expense_id>[EXPENSE_ID]</expense_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<expense>
<expense_id>[EXPENSE_ID]</expense_id>
<client_id>[CLIENT_ID]</client_id>
<project_id>[PROJECT_ID]</project_id>
<expense_category_id>[CATEGORY_ID]</expense_category_id>
<vendor>[VENDOR_NAME]</vendor>
<date>2026-01-15 00:00:00</date>
<amount>70.00</amount>
<notes></notes>
<tax1>[TAX_ID]</tax1>
<tax2></tax2>
<is_expense_recurring>0</is_expense_recurring>
<recurring_frequency></recurring_frequency>
<recurring_end_date></recurring_end_date>
<status>Active</status>
</expense>
</response>| Path | Description |
|---|---|
expense/expense_id | Expense identifier. |
expense/amount | Amount. |
expense/tax1 | First tax identifier. |
expense/is_expense_recurring | 1 if recurring, 0 if not. |
expense/status | Active, Archived or Deleted. |
listExpenseReturn a page of expenses.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
filter | element | No | Container for search and paging options. All are optional. | |
filter/client_id | integer (Invoicera identifier) | No | Return only records for this client. | |
filter/expense_category_id | integer (Invoicera identifier) | No | Return only expenses in this category. | |
filter/amount | decimal (up to 2 decimal places) | No | Return only expenses with this amount. | |
filter/status | string | No | Status to return. See allowed values. Defaults to Active. |
|
filter/is_expense_invoiced | string | No | Yes for expenses already on an invoice, No for the rest. |
|
filter/page | integer | No | Page to return. Defaults to 1. | |
filter/per_page_record | integer | No | Records per page, from 1 to 100. Defaults to 100. Values above 100 return 100. |
<?xml version="1.0" encoding="utf-8"?>
<request method="listExpense">
<filter>
<client_id></client_id>
<expense_category_id></expense_category_id>
<amount></amount>
<status></status>
<is_expense_invoiced></is_expense_invoiced>
<page>1</page>
<per_page_record>25</per_page_record>
</filter>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<expenses page="1" per_page_record="100" total_pages="1" total_records="1">
<expense>
<!-- one expense record -->
</expense>
</expenses>
</response>| Path | Description |
|---|---|
expenses/expense | One entry per expense. |
| Status | Message | When |
|---|---|---|
400 | Per page record is invalid. | per_page_record is not a whole number of 1 or more. |
400 | Page is invalid. | page is not a whole number of 1 or more. |
404 | Data not found. Kindly check the request. | No record matches the filter. |
createExpenseCategoryCreate an expense category. Returns the new category_id.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
name | string | Yes | Category name. |
<?xml version="1.0" encoding="utf-8"?>
<request method="createExpenseCategory">
<name>[NAME]</name>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<category_id>[CATEGORY_ID]</category_id>
</response>| Path | Description |
|---|---|
category_id | Identifier of the new category. |
updateExpenseCategoryRename an expense category.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
category_id | integer (Invoicera identifier) | Yes | Expense category identifier returned by createExpenseCategory or listExpenseCategory. | |
name | string | Yes | New category name. |
<?xml version="1.0" encoding="utf-8"?>
<request method="updateExpenseCategory">
<category_id>[CATEGORY_ID]</category_id>
<name>[NAME]</name>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>deleteExpenseCategoryDelete one or more expense categories.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
category_id | integer (Invoicera identifier) · repeatable | Yes | Category to delete. Repeat the element to delete more than one. |
<?xml version="1.0" encoding="utf-8"?>
<request method="deleteExpenseCategory">
<category_id>[CATEGORY_ID]</category_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Path | Description |
|---|---|
failure | Present only when some categories could not be deleted. |
listExpenseCategoryReturn a page of expense categories.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
filter | element | No | Container for search and paging options. All are optional. | |
filter/status | string | No | Status to return. See allowed values. Defaults to Active. |
|
filter/page | integer | No | Page to return. Defaults to 1. | |
filter/per_page_record | integer | No | Records per page, from 1 to 100. Defaults to 100. Values above 100 return 100. |
<?xml version="1.0" encoding="utf-8"?>
<request method="listExpenseCategory">
<filter>
<status></status>
<page>1</page>
<per_page_record>25</per_page_record>
</filter>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<categories page="1" per_page_record="100" total_pages="1" total="1">
<category>
<category_id>[CATEGORY_ID]</category_id>
<name>[CATEGORY_NAME]</name>
<status>Active</status>
<date_added>2026-01-15 00:00:00</date_added>
</category>
</categories>
</response>| Path | Description |
|---|---|
categories/category | One entry per category. |
| Status | Message | When |
|---|---|---|
400 | Per page record is invalid. | per_page_record is not a whole number of 1 or more. |
400 | Page is invalid. | page is not a whole number of 1 or more. |
404 | Data not found. Kindly check the request. | No record matches the filter. |
5 methods
createProjectCreate a project and optionally link tasks to it. Returns the new project_id.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
name | string | Yes | Project name. Required. | |
client_id | integer (Invoicera identifier) | No | Client the project belongs to. | |
project_manager_id | integer (Invoicera identifier) | No | Staff identifier of the project manager. | |
description | string | No | Project description. | |
billing_method | string | Yes | How the project is billed. See allowed values. |
|
budget | decimal (up to 2 decimal places) | No | Project budget. Needed when billing_method is flat or project. | |
tasks | element | No | Container for tasks to link to the project. Repeat <task_id> for each task. | |
tasks/task_id | integer (Invoicera identifier) · repeatable | No | Identifier of a task to link. |
<?xml version="1.0" encoding="utf-8"?>
<request method="createProject">
<name>[NAME]</name>
<client_id>[CLIENT_ID]</client_id>
<project_manager_id>[STAFF_ID]</project_manager_id>
<description>[DESCRIPTION]</description>
<billing_method>flat</billing_method>
<budget>500.00</budget>
<tasks>
<task_id>[TASK_ID]</task_id>
</tasks>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<project_id>[PROJECT_ID]</project_id>
</response>| Path | Description |
|---|---|
project_id | Identifier of the new project. |
invalid/task_id | Task identifiers that could not be linked, if any. |
| Status | Message | When |
|---|---|---|
400 | Billing method is invalid. | |
400 | Amount is invalid. | budget is missing or invalid for a flat or project billing method. |
400 | Client id is invalid. | |
400 | Project manager id is invalid. | |
400 | Please provide valid data. | name is missing. |
updateProjectChange an existing project.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
project_id | integer (Invoicera identifier) | Yes | Project identifier returned by createProject or listProject. | |
name | string | No | Project name. | |
client_id | integer (Invoicera identifier) | No | Client the project belongs to. | |
project_manager_id | integer (Invoicera identifier) | No | Staff identifier of the project manager. | |
description | string | No | Description. | |
billing_method | string | No | How the project is billed. See allowed values. |
|
budget | decimal (up to 2 decimal places) | No | Project budget. Needed when billing_method is flat or project. | |
tasks | element | No | Container for tasks to link to the project. Repeat <task_id> for each task. | |
tasks/task_id | integer (Invoicera identifier) · repeatable | No | Identifier of a task to link. |
<?xml version="1.0" encoding="utf-8"?>
<request method="updateProject">
<project_id>[PROJECT_ID]</project_id>
<name>[NAME]</name>
<client_id>[CLIENT_ID]</client_id>
<project_manager_id>[STAFF_ID]</project_manager_id>
<description>[DESCRIPTION]</description>
<billing_method>flat</billing_method>
<budget>500.00</budget>
<tasks>
<task_id>[TASK_ID]</task_id>
</tasks>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<project_id>[PROJECT_ID]</project_id>
</response>| Path | Description |
|---|---|
project_id | Identifier of the updated project. |
| Status | Message | When |
|---|---|---|
400 | Billing method is invalid. | |
403 | Project is not associated with your account. |
deleteProjectDelete one or more projects.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
project_id | integer (Invoicera identifier) · repeatable | Yes | Project to delete. Repeat the element to delete more than one. |
<?xml version="1.0" encoding="utf-8"?>
<request method="deleteProject">
<project_id>[PROJECT_ID]</project_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Path | Description |
|---|---|
failure | Present only when some projects could not be deleted. |
getProjectReturn one project with its staff and tasks.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
project_id | integer (Invoicera identifier) | Yes | Project to return. One identifier per request. |
<?xml version="1.0" encoding="utf-8"?>
<request method="getProject">
<project_id>[PROJECT_ID]</project_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<project>
<project_id>[PROJECT_ID]</project_id>
<client_id>[CLIENT_ID]</client_id>
<project_manager_id>[STAFF_ID]</project_manager_id>
<project_name>[PROJECT_NAME]</project_name>
<project_description>[DESCRIPTION]</project_description>
<project_rate>0</project_rate>
<billing_method>flat</billing_method>
<project_billed>No</project_billed>
<created_date>2026-01-15 00:00:00</created_date>
<status>Active</status>
<staff>
<staff_id>[STAFF_ID]</staff_id>
</staff>
<task>
<task_id>[TASK_ID]</task_id>
</task>
</project>
</response>| Path | Description |
|---|---|
project/project_id | Project identifier. |
project/billing_method | Billing method. |
project/project_billed | Yes or No. |
project/staff/staff_id | Staff on the project. |
project/task/task_id | Tasks on the project. |
| Status | Message | When |
|---|---|---|
400 | Project id is invalid. |
listProjectReturn a page of projects.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
filter | element | No | Container for search and paging options. All are optional. | |
filter/client_id | integer (Invoicera identifier) | No | Return only records for this client. | |
filter/task_id | integer (Invoicera identifier) | No | Return only records for this task. | |
filter/project_name | string | No | Return only projects with this name. | |
filter/project_status | string | No | Project status to return. | |
filter/page | integer | No | Page to return. Defaults to 1. | |
filter/per_page_record | integer | No | Records per page, from 1 to 100. Defaults to 100. Values above 100 return 100. |
<?xml version="1.0" encoding="utf-8"?>
<request method="listProject">
<filter>
<client_id></client_id>
<task_id></task_id>
<project_name></project_name>
<project_status></project_status>
<page>1</page>
<per_page_record>25</per_page_record>
</filter>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<projects page="1" per_page_record="100" total_pages="1" total_records="1">
<project>
<!-- one project record -->
</project>
</projects>
</response>| Path | Description |
|---|---|
projects/project | One entry per project. |
| Status | Message | When |
|---|---|---|
400 | Per page record is invalid. | per_page_record is not a whole number of 1 or more. |
400 | Page is invalid. | page is not a whole number of 1 or more. |
404 | Data not found. Kindly check the request. | No record matches the filter. |
5 methods
createTaskCreate a task and optionally link it to projects. Returns the new task_id.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
name | string | Yes | Task name. Required. | |
description | string | No | Description. | |
task_billable | string | No | Y if time on the task is billable, N if not. Defaults to N. |
|
task_rate | decimal (up to 2 decimal places) | No | Hourly rate for the task. | |
projects | element | No | Container for projects to link to the task. Repeat <project_id> for each project. | |
projects/project_id | integer (Invoicera identifier) · repeatable | No | Identifier of a project to link. |
<?xml version="1.0" encoding="utf-8"?>
<request method="createTask">
<name>[NAME]</name>
<description>[DESCRIPTION]</description>
<task_billable>Y</task_billable>
<task_rate>30.00</task_rate>
<projects>
<project_id>[PROJECT_ID]</project_id>
</projects>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<task_id>[TASK_ID]</task_id>
</response>| Path | Description |
|---|---|
task_id | Identifier of the new task. |
| Status | Message | When |
|---|---|---|
400 | Task rate is invalid. | |
400 | Please provide valid data. | name is missing. |
updateTaskChange an existing task.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
task_id | integer (Invoicera identifier) | Yes | Task identifier returned by createTask or listTask. | |
name | string | No | Task name. | |
description | string | No | Description. | |
task_billable | string | No | Y if time on the task is billable, N if not. Defaults to N. |
|
task_rate | decimal (up to 2 decimal places) | No | Hourly rate for the task. | |
projects | element | No | Container for projects to link to the task. Repeat <project_id> for each project. | |
projects/project_id | integer (Invoicera identifier) · repeatable | No | Identifier of a project to link. |
<?xml version="1.0" encoding="utf-8"?>
<request method="updateTask">
<task_id>[TASK_ID]</task_id>
<name>[NAME]</name>
<description>[DESCRIPTION]</description>
<task_billable>Y</task_billable>
<task_rate>30.00</task_rate>
<projects>
<project_id>[PROJECT_ID]</project_id>
</projects>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Status | Message | When |
|---|---|---|
400 | Task rate is invalid. | |
403 | Task is not associated with your account. |
deleteTaskDelete one or more tasks.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
task_id | integer (Invoicera identifier) · repeatable | Yes | Task to delete. Repeat the element to delete more than one. |
<?xml version="1.0" encoding="utf-8"?>
<request method="deleteTask">
<task_id>[TASK_ID]</task_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Path | Description |
|---|---|
failure | Present only when some tasks could not be deleted. |
getTaskReturn one task with its projects.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
task_id | integer (Invoicera identifier) | Yes | Task to return. One identifier per request. |
<?xml version="1.0" encoding="utf-8"?>
<request method="getTask">
<task_id>[TASK_ID]</task_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<task>
<task_id>[TASK_ID]</task_id>
<task_name>[TASK_NAME]</task_name>
<task_description>[DESCRIPTION]</task_description>
<task_billable>Y</task_billable>
<task_rate>5.00</task_rate>
<created_date>2026-01-15 00:00:00</created_date>
<status>Active</status>
<project>
<project_id>[PROJECT_ID]</project_id>
</project>
</task>
</response>| Path | Description |
|---|---|
task/task_id | Task identifier. |
task/task_billable | Y or N. |
task/task_rate | Hourly rate. |
task/project/project_id | Projects the task is linked to. |
listTaskReturn a page of tasks.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
filter | element | No | Container for search and paging options. All are optional. | |
filter/project_id | integer (Invoicera identifier) | No | Return only records for this project. | |
filter/task_name | string | No | Return only tasks with this name. | |
filter/task_billable | string | No | Y for billable tasks, N for the rest. |
|
filter/task_status | string | No | Task status to return. See allowed values. Defaults to Active. |
|
filter/page | integer | No | Page to return. Defaults to 1. | |
filter/per_page_record | integer | No | Records per page, from 1 to 100. Defaults to 100. Values above 100 return 100. |
<?xml version="1.0" encoding="utf-8"?>
<request method="listTask">
<filter>
<project_id></project_id>
<task_name></task_name>
<task_billable></task_billable>
<task_status></task_status>
<page>1</page>
<per_page_record>25</per_page_record>
</filter>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<tasks page="1" per_page_record="100" total_pages="1" total_records="1">
<task>
<!-- one task record -->
</task>
</tasks>
</response>| Path | Description |
|---|---|
tasks/task | One entry per task. |
| Status | Message | When |
|---|---|---|
400 | Per page record is invalid. | per_page_record is not a whole number of 1 or more. |
400 | Page is invalid. | page is not a whole number of 1 or more. |
404 | Data not found. Kindly check the request. | No record matches the filter. |
5 methods
createTimeLogRecord time worked on a project task. Returns the new timelog_id.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
project_id | integer (Invoicera identifier) | Yes | Project the time belongs to. Required. | |
task_id | integer (Invoicera identifier) | Yes | Task the time belongs to. Required. The task must be linked to the project. | |
work_date | date (YYYY-MM-DD) | Yes | Date the work was done. | |
hours_worked | decimal (up to 2 decimal places) | Yes | Hours worked. Must be greater than zero. | |
notes | string | No | Notes stored with the time entry. | |
billed | string | No | Yes if the time has already been billed. Defaults to No. |
|
<?xml version="1.0" encoding="utf-8"?>
<request method="createTimeLog">
<project_id>[PROJECT_ID]</project_id>
<task_id>[TASK_ID]</task_id>
<work_date>2026-01-15</work_date>
<hours_worked>2.5</hours_worked>
<notes>[NOTES]</notes>
<billed>No</billed>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<timelog_id>[TIMELOG_ID]</timelog_id>
</response>| Path | Description |
|---|---|
timelog_id | Identifier of the new time entry. |
| Status | Message | When |
|---|---|---|
400 | Project id is invalid. | |
400 | Task id is invalid. | |
400 | Work date is invalid. | |
400 | Hours is invalid. | hours_worked is zero, negative or not a number. |
400 | Task is not associated with provided project. | |
400 | Please provide valid data. | A required field is missing. |
updateTimeLogChange an existing time entry.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
timelog_id | integer (Invoicera identifier) | Yes | Time entry identifier returned by createTimeLog or listTimeLog. | |
project_id | integer (Invoicera identifier) | No | Project the time belongs to. | |
task_id | integer (Invoicera identifier) | No | Task the time belongs to. The task must be linked to the project. | |
work_date | date (YYYY-MM-DD) | No | Date the work was done. | |
hours_worked | decimal (up to 2 decimal places) | No | Hours worked. Must be greater than zero. | |
notes | string | No | Notes stored with the time entry. | |
billed | string | No | Yes if the time has already been billed. Defaults to No. |
|
<?xml version="1.0" encoding="utf-8"?>
<request method="updateTimeLog">
<timelog_id>[TIMELOG_ID]</timelog_id>
<project_id>[PROJECT_ID]</project_id>
<task_id>[TASK_ID]</task_id>
<work_date>2026-01-15</work_date>
<hours_worked>2.5</hours_worked>
<notes>[NOTES]</notes>
<billed>No</billed>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Status | Message | When |
|---|---|---|
400 | Hours is invalid. | |
403 | Timelog is not associated with your account. |
deleteTimeLogDelete one or more time entries.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
timelog_id | integer (Invoicera identifier) · repeatable | Yes | Time entry to delete. Repeat the element to delete more than one. |
<?xml version="1.0" encoding="utf-8"?>
<request method="deleteTimeLog">
<timelog_id>[TIMELOG_ID]</timelog_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Path | Description |
|---|---|
failure | Present only when some entries could not be deleted. |
getTimeLogReturn one time entry.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
timelog_id | integer (Invoicera identifier) | Yes | Time entry to return. One identifier per request. |
<?xml version="1.0" encoding="utf-8"?>
<request method="getTimeLog">
<timelog_id>[TIMELOG_ID]</timelog_id>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<timelog>
<project_id>[PROJECT_ID]</project_id>
<task_id>[TASK_ID]</task_id>
<work_date>2026-01-15</work_date>
<hours_worked>4.00</hours_worked>
<notes></notes>
<log_status>Active</log_status>
</timelog>
</response>| Path | Description |
|---|---|
timelog/work_date | Date worked. |
timelog/hours_worked | Hours. |
timelog/log_status | Entry status. |
listTimeLogReturn a page of time entries.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
filter | element | No | Container for search and paging options. All are optional. | |
filter/project_id | integer (Invoicera identifier) | No | Return only records for this project. | |
filter/task_id | integer (Invoicera identifier) | No | Return only records for this task. | |
filter/work_date | date (YYYY-MM-DD) | No | Return only time entries for this date. | |
filter/billed | string | No | Filter time entries by billed state (Yes or No). |
|
filter/page | integer | No | Page to return. Defaults to 1. | |
filter/per_page_record | integer | No | Records per page, from 1 to 100. Defaults to 100. Values above 100 return 100. |
<?xml version="1.0" encoding="utf-8"?>
<request method="listTimeLog">
<filter>
<project_id></project_id>
<task_id></task_id>
<work_date></work_date>
<billed></billed>
<page>1</page>
<per_page_record>25</per_page_record>
</filter>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<timelogs page="1" per_page_record="100" total_pages="1" total_records="1">
<timelog>
<timelog_id>[TIMELOG_ID]</timelog_id>
<project_id>[PROJECT_ID]</project_id>
<task_id>[TASK_ID]</task_id>
<work_date>2026-01-15</work_date>
<hours_worked>4.00</hours_worked>
<notes></notes>
<log_status>Active</log_status>
</timelog>
</timelogs>
</response>| Path | Description |
|---|---|
timelogs/timelog | One entry per time entry. |
| Status | Message | When |
|---|---|---|
400 | Per page record is invalid. | per_page_record is not a whole number of 1 or more. |
400 | Page is invalid. | page is not a whole number of 1 or more. |
404 | Data not found. Kindly check the request. | No record matches the filter. |
8 methods
getAccountInfoReturn your account company name, owner name, country and currency. A safe first call to test your token.
This method takes no request fields. Send the root element on its own.
<?xml version="1.0" encoding="utf-8"?>
<request method="getAccountInfo">
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<account>
<company>[COMPANY_NAME]</company>
<name>[ACCOUNT_OWNER_NAME]</name>
<country_code>USA</country_code>
<currency_code>USD</currency_code>
</account>
</response>| Path | Description |
|---|---|
account/company | Company name. |
account/name | Account owner name. |
account/country_code | Account country code. |
account/currency_code | Base currency code. |
| Status | Message | When |
|---|---|---|
404 | Data not found. |
createInvoiceFromTimeTrackingCreate an invoice that bills unbilled time entries, plus any extra lines. Returns the new invoice_id.
Not on the old API help pages. Documented from the request template and XML processor in the Invoicera application.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
client | element | No | Container for the client being billed. | |
client/client_id | integer (Invoicera identifier) | Yes | Identifier of an existing client in your account. Use the client_id returned by createClient or listClient. | |
client/address | string | No | Client address to print on the document. If left out, no address is copied to the document. | |
invoice_title | string | No | Title shown on the invoice. | |
number | string | No | Document number shown on the invoice. If left out, or if the number is already in use, Invoicera assigns the next number in your sequence. | |
date | date (YYYY-MM-DD) | No | Document date. Defaults to today when left out. | |
due_date | date (YYYY-MM-DD) | No | Date payment is due. | |
schedule_date | date (YYYY-MM-DD) | No | Date the document is scheduled for. | |
po_number | string | No | Purchase order or reference number shown on the document. | |
status | string | No | Invoice status. Any other value, or no value, saves the invoice as a draft. |
|
notes | string | No | Notes shown on the document. | |
terms | string | No | Terms shown on the document, such as payment terms. | |
time_entries | element | No | Container for the time entries to bill. Repeat <time_entry> for each entry. | |
time_entries/time_entry | element · repeatable | No | One time entry to add as a line. | |
time_entries/time_entry/id | integer (Invoicera identifier) | Yes | Time entry identifier (timelog_id). The entry must not already be billed. | |
time_entries/time_entry/name | string | No | Line item name. | |
time_entries/time_entry/type | string | Yes | Line type. Use Time. If you leave the element out, the line is rejected. |
|
time_entries/time_entry/description | string | No | Line item description. | |
time_entries/time_entry/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
time_entries/time_entry/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
time_entries/time_entry/discount | decimal (up to 2 decimal places) | No | Discount on the line. Read as a percentage or a fixed amount, depending on discount_type. | |
time_entries/time_entry/discount_type | string | Yes | How discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent. |
|
time_entries/time_entry/tax1_name | string | No | Name of the first tax on the line, for example VAT. | |
time_entries/time_entry/tax1_percent | decimal (up to 2 decimal places) | No | Rate of the first tax, as a percentage. | |
time_entries/time_entry/tax1_type | string | No | Type of the first tax. Only Normal is accepted. Defaults to Normal. | |
time_entries/time_entry/tax2_name | string | No | Name of the second tax on the line. | |
time_entries/time_entry/tax2_percent | decimal (up to 2 decimal places) | No | Rate of the second tax, as a percentage. | |
time_entries/time_entry/tax2_type | string | No | Type of the second tax: Normal or Compound. Compound applies the second tax on top of the first. Defaults to Normal. | |
items | element | No | Container for one or more line items. Repeat <item> for each line. | |
items/item | element · repeatable | No | One line item. | |
items/item/name | string | Yes | Line item name. Required on every line. | |
items/item/type | string | Yes | Line item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected. |
|
items/item/description | string | No | Line item description. | |
items/item/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
items/item/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
items/item/discount | decimal (up to 2 decimal places) | No | Discount on the line. Read as a percentage or a fixed amount, depending on discount_type. | |
items/item/discount_type | string | Yes | How discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent. |
|
items/item/tax1_name | string | No | Name of the first tax on the line, for example VAT. | |
items/item/tax1_percent | decimal (up to 2 decimal places) | No | Rate of the first tax, as a percentage. | |
items/item/tax1_type | string | No | Type of the first tax. Only Normal is accepted. Defaults to Normal. |
|
items/item/tax2_name | string | No | Name of the second tax on the line. | |
items/item/tax2_percent | decimal (up to 2 decimal places) | No | Rate of the second tax, as a percentage. | |
items/item/tax2_type | string | No | Type of the second tax: Normal or Compound. Compound applies the second tax on top of the first. Defaults to Normal. |
|
additional_charges | element | No | Container for one or more extra charges, such as shipping. | |
additional_charges/additional_charge | element · repeatable | No | One extra charge. | |
additional_charges/additional_charge/name | string | No | Name of the charge, for example Shipping. | |
additional_charges/additional_charge/type | string | No | How amount is applied: Percent or Fixed. Defaults to Percent. |
|
additional_charges/additional_charge/amount | decimal (up to 2 decimal places) | No | Charge value, read as a percentage or a fixed amount depending on type. |
<?xml version="1.0" encoding="utf-8"?>
<request method="createInvoiceFromTimeTracking">
<client>
<client_id>[CLIENT_ID]</client_id>
<address>[ADDRESS]</address>
</client>
<invoice_title>[INVOICE_TITLE]</invoice_title>
<number></number>
<date>2026-01-15</date>
<due_date>2026-02-14</due_date>
<schedule_date></schedule_date>
<po_number>[PO_NUMBER]</po_number>
<status>draft</status>
<notes>[NOTES]</notes>
<terms>[TERMS]</terms>
<time_entries>
<time_entry>
<id>[TIMELOG_ID]</id>
<name>[NAME]</name>
<type>Time</type>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
<tax1_name>[TAX_NAME]</tax1_name>
<tax1_percent>10</tax1_percent>
<tax1_type>Normal</tax1_type>
<tax2_name></tax2_name>
<tax2_percent></tax2_percent>
<tax2_type></tax2_type>
</time_entry>
</time_entries>
<items>
<item>
<name>[ITEM_NAME]</name>
<type>Service</type>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
<tax1_name>[TAX_NAME]</tax1_name>
<tax1_percent>10</tax1_percent>
<tax1_type>Normal</tax1_type>
<tax2_name></tax2_name>
<tax2_percent></tax2_percent>
<tax2_type></tax2_type>
</item>
</items>
<additional_charges>
<additional_charge>
<name>Shipping</name>
<type>Fixed</type>
<amount>10.00</amount>
</additional_charge>
</additional_charges>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<invoice_id>[INVOICE_ID]</invoice_id>
</response>| Path | Description |
|---|---|
invoice_id | Identifier of the new invoice. |
| Status | Message | When |
|---|---|---|
400 | Client id is not exists. | client_id does not belong to your account. |
400 | Date is invalid. | A date is not a real date in YYYY-MM-DD form. |
400 | Due Date is invalid. | due_date is not a valid date. |
400 | Schedule Date is invalid. | schedule_date is not a valid date. |
400 | Time-entry id is required. | |
400 | Time-entry id is not valid or already billed. |
createInvoiceFromExpenseCreate an invoice that bills unbilled expenses, plus any extra lines. Returns the new invoice_id.
Not on the old API help pages. Documented from the request template and XML processor in the Invoicera application.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
client | element | No | Container for the client being billed. | |
client/client_id | integer (Invoicera identifier) | Yes | Identifier of an existing client in your account. Use the client_id returned by createClient or listClient. | |
client/address | string | No | Client address to print on the document. If left out, no address is copied to the document. | |
invoice_title | string | No | Title shown on the invoice. | |
number | string | No | Document number shown on the invoice. If left out, or if the number is already in use, Invoicera assigns the next number in your sequence. | |
date | date (YYYY-MM-DD) | No | Document date. Defaults to today when left out. | |
due_date | date (YYYY-MM-DD) | No | Date payment is due. | |
late_fee | integer (Invoicera identifier) | No | Identifier of an active late-fee rule. Get it from listLateFee. Leave empty for no late fee. | |
schedule_date | date (YYYY-MM-DD) | No | Date the document is scheduled for. | |
po_number | string | No | Purchase order or reference number shown on the document. | |
status | string | No | Invoice status. Any other value, or no value, saves the invoice as a draft. |
|
notes | string | No | Notes shown on the document. | |
terms | string | No | Terms shown on the document, such as payment terms. | |
expenses | element | No | Container for the expenses to bill. Repeat <expense> for each expense. | |
expenses/expense | element · repeatable | No | One expense to add as a line. | |
expenses/expense/id | integer (Invoicera identifier) | Yes | Expense identifier (expense_id). The expense must not already be billed. | |
expenses/expense/name | string | No | Line item name. | |
expenses/expense/type | string | Yes | Line type. Use Expense. If you leave the element out, the line is rejected. |
|
expenses/expense/description | string | No | Line item description. | |
expenses/expense/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
expenses/expense/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
expenses/expense/discount | decimal (up to 2 decimal places) | No | Discount on the line. Read as a percentage or a fixed amount, depending on discount_type. | |
expenses/expense/discount_type | string | Yes | How discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent. |
|
expenses/expense/tax1_name | string | No | Name of the first tax on the line, for example VAT. | |
expenses/expense/tax2_name | string | No | Name of the second tax on the line. | |
expenses/expense/tax1_percent | decimal (up to 2 decimal places) | No | Rate of the first tax, as a percentage. | |
expenses/expense/tax2_percent | decimal (up to 2 decimal places) | No | Rate of the second tax, as a percentage. | |
items | element | No | Container for one or more line items. Repeat <item> for each line. | |
items/item | element · repeatable | No | One line item. | |
items/item/name | string | Yes | Line item name. Required on every line. | |
items/item/type | string | Yes | Line item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected. |
|
items/item/description | string | No | Line item description. | |
items/item/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
items/item/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
items/item/discount | decimal (up to 2 decimal places) | No | Discount on the line. Read as a percentage or a fixed amount, depending on discount_type. | |
items/item/discount_type | string | Yes | How discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent. |
|
additional_charges | element | No | Container for one or more extra charges, such as shipping. | |
additional_charges/additional_charge | element · repeatable | No | One extra charge. | |
additional_charges/additional_charge/name | string | No | Name of the charge, for example Shipping. | |
additional_charges/additional_charge/type | string | No | How amount is applied: Percent or Fixed. Defaults to Percent. |
|
additional_charges/additional_charge/amount | decimal (up to 2 decimal places) | No | Charge value, read as a percentage or a fixed amount depending on type. |
<?xml version="1.0" encoding="utf-8"?>
<request method="createInvoiceFromExpense">
<client>
<client_id>[CLIENT_ID]</client_id>
<address>[ADDRESS]</address>
</client>
<invoice_title>[INVOICE_TITLE]</invoice_title>
<number></number>
<date>2026-01-15</date>
<due_date>2026-02-14</due_date>
<late_fee></late_fee>
<schedule_date></schedule_date>
<po_number>[PO_NUMBER]</po_number>
<status>draft</status>
<notes>[NOTES]</notes>
<terms>[TERMS]</terms>
<expenses>
<expense>
<id>[EXPENSE_ID]</id>
<name>[NAME]</name>
<type>Expense</type>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
<tax1_name>[TAX_NAME]</tax1_name>
<tax2_name></tax2_name>
<tax1_percent>10</tax1_percent>
<tax2_percent></tax2_percent>
</expense>
</expenses>
<items>
<item>
<name>[ITEM_NAME]</name>
<type>Service</type>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
</item>
</items>
<additional_charges>
<additional_charge>
<name>Shipping</name>
<type>Fixed</type>
<amount>10.00</amount>
</additional_charge>
</additional_charges>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<invoice_id>[INVOICE_ID]</invoice_id>
</response>| Path | Description |
|---|---|
invoice_id | Identifier of the new invoice. |
| Status | Message | When |
|---|---|---|
400 | Client id is not exists. | client_id does not belong to your account. |
400 | Date is invalid. | A date is not a real date in YYYY-MM-DD form. |
400 | Due Date is invalid. | due_date is not a valid date. |
400 | Late Fee is invalid or inactive. | late_fee is not an active late-fee identifier. |
400 | Schedule Date is invalid. | schedule_date is not a valid date. |
400 | Expense id is required. | |
400 | Expense [ID] is not assigned to this client or not active or already invoiced. | An expense is not billable for this client. |
createInvoiceFromEstimateCreate an invoice from the fields you send. This method runs createInvoice: it takes no estimate identifier and does not read, copy or link an estimate.
Not on the old API help pages. Documented from the request template and XML processor in the Invoicera application.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
client | element | No | Container for the client being billed. | |
client/client_id | integer (Invoicera identifier) | Yes | Identifier of an existing client in your account. Use the client_id returned by createClient or listClient. | |
client/address | string | No | Client address to print on the document. If left out, no address is copied to the document. | |
invoice_title | string | No | Title shown on the invoice. | |
number | string | No | Document number shown on the invoice. If left out, or if the number is already in use, Invoicera assigns the next number in your sequence. | |
date | date (YYYY-MM-DD) | No | Document date. Defaults to today when left out. | |
due_date | date (YYYY-MM-DD) | No | Date payment is due. | |
schedule_date | date (YYYY-MM-DD) | No | Date the document is scheduled for. | |
po_number | string | No | Purchase order or reference number shown on the document. | |
status | string | No | Document status. See allowed values. |
|
notes | string | No | Notes shown on the document. | |
terms | string | No | Terms shown on the document, such as payment terms. | |
items | element | No | Container for one or more line items. Repeat <item> for each line. | |
items/item | element · repeatable | No | One line item. | |
items/item/name | string | Yes | Line item name. Required on every line. | |
items/item/type | string | Yes | Line item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected. |
|
items/item/description | string | No | Line item description. | |
items/item/unit_cost | decimal (up to 2 decimal places) | No | Price per unit. | |
items/item/quantity | decimal (up to 2 decimal places) | No | Number of units. Must not be negative. | |
items/item/discount | decimal (up to 2 decimal places) | No | Discount on the line. Read as a percentage or a fixed amount, depending on discount_type. | |
items/item/discount_type | string | No | How discount is applied: Percent or Fixed. An empty element is treated as Percent. |
|
additional_charges | element | No | Container for one or more extra charges, such as shipping. | |
additional_charges/additional_charge | element · repeatable | No | One extra charge. | |
additional_charges/additional_charge/name | string | No | Name of the charge, for example Shipping. | |
additional_charges/additional_charge/type | string | No | How amount is applied: Percent or Fixed. Defaults to Percent. |
|
additional_charges/additional_charge/amount | decimal (up to 2 decimal places) | No | Charge value, read as a percentage or a fixed amount depending on type. |
<?xml version="1.0" encoding="utf-8"?>
<request method="createInvoiceFromEstimate">
<client>
<client_id>[CLIENT_ID]</client_id>
<address>[ADDRESS]</address>
</client>
<invoice_title>[INVOICE_TITLE]</invoice_title>
<number></number>
<date>2026-01-15</date>
<due_date>2026-02-14</due_date>
<schedule_date></schedule_date>
<po_number>[PO_NUMBER]</po_number>
<status>draft</status>
<notes>[NOTES]</notes>
<terms>[TERMS]</terms>
<items>
<item>
<name>[ITEM_NAME]</name>
<type>Service</type>
<description>[DESCRIPTION]</description>
<unit_cost>100.00</unit_cost>
<quantity>2</quantity>
<discount></discount>
<discount_type>Percent</discount_type>
</item>
</items>
<additional_charges>
<additional_charge>
<name>Shipping</name>
<type>Fixed</type>
<amount>10.00</amount>
</additional_charge>
</additional_charges>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<invoice_id>[INVOICE_ID]</invoice_id>
</response>| Path | Description |
|---|---|
invoice_id | Identifier of the new invoice. |
| Status | Message | When |
|---|---|---|
400 | Client id is not exists. | client_id does not belong to your account. |
400 | Date is invalid. | A date is not a real date in YYYY-MM-DD form. |
400 | Due Date is invalid. | due_date is not a valid date. |
400 | Schedule Date is invalid. | schedule_date is not a valid date. |
400 | Name is required. | A line has no name. |
400 | Cost is invalid. | unit_cost is not a number with up to two decimal places. |
400 | Quantity is invalid. | quantity is negative or not a number. |
400 | Type is invalid. | type is not Product or Service, or the element is missing. |
400 | Discount type is invalid. | discount_type is not Percent or Fixed. |
invoiceOfflinePaymentRecord a payment received outside Invoicera, such as cash or cheque, against one or more invoices.
| Path | Type | Required | Description | Accepted values |
|---|---|---|---|---|
invoice | element · repeatable | No | One payment to record. Repeat <invoice> to record payments against more than one invoice. | |
invoice/id | integer (Invoicera identifier) | Yes | Identifier of the invoice being paid. Required. | |
invoice/amount | decimal (up to 2 decimal places) | Yes | Amount received. | |
invoice/method | string | Yes | Payment method name, for example Cash or Cheque. Use a name returned by listOfflinePaymentMethod. | |
invoice/date | date (YYYY-MM-DD) | No | Date the payment was received. | |
invoice/notes | string | No | Note stored with the payment. | |
invoice/client_notification | string | No | Set to 1 to email the client a payment notification. Any other value sends nothing. |
|
<?xml version="1.0" encoding="utf-8"?>
<request method="invoiceOfflinePayment">
<invoice>
<id>[INVOICE_ID]</id>
<amount>100.00</amount>
<method>[PAYMENT_METHOD]</method>
<date>2026-01-20</date>
<notes>[PAYMENT_NOTES]</notes>
<client_notification>0</client_notification>
</invoice>
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>| Status | Message | When |
|---|---|---|
400 | Invoice id is required. | invoice/id is missing. |
400 | Method is required. | invoice/method is missing. |
400 | Amount is invalid. | invoice/amount is not a valid amount. |
400 | Date is invalid. | invoice/date is not a valid date. |
listLateFeeReturn the active late-fee rules in your account. Use an id as late_fee on invoices.
Not on the old API help pages. Documented from the request template and XML processor in the Invoicera application.
This method takes no request fields. Send the root element on its own.
<?xml version="1.0" encoding="utf-8"?>
<request method="listLateFee">
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<late_fees total="1">
<late_fee>
<id>[LATE_FEE_ID]</id>
<name>[LATE_FEE_NAME]</name>
</late_fee>
</late_fees>
</response>| Path | Description |
|---|---|
late_fees@total | Number of rules. |
late_fees/late_fee/id | Late-fee identifier. |
late_fees/late_fee/name | Late-fee name. |
| Status | Message | When |
|---|---|---|
404 | Data not found. Kindly check the request. | No active late-fee rule exists. |
listTaxReturn the taxes set up in your account. Use an id as tax1 or tax2 on expenses.
Not on the old API help pages. Documented from the request template and XML processor in the Invoicera application.
This method takes no request fields. Send the root element on its own.
<?xml version="1.0" encoding="utf-8"?>
<request method="listTax">
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<taxes total="1">
<tax>
<id>[TAX_ID]</id>
<name>[TAX_NAME]</name>
<type>Normal</type>
<value>10.00</value>
</tax>
</taxes>
</response>| Path | Description |
|---|---|
taxes/tax/id | Tax identifier. |
taxes/tax/name | Tax name. |
taxes/tax/type | Tax type. |
taxes/tax/value | Tax rate as a percentage. |
| Status | Message | When |
|---|---|---|
404 | Data not found. Kindly check the request. | No tax is set up. |
listOfflinePaymentMethodReturn the offline payment method names you can use with invoiceOfflinePayment.
Not on the old API help pages. Documented from the request template and XML processor in the Invoicera application.
This method takes no request fields. Send the root element on its own.
<?xml version="1.0" encoding="utf-8"?>
<request method="listOfflinePaymentMethod">
</request><?xml version="1.0" encoding="utf-8"?>
<response status="200">
<payment_modes total="2">
<payment_mode>Cash</payment_mode>
<payment_mode>Cheque</payment_mode>
</payment_modes>
</response>| Path | Description |
|---|---|
payment_modes/payment_mode | One method name per element. |
| Status | Message | When |
|---|---|---|
404 | Data not found. Kindly check the request. |
Not supported
The XML processor recognises these names, but they have no public request template and are not supported. They are listed so that a name seen elsewhere is not mistaken for part of this reference.
addInvoiceLineItemNot supported. No request fields are documented.exportInvoicePDFNot supported. No request fields are documented.getInvoiceLogNot supported. No request fields are documented.getInvoiceLogDetailNot supported. No request fields are documented.invOfflinePaymentNot supported. No request fields are documented.invoiceOnlinePaymentNot supported. No request fields are documented.updateInvoiceLineItemNot supported. No request fields are documented.Before production
Account access and allowances can differ by plan. Confirm them with Invoicera before planning bulk imports or scheduled synchronisation.
Confirm access Verify the account token with getAccountInfo and confirm the method set you need.
Validate fields Test required and optional fields with representative non-sensitive records.
Handle responses Parse XML success and error responses, including failure and invalid lists, and retain a safe correlation record.
Control retries Prevent a timeout or repeated request from creating duplicate commercial records.