XML API v1.1

Build against the documented method surface.

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.

Request contractXML v1.1
Method
POST
Endpoint
https://api.invoicera.com/xml/1.1/
Authentication
HTTP Basic authentication; API token as username
Payload field
xml_request
First call
getAccountInfo

Use a server-side integration. Never expose an account token in browser code or a public repository.

Reference status

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

Complete one read path before writing billing data.

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.

  1. 01

    Find the token

    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.

  2. 02

    Post the XML envelope

    Send the token as the HTTP Basic username and the XML document in the xml_request form field.

  3. 03

    Read the XML status

    Parse the status attribute on the root response element before reading identifiers, records or paging attributes.

  4. 04

    Reconcile every write

    Read the created or updated record back, record its Invoicera identifier and prevent retries from creating duplicate commercial records.

First request

<?xml version="1.0" encoding="utf-8"?>
<request method="getAccountInfo">
</request>

First response

<?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

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/

Sample PHP request

<?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

Rules that apply to every method.

Dates, numbers, codes, paging, empty elements and identifiers work the same way across the interface. Read these once before using the method tables below.

Endpoint and version

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.

Authentication

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.

Request format

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 (&amp;, &lt;, &gt;). A document that does not parse is rejected with status 400.

Responses and status

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.

Paging through lists

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.

Dates

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.

Amounts and quantities

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, country and language codes

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.

Empty and missing elements

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>.

Identifiers

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.

Limits

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.

First call

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

Branch on the XML status, then retain the message safely.

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.

XML API response status codes
StatusMeaning
200The call worked.
400The request was not valid: no token, XML that does not parse, or a field that failed a check. The message says which.
401The account linked to the token is not active.
403The 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.
404No record matched. List calls return this when nothing matches the filter.
426Your plan limit for this kind of record has been reached.
500Invoicera could not complete the request.
501The 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

Choose the resource, then the smallest required operation.

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

Every method, field and response.

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.

01

Invoices

9 methods

createInvoice

Create an invoice with its line items. Returns the new invoice_id.

TransportPOST, xml_request
Request fields37
Required3
  • Creating an invoice does not email it. Use sendInvoiceMail to send it.
  • status accepts draft, sent, viewed or paid. Any other value, or no value, saves the invoice as a draft.
  • Line items, extra charges and custom fields are optional. Repeat <item> for each line.

Request fields

createInvoice request fields
PathTypeRequiredDescriptionAccepted values
clientelementNoContainer for the client being billed.
client/client_idinteger (Invoicera identifier)YesIdentifier of an existing client in your account. Use the client_id returned by createClient or listClient.
client/addressstringNoClient address to print on the document. If left out, no address is copied to the document.
invoice_titlestringNoTitle shown on the invoice.
numberstringNoDocument number shown on the invoice. If left out, or if the number is already in use, Invoicera assigns the next number in your sequence.
datedate (YYYY-MM-DD)NoDocument date. Defaults to today when left out.
due_datedate (YYYY-MM-DD)NoDate payment is due.
late_feeinteger (Invoicera identifier)NoIdentifier of an active late-fee rule. Get it from listLateFee. Leave empty for no late fee.
schedule_datedate (YYYY-MM-DD)NoDate the document is scheduled for.
po_numberstringNoPurchase order or reference number shown on the document.
statusstringNoDocument status. See allowed values.
  • draft
  • sent
  • viewed
  • paid
notesstringNoNotes shown on the document.
termsstringNoTerms shown on the document, such as payment terms.
itemselementNoContainer for one or more line items. Repeat <item> for each line.
items/itemelement · repeatableNoOne line item.
items/item/namestringYesLine item name. Required on every line.
items/item/typestringYesLine item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected.
  • Product
  • Service
items/item/descriptionstringNoLine item description.
items/item/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
items/item/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
items/item/discountdecimal (up to 2 decimal places)NoDiscount on the line. Read as a percentage or a fixed amount, depending on discount_type.
items/item/discount_typestringNoHow discount is applied: Percent or Fixed. An empty element is treated as Percent.
  • Percent
  • Fixed
items/item/tax1_namestringNoName of the first tax on the line, for example VAT.
items/item/tax2_namestringNoName of the second tax on the line.
items/item/tax1_typestringNoType of the first tax. Only Normal is accepted. Defaults to Normal.
  • Normal
items/item/tax1_percentdecimal (up to 2 decimal places)NoRate of the first tax, as a percentage.
items/item/tax2_percentdecimal (up to 2 decimal places)NoRate of the second tax, as a percentage.
items/item/tax2_typestringNoType of the second tax: Normal or Compound. Compound applies the second tax on top of the first. Defaults to Normal.
  • Normal
  • Compound
additional_chargeselementNoContainer for one or more extra charges, such as shipping.
additional_charges/additional_chargeelement · repeatableNoOne extra charge.
additional_charges/additional_charge/namestringNoName of the charge, for example Shipping.
additional_charges/additional_charge/typestringNoHow amount is applied: Percent or Fixed. Defaults to Percent.
  • Percent
  • Fixed
additional_charges/additional_charge/amountdecimal (up to 2 decimal places)NoCharge value, read as a percentage or a fixed amount depending on type.
custom_fieldselementNoContainer for up to four custom fields.
custom_fields/custom_fieldelement · repeatableNoOne custom field.
custom_fields/custom_field/labelstringNoCustom field label.
custom_fields/custom_field/valuestringNoCustom field value.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <invoice_id>[INVOICE_ID]</invoice_id>
</response>

Response fields

createInvoice response fields
PathDescription
invoice_idIdentifier of the new invoice.

Errors

createInvoice error messages
StatusMessageWhen
400Client id is not exists.client_id does not belong to your account.
400Date is invalid.A date is not a real date in YYYY-MM-DD form.
400Due Date is invalid.due_date is not a valid date.
400Late Fee is invalid or inactive.late_fee is not an active late-fee identifier.
400Schedule Date is invalid.schedule_date is not a valid date.
400Name is required.A line has no name.
400Cost is invalid.unit_cost is not a number with up to two decimal places.
400Quantity is invalid.quantity is negative or not a number.
400Type is invalid.type is not Product or Service, or the element is missing.
400Discount type is invalid.discount_type is not Percent or Fixed.
400Tax1 type is invalid.tax1_type is not Normal.
400Tax2 type is invalid.tax2_type is not Normal or Compound.
updateInvoice

Replace the details of an existing invoice. Returns the invoice_id.

TransportPOST, xml_request
Request fields34
Required5
  • This call replaces the whole invoice. The existing lines, extra charges and custom field values are removed, and the lines and charges you send are saved in their place. Send the complete invoice every time.
  • To change one line without resending the invoice, use updateInvoiceItem.

Request fields

updateInvoice request fields
PathTypeRequiredDescriptionAccepted values
invoice_idinteger (Invoicera identifier)YesInvoice identifier returned by createInvoice or listInvoice.
clientelementNoContainer for the client being billed.
client/client_idinteger (Invoicera identifier)YesIdentifier of an existing client in your account. Use the client_id returned by createClient or listClient.
client/addressstringNoClient address to print on the document. If left out, no address is copied to the document.
invoice_titlestringNoTitle shown on the invoice.
numberstringNoDocument number shown on the invoice. If left out, or if the number is already in use, Invoicera assigns the next number in your sequence.
datedate (YYYY-MM-DD)NoInvoice date.
due_datedate (YYYY-MM-DD)NoDate payment is due.
late_feeinteger (Invoicera identifier)NoIdentifier of an active late-fee rule. Get it from listLateFee. Leave empty for no late fee.
schedule_datedate (YYYY-MM-DD)NoDate the document is scheduled for.
po_numberstringNoPurchase order or reference number shown on the document.
statusstringNoInvoice status. When the request includes lines, any other value saves the invoice as a draft.
  • draft
  • sent
  • paid
notesstringNoNotes shown on the document.
termsstringNoTerms shown on the document, such as payment terms.
itemselementNoContainer for one or more line items. Repeat <item> for each line.
items/itemelement · repeatableNoOne line item.
items/item/namestringYesLine item name. Required on every line.
items/item/typestringYesLine item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected.
  • Product
  • Service
items/item/descriptionstringNoLine item description.
items/item/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
items/item/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
items/item/discountdecimal (up to 2 decimal places)NoDiscount on the line. Read as a percentage or a fixed amount, depending on discount_type.
items/item/discount_typestringYesHow discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent.
  • Percent
  • Fixed
items/item/tax1_namestringNoName of the first tax on the line, for example VAT.
items/item/tax1_percentdecimal (up to 2 decimal places)NoRate of the first tax, as a percentage.
items/item/tax1_typestringNoType of the first tax. Only Normal is accepted. Defaults to Normal.
  • Normal
items/item/tax2_namestringNoName of the second tax on the line.
items/item/tax2_percentdecimal (up to 2 decimal places)NoRate of the second tax, as a percentage.
items/item/tax2_typestringNoType of the second tax: Normal or Compound. Compound applies the second tax on top of the first. Defaults to Normal.
  • Normal
  • Compound
additional_chargeselementNoContainer for one or more extra charges, such as shipping.
additional_charges/additional_chargeelement · repeatableNoOne extra charge.
additional_charges/additional_charge/namestringNoName of the charge, for example Shipping.
additional_charges/additional_charge/typestringNoHow amount is applied: Percent or Fixed. Defaults to Percent.
  • Percent
  • Fixed
additional_charges/additional_charge/amountdecimal (up to 2 decimal places)NoCharge value, read as a percentage or a fixed amount depending on type.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <invoice_id>[INVOICE_ID]</invoice_id>
</response>

Response fields

updateInvoice response fields
PathDescription
invoice_idIdentifier of the updated invoice.

Errors

updateInvoice error messages
StatusMessageWhen
403Client id is invalid.client_id does not belong to your account.
400Date is invalid.A date is not a real date in YYYY-MM-DD form.
400Due Date is invalid.due_date is not a valid date.
400Late Fee is invalid or inactive.late_fee is not an active late-fee identifier.
400Schedule Date is invalid.schedule_date is not a valid date.
400Name is required.A line has no name.
400Cost is invalid.unit_cost is not a number with up to two decimal places.
400Quantity is invalid.quantity is negative or not a number.
400Type is invalid.type is not Product or Service, or the element is missing.
400Discount type is invalid.discount_type is not Percent or Fixed.
400Tax1 type is invalid.tax1_type is not Normal.
400Tax2 type is invalid.tax2_type is not Normal or Compound.
400Invoice id is invalid.invoice_id is not an invoice in your account.
deleteInvoice

Delete one or more invoices.

TransportPOST, xml_request
Request fields1
Required1
  • The response is status 200 even when some identifiers could not be deleted. Those are listed in a <failure> element, for example <failure><invoice id="[ID]" /></failure>. Check it before treating the delete as complete.

Request fields

deleteInvoice request fields
PathTypeRequiredDescriptionAccepted values
invoice_idinteger (Invoicera identifier) · repeatableYesInvoice to delete. Repeat the element to delete more than one invoice.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="deleteInvoice">
  <invoice_id>[INVOICE_ID]</invoice_id>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Response fields

deleteInvoice response fields
PathDescription
failurePresent only when some invoices could not be deleted. Lists their identifiers.
getInvoice

Return one invoice with its lines, extra charges and payments.

TransportPOST, xml_request
Request fields1
Required1

Request fields

getInvoice request fields
PathTypeRequiredDescriptionAccepted values
invoice_idinteger (Invoicera identifier)YesInvoice to return. One identifier per request.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="getInvoice">
  <invoice_id>[INVOICE_ID]</invoice_id>
</request>

Response example

<?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>

Response fields

getInvoice response fields
PathDescription
invoice/clientClient identifier and billing address.
invoice/numberInvoice number.
invoice/dateInvoice date.
invoice/total_discountTotal discount.
invoice/total_taxTotal tax.
invoice/net_balanceInvoice total after discounts and taxes.
invoice/late_feeLate fee charged.
invoice/late_fee_idLate-fee rule applied, or 0.
invoice/total_paidAmount paid so far.
invoice/outstandingAmount still due.
invoice/invoice_statusCommercial status, for example Draft, Sent, Viewed, Paid or Partial-Paid.
invoice/statusRecord status: Active, Archived or Cancel.
invoice/invoice_due_dateDue date.
invoice/currencyCurrency code.
invoice/items/itemOne entry per line. Line type is returned as Products or Services.
invoice/additional_charges/chargeOne entry per extra charge.
invoice/transactions/transactionOne entry per recorded payment.

Errors

getInvoice error messages
StatusMessageWhen
400Invoice id is invalid.The invoice does not exist in your account.
listInvoice

Return a page of invoices, newest invoice number first by default.

TransportPOST, xml_request
Request fields11
Required0
  • All filters are optional. With no filter, active invoices are returned.
  • The response root carries paging attributes: page, per_page_record, total_pages and total_records.

Request fields

listInvoice request fields
PathTypeRequiredDescriptionAccepted values
filterelementNoContainer for search and paging options. All are optional.
filter/client_idinteger (Invoicera identifier)NoReturn only records for this client.
filter/date_fromdate (YYYY-MM-DD)NoReturn only records dated on or after this date.
filter/date_todate (YYYY-MM-DD)NoReturn only records dated on or before this date.
filter/invoice_numberstringNoReturn only the invoice with this exact number.
filter/invoice_record_statusstringNoRecord status to return. See allowed values. Defaults to Active.
  • Active
  • Archived
  • Cancel
filter/invoice_statusstringNoInvoice status to return. See allowed values.
  • Draft
  • Sent
  • Viewed
  • Outstanding
  • Paid
  • Unpaid
  • Disputed
  • Auto-Paid
  • Retry
  • Failed
  • Resolved
  • Auto-Failed
  • Partial-Paid
filter/pageintegerNoPage to return. Defaults to 1.
filter/per_page_recordintegerNoRecords per page, from 1 to 100. Defaults to 100. Values above 100 return 100.
filter/sort_columnstringNoColumn to sort by. See allowed values.
  • number
  • date
  • invoice_id
  • organization
filter/sort_orderstringNoSort direction: asc or desc. Defaults to desc.
  • asc
  • desc

Request example

<?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>

Response example

<?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>

Response fields

listInvoice response fields
PathDescription
invoices@pagePage returned.
invoices@per_page_recordRecords per page.
invoices@total_pagesNumber of pages.
invoices@total_recordsNumber of matching invoices.
invoices/invoiceOne entry per invoice.

Errors

listInvoice error messages
StatusMessageWhen
400Per page record is invalid.per_page_record is not a whole number of 1 or more.
400Page is invalid.page is not a whole number of 1 or more.
404Data not found. Kindly check the request.No record matches the filter.
sendInvoiceMail

Email one or more invoices to the client, with a PDF copy. Each invoice is marked as sent.

TransportPOST, xml_request
Request fields1
Required1
  • If some invoices cannot be sent, the response is status 400 with an <invalid> list and a <success> list. Check both.

Request fields

sendInvoiceMail request fields
PathTypeRequiredDescriptionAccepted values
invoice_idinteger (Invoicera identifier) · repeatableYesInvoice to email. Repeat the element to send more than one invoice.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="sendInvoiceMail">
  <invoice_id>[INVOICE_ID]</invoice_id>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <invoice_id>[INVOICE_ID]</invoice_id>
</response>

Response fields

sendInvoiceMail response fields
PathDescription
invoice_idEach invoice that was sent.

Errors

sendInvoiceMail error messages
StatusMessageWhen
400Message variesOne or more invoices could not be sent. The response lists them in <invalid> and the sent ones in <success>.
400Invalid data.No invoice identifier was supplied.
addInvoiceItem

Add one or more lines to an existing invoice. Returns the new line identifiers.

TransportPOST, xml_request
Request fields14
Required5

Request fields

addInvoiceItem request fields
PathTypeRequiredDescriptionAccepted values
invoice_idinteger (Invoicera identifier)YesInvoice identifier returned by createInvoice or listInvoice.
itemselementNoContainer for one or more line items. Repeat <item> for each line.
items/itemelement · repeatableNoOne line item.
items/item/namestringYesLine item name. Required on every line.
items/item/typestringYesLine item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected.
  • Product
  • Service
items/item/descriptionstringNoLine item description.
items/item/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
items/item/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
items/item/discountdecimal (up to 2 decimal places)YesDiscount 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_typestringYesHow discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent.
  • Percent
  • Fixed
items/item/tax1_namestringNoName of the first tax on the line, for example VAT.
items/item/tax2_namestringNoName of the second tax on the line.
items/item/tax1_percentdecimal (up to 2 decimal places)NoRate of the first tax, as a percentage.
items/item/tax2_percentdecimal (up to 2 decimal places)NoRate of the second tax, as a percentage.

Request example

<?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>

Response example

<?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>

Response fields

addInvoiceItem response fields
PathDescription
invoice_idInvoice the lines were added to.
invoice_items/invoice_item_idOne identifier per new line. Keep it for later updates.

Errors

addInvoiceItem error messages
StatusMessageWhen
400Name is required.A line has no name.
400Cost is invalid.unit_cost is not a number with up to two decimal places.
400Quantity is invalid.quantity is negative or not a number.
400Type is invalid.type is not Product or Service, or the element is missing.
400Discount type is invalid.discount_type is not Percent or Fixed.
400Discount is invalid.discount is missing or is not a number with up to two decimal places.
updateInvoiceItem

Change one or more existing lines on an invoice.

TransportPOST, xml_request
Request fields15
Required6

Request fields

updateInvoiceItem request fields
PathTypeRequiredDescriptionAccepted values
invoice_idinteger (Invoicera identifier)YesInvoice identifier returned by createInvoice or listInvoice.
itemselementNoContainer for one or more line items. Repeat <item> for each line.
items/itemelement · repeatableNoOne line item.
items/item/invoice_item_idinteger (Invoicera identifier)YesIdentifier of the invoice line to change. Returned by addInvoiceItem and getInvoice.
items/item/typestringYesLine item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected.
  • Product
  • Service
items/item/namestringYesLine item name. Required on every line.
items/item/descriptionstringNoLine item description.
items/item/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
items/item/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
items/item/discountdecimal (up to 2 decimal places)YesDiscount 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_typestringYesHow discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent.
  • Percent
  • Fixed
items/item/tax1_namestringNoName of the first tax on the line, for example VAT.
items/item/tax2_namestringNoName of the second tax on the line.
items/item/tax1_percentdecimal (up to 2 decimal places)NoRate of the first tax, as a percentage.
items/item/tax2_percentdecimal (up to 2 decimal places)NoRate of the second tax, as a percentage.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Errors

updateInvoiceItem error messages
StatusMessageWhen
400Invoice item is invalid.invoice_item_id does not belong to the invoice.
400Name is required.A line has no name.
400Cost is invalid.unit_cost is not a number with up to two decimal places.
400Quantity is invalid.quantity is negative or not a number.
400Type is invalid.type is not Product or Service, or the element is missing.
400Discount type is invalid.discount_type is not Percent or Fixed.
400Discount is invalid.discount is missing or is not a number with up to two decimal places.
deleteInvoiceItem

Delete a line from an invoice.

TransportPOST, xml_request
Request fields2
Required2

Request fields

deleteInvoiceItem request fields
PathTypeRequiredDescriptionAccepted values
invoice_idinteger (Invoicera identifier) · repeatableYesInvoice identifier returned by createInvoice or listInvoice.
invoice_item_idinteger (Invoicera identifier) · repeatableYesIdentifier of the invoice line to delete.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>
02

Estimates

9 methods

createEstimate

Create an estimate with its line items. Returns the new estimate_id.

TransportPOST, xml_request
Request fields24
Required4
  • Creating an estimate does not email it. Use sendEstimateMail to send it.

Request fields

createEstimate request fields
PathTypeRequiredDescriptionAccepted values
clientelementNoContainer for the client being billed.
client/client_idinteger (Invoicera identifier)YesIdentifier of an existing client in your account. Use the client_id returned by createClient or listClient.
client/addressstringNoClient address to print on the document. If left out, no address is copied to the document.
estimate_titlestringNoTitle shown on the estimate.
numberstringNoEstimate number. If left out, or if the number is already in use, Invoicera assigns the next number in your sequence.
datedate (YYYY-MM-DD)NoDocument date. Defaults to today when left out.
schedule_datedate (YYYY-MM-DD)NoDate the document is scheduled for.
po_numberstringNoPurchase order or reference number shown on the document.
statusstringNoEstimate status. The value is saved as you send it and is not checked, so send one of the listed values.
  • draft
  • sent
  • viewed
notesstringNoNotes shown on the document.
termsstringNoTerms shown on the document, such as payment terms.
itemselementNoContainer for one or more line items. Repeat <item> for each line.
items/itemelement · repeatableNoOne line item.
items/item/namestringYesLine item name. Required on every line.
items/item/typestringYesLine item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected.
  • Product
  • Service
items/item/descriptionstringNoLine item description.
items/item/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
items/item/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
items/item/discountdecimal (up to 2 decimal places)NoDiscount on the line. Read as a percentage or a fixed amount, depending on discount_type.
items/item/discount_typestringYesHow discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent.
  • Percent
  • Fixed
items/item/tax1_namestringNoName of the first tax on the line, for example VAT.
items/item/tax1_percentdecimal (up to 2 decimal places)NoRate of the first tax, as a percentage.
items/item/tax2_namestringNoName of the second tax on the line.
items/item/tax2_percentdecimal (up to 2 decimal places)NoRate of the second tax, as a percentage.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <estimate_id>[ESTIMATE_ID]</estimate_id>
</response>

Response fields

createEstimate response fields
PathDescription
estimate_idIdentifier of the new estimate.

Errors

createEstimate error messages
StatusMessageWhen
400Name is required.A line has no name.
400Cost is invalid.unit_cost is not a number with up to two decimal places.
400Quantity is invalid.quantity is negative or not a number.
400Type is invalid.type is not Product or Service, or the element is missing.
400Discount type is invalid.discount_type is not Percent or Fixed.
400Tax1 type is invalid.tax1_type is not Normal.
400Tax2 type is invalid.tax2_type is not Normal or Compound.
updateEstimate

Replace the details of an existing estimate.

TransportPOST, xml_request
Request fields24
Required5
  • If you send <items>, they replace all the existing lines on the estimate.

Request fields

updateEstimate request fields
PathTypeRequiredDescriptionAccepted values
estimate_idinteger (Invoicera identifier)YesEstimate identifier returned by createEstimate or listEstimate.
clientelementNoContainer for the client being billed.
client/client_idinteger (Invoicera identifier)YesIdentifier of an existing client in your account. Use the client_id returned by createClient or listClient.
client/addressstringNoClient address to print on the document. If left out, no address is copied to the document.
numberstringNoEstimate number. If left out, or if the number is already in use, Invoicera assigns the next number in your sequence.
datedate (YYYY-MM-DD)NoEstimate date.
schedule_datedate (YYYY-MM-DD)NoDate the document is scheduled for.
po_numberstringNoPurchase order or reference number shown on the document.
statusstringNoEstimate status. The value is saved as you send it and is not checked, so send one of the listed values.
  • draft
  • sent
  • viewed
notesstringNoNotes shown on the document.
termsstringNoTerms shown on the document, such as payment terms.
itemselementNoContainer for one or more line items. Repeat <item> for each line.
items/itemelement · repeatableNoOne line item.
items/item/namestringYesLine item name. Required on every line.
items/item/typestringYesLine item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected.
  • Product
  • Service
items/item/descriptionstringNoLine item description.
items/item/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
items/item/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
items/item/discountdecimal (up to 2 decimal places)NoDiscount on the line. Read as a percentage or a fixed amount, depending on discount_type.
items/item/discount_typestringYesHow discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent.
  • Percent
  • Fixed
items/item/tax1_namestringNoName of the first tax on the line, for example VAT.
items/item/tax1_percentdecimal (up to 2 decimal places)NoRate of the first tax, as a percentage.
items/item/tax2_namestringNoName of the second tax on the line.
items/item/tax2_percentdecimal (up to 2 decimal places)NoRate of the second tax, as a percentage.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Errors

updateEstimate error messages
StatusMessageWhen
400Name is required.A line has no name.
400Cost is invalid.unit_cost is not a number with up to two decimal places.
400Quantity is invalid.quantity is negative or not a number.
400Type is invalid.type is not Product or Service, or the element is missing.
400Discount type is invalid.discount_type is not Percent or Fixed.
400Tax1 type is invalid.tax1_type is not Normal.
400Tax2 type is invalid.tax2_type is not Normal or Compound.
deleteEstimate

Delete one or more estimates.

TransportPOST, xml_request
Request fields1
Required1
  • The response is status 200 even when some identifiers could not be deleted. Those are listed in a <failure> element, for example <failure><estimate id="[ID]" /></failure>. Check it before treating the delete as complete.

Request fields

deleteEstimate request fields
PathTypeRequiredDescriptionAccepted values
estimate_idinteger (Invoicera identifier) · repeatableYesEstimate to delete. Repeat the element to delete more than one estimate.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="deleteEstimate">
  <estimate_id>[ESTIMATE_ID]</estimate_id>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Response fields

deleteEstimate response fields
PathDescription
failurePresent only when some estimates could not be deleted.
getEstimate

Return one estimate with its lines.

TransportPOST, xml_request
Request fields1
Required1

Request fields

getEstimate request fields
PathTypeRequiredDescriptionAccepted values
estimate_idinteger (Invoicera identifier)YesEstimate to return. One identifier per request.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="getEstimate">
  <estimate_id>[ESTIMATE_ID]</estimate_id>
</request>

Response example

<?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>

Response fields

getEstimate response fields
PathDescription
estimate/clientClient identifier, organisation and address.
estimate/estimate_idEstimate identifier.
estimate/estimate_statusEstimate status.
estimate/numberEstimate number.
estimate/items/itemOne entry per line.
listEstimate

Return a page of estimates. Filter by client, number, status or date.

TransportPOST, xml_request
Request fields10
Required0
  • All filters are optional.

Request fields

listEstimate request fields
PathTypeRequiredDescriptionAccepted values
filterelementNoContainer for search and paging options. All are optional.
filter/client_idinteger (Invoicera identifier)NoReturn only records for this client.
filter/date_fromdate (YYYY-MM-DD)NoReturn only records dated on or after this date.
filter/date_todate (YYYY-MM-DD)NoReturn only records dated on or before this date.
filter/estimate_numberstringNoReturn only the estimate with this number.
filter/statusstringNoEstimate status to return, for example Draft or Sent. With no value, active estimates are returned.
filter/pageintegerNoPage to return. Defaults to 1.
filter/per_page_recordintegerNoRecords per page, from 1 to 100. Defaults to 100. Values above 100 return 100.
filter/sort_columnstringNoColumn to sort by. See allowed values.
  • number
  • date
  • estimate_id
  • organization
filter/sort_orderstringNoSort direction: asc or desc. Defaults to desc.
  • asc
  • desc

Request example

<?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>

Response example

<?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>

Response fields

listEstimate response fields
PathDescription
estimates@pagePage returned.
estimates@total_recordsNumber of matching estimates.
estimates/estimateOne entry per estimate.

Errors

listEstimate error messages
StatusMessageWhen
400Per page record is invalid.per_page_record is not a whole number of 1 or more.
400Page is invalid.page is not a whole number of 1 or more.
404Data not found. Kindly check the request.No record matches the filter.
sendEstimateMail

Email one or more estimates to the client. Each estimate is marked as sent.

TransportPOST, xml_request
Request fields1
Required1

Request fields

sendEstimateMail request fields
PathTypeRequiredDescriptionAccepted values
estimate_idinteger (Invoicera identifier) · repeatableYesEstimate to email. Repeat the element to send more than one estimate.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="sendEstimateMail">
  <estimate_id>[ESTIMATE_ID]</estimate_id>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <success>
    <estimate_id>[ESTIMATE_ID]</estimate_id>
  </success>
</response>

Response fields

sendEstimateMail response fields
PathDescription
success/estimate_idEach estimate that was sent.
addEstimateItem

Add one or more lines to an existing estimate. Returns the new line identifiers.

TransportPOST, xml_request
Request fields14
Required4

Request fields

addEstimateItem request fields
PathTypeRequiredDescriptionAccepted values
estimate_idinteger (Invoicera identifier)YesEstimate identifier returned by createEstimate or listEstimate.
itemselementNoContainer for one or more line items. Repeat <item> for each line.
items/itemelement · repeatableNoOne line item.
items/item/namestringNoLine item name.
items/item/typestringYesLine item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected.
  • Product
  • Service
items/item/descriptionstringNoLine item description.
items/item/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
items/item/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
items/item/discountdecimal (up to 2 decimal places)YesDiscount 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_typestringYesHow discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent.
  • Percent
  • Fixed
items/item/tax1_namestringNoName of the first tax on the line, for example VAT.
items/item/tax2_namestringNoName of the second tax on the line.
items/item/tax1_percentdecimal (up to 2 decimal places)NoRate of the first tax, as a percentage.
items/item/tax2_percentdecimal (up to 2 decimal places)NoRate of the second tax, as a percentage.

Request example

<?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>

Response example

<?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>

Response fields

addEstimateItem response fields
PathDescription
estimate_items/estimate_item_idOne identifier per new line.

Errors

addEstimateItem error messages
StatusMessageWhen
400Cost is invalid.unit_cost is not a number with up to two decimal places.
400Quantity is invalid.quantity is negative or not a number.
400Type is invalid.type is not Product or Service, or the element is missing.
400Discount type is invalid.discount_type is not Percent or Fixed.
400Discount is invalid.discount is missing or is not a number with up to two decimal places.
updateEstimateItem

Change one or more existing lines on an estimate.

TransportPOST, xml_request
Request fields15
Required5

Request fields

updateEstimateItem request fields
PathTypeRequiredDescriptionAccepted values
estimate_idinteger (Invoicera identifier)YesEstimate identifier returned by createEstimate or listEstimate.
itemselementNoContainer for one or more line items. Repeat <item> for each line.
items/itemelement · repeatableNoOne line item.
items/item/estimate_item_idinteger (Invoicera identifier)YesIdentifier of the estimate line to change. Returned by addEstimateItem and getEstimate.
items/item/namestringNoLine item name.
items/item/typestringYesLine item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected.
  • Product
  • Service
items/item/descriptionstringNoLine item description.
items/item/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
items/item/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
items/item/discountdecimal (up to 2 decimal places)YesDiscount 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_typestringYesHow discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent.
  • Percent
  • Fixed
items/item/tax1_namestringNoName of the first tax on the line, for example VAT.
items/item/tax2_namestringNoName of the second tax on the line.
items/item/tax1_percentdecimal (up to 2 decimal places)NoRate of the first tax, as a percentage.
items/item/tax2_percentdecimal (up to 2 decimal places)NoRate of the second tax, as a percentage.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Errors

updateEstimateItem error messages
StatusMessageWhen
400Estimate item is invalid.estimate_item_id does not belong to the estimate.
400Cost is invalid.unit_cost is not a number with up to two decimal places.
400Quantity is invalid.quantity is negative or not a number.
400Type is invalid.type is not Product or Service, or the element is missing.
400Discount type is invalid.discount_type is not Percent or Fixed.
400Discount is invalid.discount is missing or is not a number with up to two decimal places.
deleteEstimateItem

Delete a line from an estimate.

TransportPOST, xml_request
Request fields2
Required2

Request fields

deleteEstimateItem request fields
PathTypeRequiredDescriptionAccepted values
estimate_idinteger (Invoicera identifier) · repeatableYesEstimate identifier returned by createEstimate or listEstimate.
estimate_item_idinteger (Invoicera identifier) · repeatableYesIdentifier of the estimate line to delete.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>
03

Recurring invoices

8 methods

createRecurring

Create a recurring invoice profile with its line items. Returns the new recurring_id.

TransportPOST, xml_request
Request fields23
Required2
  • frequency sets how often an invoice is created. An unrecognised value is saved as 1 Week, so check the value before sending.

Request fields

createRecurring request fields
PathTypeRequiredDescriptionAccepted values
clientelementNoContainer for the client being billed.
client/client_idinteger (Invoicera identifier)YesIdentifier of an existing client in your account. Use the client_id returned by createClient or listClient.
client/addressstringNoClient address to print on the document. If left out, no address is copied to the document.
recurring_titlestringNoTitle shown on each invoice the recurring profile creates.
datedate (YYYY-MM-DD)NoDate of the first invoice. Defaults to today.
po_numberstringNoPurchase order or reference number shown on the document.
notesstringNoNotes shown on the document.
termsstringNoTerms shown on the document, such as payment terms.
frequencystringNoHow often an invoice is created. See allowed values. An unrecognised value is saved as 1 Week.
  • 1 Week
  • 2 Week
  • 3 Week
  • 4 Week
  • 1 Month
  • 3 Month
  • 6 Month
  • 1 Year
  • 2 Year
  • 3 Year
occurenceintegerNoWhole number stored as the profile's occurrence count. The element name is spelt occurence.
itemselementNoContainer for one or more line items. Repeat <item> for each line.
items/itemelement · repeatableNoOne line item.
items/item/namestringYesLine item name. Required on every line.
items/item/typestringNoLine item type: Product or Service. Any other value, or no element, is saved as Product.
  • Product
  • Service
items/item/descriptionstringNoLine item description.
items/item/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
items/item/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
items/item/discountdecimal (up to 2 decimal places)NoDiscount on the line. Read as a percentage or a fixed amount, depending on discount_type.
items/item/discount_typestringNoHow discount is applied: Percent or Fixed. An empty element is treated as Percent.
  • Percent
  • Fixed
items/item/tax1_namestringNoName of the first tax on the line, for example VAT.
items/item/tax2_namestringNoName of the second tax on the line.
items/item/tax1_percentdecimal (up to 2 decimal places)NoRate of the first tax, as a percentage.
items/item/tax2_percentdecimal (up to 2 decimal places)NoRate of the second tax, as a percentage.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <recurring_id>[RECURRING_ID]</recurring_id>
</response>

Response fields

createRecurring response fields
PathDescription
recurring_idIdentifier of the new recurring profile.

Errors

createRecurring error messages
StatusMessageWhen
400Date is invalid.date is not a valid date.
400Name is required.A line has no name.
400Cost is invalid.unit_cost is not a number with up to two decimal places.
400Quantity is invalid.quantity is negative or not a number.
400Discount type is invalid.discount_type is not Percent or Fixed.
updateRecurring

Change an existing recurring invoice profile. Fields you leave out are unchanged.

TransportPOST, xml_request
Request fields24
Required4
  • If you send <items>, they replace all the existing lines on the profile.

Request fields

updateRecurring request fields
PathTypeRequiredDescriptionAccepted values
recurring_idinteger (Invoicera identifier)YesRecurring profile identifier returned by createRecurring or listRecurring.
clientelementNoContainer for the client being billed.
client/client_idinteger (Invoicera identifier)YesIdentifier of an existing client in your account. Use the client_id returned by createClient or listClient.
client/addressstringNoClient address to print on the document. If left out, no address is copied to the document.
recurring_titlestringNoTitle shown on each invoice the recurring profile creates.
datedate (YYYY-MM-DD)NoDate of the first invoice.
po_numberstringNoPurchase order or reference number shown on the document.
notesstringNoNotes shown on the document.
termsstringNoTerms shown on the document, such as payment terms.
frequencystringNoHow often an invoice is created. See allowed values. An unrecognised value is saved as 1 Week.
  • 1 Week
  • 2 Week
  • 3 Week
  • 4 Week
  • 1 Month
  • 3 Month
  • 6 Month
  • 1 Year
  • 2 Year
  • 3 Year
occurenceintegerNoWhole number stored as the profile's occurrence count. The element name is spelt occurence.
itemselementNoContainer for one or more line items. Repeat <item> for each line.
items/itemelement · repeatableNoOne line item.
items/item/namestringYesLine item name. Required on every line.
items/item/typestringNoLine item type: Product or Service. Any other value, or no element, is saved as Product.
  • Product
  • Service
items/item/descriptionstringNoLine item description.
items/item/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
items/item/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
items/item/discountdecimal (up to 2 decimal places)NoDiscount on the line. Read as a percentage or a fixed amount, depending on discount_type.
items/item/discount_typestringYesHow discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent.
  • Percent
  • Fixed
items/item/tax1_namestringNoName of the first tax on the line, for example VAT.
items/item/tax2_namestringNoName of the second tax on the line.
items/item/tax1_percentdecimal (up to 2 decimal places)NoRate of the first tax, as a percentage.
items/item/tax2_percentdecimal (up to 2 decimal places)NoRate of the second tax, as a percentage.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <recurring_id>[RECURRING_ID]</recurring_id>
</response>

Response fields

updateRecurring response fields
PathDescription
recurring_idIdentifier of the updated profile.

Errors

updateRecurring error messages
StatusMessageWhen
400Name is required.A line has no name.
400Cost is invalid.unit_cost is not a number with up to two decimal places.
400Quantity is invalid.quantity is negative or not a number.
400Discount type is invalid.discount_type is not Percent or Fixed.
deleteRecurring

Delete one or more recurring invoice profiles.

TransportPOST, xml_request
Request fields1
Required1
  • The response is status 200 even when some identifiers could not be deleted. Those are listed in a <failure> element, for example <failure><recurring id="[ID]" /></failure>. Check it before treating the delete as complete.

Request fields

deleteRecurring request fields
PathTypeRequiredDescriptionAccepted values
recurring_idinteger (Invoicera identifier) · repeatableYesRecurring profile to delete. Repeat the element to delete more than one.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="deleteRecurring">
  <recurring_id>[RECURRING_ID]</recurring_id>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Response fields

deleteRecurring response fields
PathDescription
failurePresent only when some profiles could not be deleted.
getRecurring

Return one recurring invoice profile with its lines.

TransportPOST, xml_request
Request fields1
Required1

Request fields

getRecurring request fields
PathTypeRequiredDescriptionAccepted values
recurring_idinteger (Invoicera identifier)YesRecurring profile to return. One identifier per request.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="getRecurring">
  <recurring_id>[RECURRING_ID]</recurring_id>
</request>

Response example

<?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>

Response fields

getRecurring response fields
PathDescription
recurring/recurring_idProfile identifier.
recurring/recurring_statusProfile status.
recurring/frequencyHow often invoices are created.
recurring/occurenceOccurrence count stored on the profile.
recurring/items/itemOne entry per line.
listRecurring

Return a page of recurring invoice profiles.

TransportPOST, xml_request
Request fields8
Required0
  • All filters are optional.

Request fields

listRecurring request fields
PathTypeRequiredDescriptionAccepted values
filterelementNoContainer for search and paging options. All are optional.
filter/client_idinteger (Invoicera identifier)NoReturn only records for this client.
filter/date_fromdate (YYYY-MM-DD)NoReturn only records dated on or after this date.
filter/date_todate (YYYY-MM-DD)NoReturn only records dated on or before this date.
filter/recurring_numberstringNoReturn only the recurring profile with this number.
filter/recurring_record_statusstringNoRecord status to return. See allowed values. Defaults to Active.
  • Active
  • Archived
  • Delete
  • Stop
filter/pageintegerNoPage to return. Defaults to 1.
filter/per_page_recordintegerNoRecords per page, from 1 to 100. Defaults to 100. Values above 100 return 100.

Request example

<?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>

Response example

<?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>

Response fields

listRecurring response fields
PathDescription
recurrings@total_recordsNumber of matching profiles.
recurrings/recurringOne entry per profile.

Errors

listRecurring error messages
StatusMessageWhen
400Per page record is invalid.per_page_record is not a whole number of 1 or more.
400Page is invalid.page is not a whole number of 1 or more.
404Data not found. Kindly check the request.No record matches the filter.
addRecurringItem

Add one or more lines to a recurring invoice profile. Returns the new line identifiers.

TransportPOST, xml_request
Request fields10
Required4

Request fields

addRecurringItem request fields
PathTypeRequiredDescriptionAccepted values
recurring_idinteger (Invoicera identifier)YesRecurring profile identifier returned by createRecurring or listRecurring.
itemselementNoContainer for one or more line items. Repeat <item> for each line.
items/itemelement · repeatableNoOne line item.
items/item/namestringNoLine item name.
items/item/typestringYesLine item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected.
  • Product
  • Service
items/item/descriptionstringNoLine item description.
items/item/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
items/item/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
items/item/discountdecimal (up to 2 decimal places)YesDiscount 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_typestringYesHow discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent.
  • Percent
  • Fixed

Request example

<?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>

Response example

<?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>

Response fields

addRecurringItem response fields
PathDescription
recurring_items/recurring_item_idOne identifier per new line.

Errors

addRecurringItem error messages
StatusMessageWhen
400Cost is invalid.unit_cost is not a number with up to two decimal places.
400Quantity is invalid.quantity is negative or not a number.
400Type is invalid.type is not Product or Service, or the element is missing.
400Discount type is invalid.discount_type is not Percent or Fixed.
400Discount is invalid.discount is missing or is not a number with up to two decimal places.
updateRecurringItem

Change one or more existing lines on a recurring invoice profile.

TransportPOST, xml_request
Request fields15
Required5

Request fields

updateRecurringItem request fields
PathTypeRequiredDescriptionAccepted values
recurring_idinteger (Invoicera identifier)YesRecurring profile identifier returned by createRecurring or listRecurring.
itemselementNoContainer for one or more line items. Repeat <item> for each line.
items/itemelement · repeatableNoOne line item.
items/item/recurring_item_idinteger (Invoicera identifier)YesIdentifier of the recurring-profile line to change. Returned by addRecurringItem and getRecurring.
items/item/namestringNoLine item name.
items/item/typestringYesLine item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected.
  • Product
  • Service
items/item/descriptionstringNoLine item description.
items/item/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
items/item/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
items/item/discountdecimal (up to 2 decimal places)YesDiscount 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_typestringYesHow discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent.
  • Percent
  • Fixed
items/item/tax1_namestringNoName of the first tax on the line, for example VAT.
items/item/tax2_namestringNoName of the second tax on the line.
items/item/tax1_percentdecimal (up to 2 decimal places)NoRate of the first tax, as a percentage.
items/item/tax2_percentdecimal (up to 2 decimal places)NoRate of the second tax, as a percentage.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Errors

updateRecurringItem error messages
StatusMessageWhen
400Recurring item is invalid.recurring_item_id does not belong to the profile.
400Cost is invalid.unit_cost is not a number with up to two decimal places.
400Quantity is invalid.quantity is negative or not a number.
400Type is invalid.type is not Product or Service, or the element is missing.
400Discount type is invalid.discount_type is not Percent or Fixed.
400Discount is invalid.discount is missing or is not a number with up to two decimal places.
deleteRecurringItem

Delete a line from a recurring invoice profile.

TransportPOST, xml_request
Request fields2
Required2

Request fields

deleteRecurringItem request fields
PathTypeRequiredDescriptionAccepted values
recurring_idinteger (Invoicera identifier) · repeatableYesRecurring profile identifier returned by createRecurring or listRecurring.
recurring_item_idinteger (Invoicera identifier) · repeatableYesIdentifier of the recurring-profile line to delete.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>
04

Clients

5 methods

createClient

Create a client. Returns the new client_id.

TransportPOST, xml_request
Request fields13
Required2
  • name and organization are both required.
  • If country or currency is left out, your account defaults are used.
  • A login is created for the client portal. If you leave out username, one is generated.

Request fields

createClient request fields
PathTypeRequiredDescriptionAccepted values
namestringYesContact name for the client. Required.
organizationstringYesOrganisation or company name of the client. Required.
emailstringNoClient email address. Checked for a valid format when supplied.
usernamestringNoLogin name for the client portal. At least five characters: letters, numbers and - _ . @ only. Must be unique. Generated for you when left out.
work_phonestringNoWork phone number.
addressstringNoPrimary postal address.
countrystringNoCountry code, as in the old example USA. Defaults to your account country when left out. An unknown code is rejected.
languagestringNoLanguage for documents the client receives. See allowed values.
  • en
  • po
  • fr
  • de
  • ru
  • dt
  • it
  • sp
  • swd
  • por
  • ind
  • cro
currencystringNoThree-letter currency code for the client, for example USD. Defaults to your base currency when left out. An unknown code is rejected.
custom_fieldselementNoContainer for up to four custom fields.
custom_fields/custom_fieldelement · repeatableNoOne custom field.
custom_fields/custom_field/labelstringNoCustom field label.
custom_fields/custom_field/valuestringNoCustom field value.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <client_id>[CLIENT_ID]</client_id>
</response>

Response fields

createClient response fields
PathDescription
client_idIdentifier of the new client.

Errors

createClient error messages
StatusMessageWhen
400Please provide mandatory data.name or organization is missing.
400Email is invalid.email is not a valid address.
400Username [...] already exists.username is taken.
400Username is invalid.username is shorter than five characters or uses other characters.
400Country code is invalid.country is not a known code.
400Currency code is invalid.currency is not a known code.
400Language is invalid.language is not in the allowed list.
426Message variesYour plan does not allow more clients. The message names the limit.
updateClient

Change an existing client.

TransportPOST, xml_request
Request fields18
Required3

Request fields

updateClient request fields
PathTypeRequiredDescriptionAccepted values
client_idinteger (Invoicera identifier)YesClient identifier returned by createClient or listClient.
namestringYesContact name for the client. Required, even when you are not changing it.
organizationstringYesOrganisation or company name of the client. Required, even when you are not changing it.
emailstringNoEmail address.
usernamestringNoLogin name for the client portal. At least five characters: letters, numbers and - _ . @ only. Must be unique.
work_phonestringNoWork phone number.
addressstringNoPrimary postal address.
countrystringNoCountry code, as in the old example USA. An unknown code is rejected.
languagestringNoLanguage for documents the client receives. See allowed values.
  • en
  • po
  • fr
  • de
  • ru
  • dt
  • it
  • sp
  • swd
  • por
  • ind
  • cro
currencystringNoThree-letter currency code for the client, for example USD. An unknown code is rejected.
additional_contactselementNoContainer for extra client contacts.
additional_contacts/contactelement · repeatableNoOne extra contact.
additional_contacts/contact/a_namestringNoName of the extra contact.
additional_contacts/contact/a_emailstringNoEmail address of the extra contact.
custom_fieldselementNoContainer for up to four custom fields.
custom_fields/custom_fieldelement · repeatableNoOne custom field.
custom_fields/custom_field/labelstringNoCustom field label.
custom_fields/custom_field/valuestringNoCustom field value.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  [CLIENT_ID]
</response>

Response fields

updateClient response fields
PathDescription
(text)The client identifier, returned as plain text inside <response>.

Errors

updateClient error messages
StatusMessageWhen
400Email is invalid.
400Username is invalid.
400Country code is invalid.
400Currency code is invalid.
400Language is invalid.
400Client id is invalid.client_id is not a whole number.
400Please provide mandatory data.name or organization is missing.
400Currency can not be changed.currency differs from the client's currency and the client already has invoices that are not drafts.
deleteClient

Delete one or more clients.

TransportPOST, xml_request
Request fields1
Required1
  • The response is status 200 even when some identifiers could not be deleted. Those are listed in a <failure> element, for example <failure><client id="[ID]" /></failure>. Check it before treating the delete as complete.

Request fields

deleteClient request fields
PathTypeRequiredDescriptionAccepted values
client_idinteger (Invoicera identifier) · repeatableYesClient to delete. Repeat the element to delete more than one client.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="deleteClient">
  <client_id>[CLIENT_ID]</client_id>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Response fields

deleteClient response fields
PathDescription
failurePresent only when some clients could not be deleted.
getClient

Return one client with contact details and credits.

TransportPOST, xml_request
Request fields1
Required1

Request fields

getClient request fields
PathTypeRequiredDescriptionAccepted values
client_idinteger (Invoicera identifier)YesClient to return. One identifier per request.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="getClient">
  <client_id>[CLIENT_ID]</client_id>
</request>

Response example

<?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>

Response fields

getClient response fields
PathDescription
client/client_idClient identifier.
client/nameContact name.
client/organizationOrganisation name.
client/emailEmail address.
client/currencyClient currency code.
client/credits/creditOne entry per credit held for the client.
listClient

Return a page of clients, newest first.

TransportPOST, xml_request
Request fields6
Required0
  • All filters are optional. With no filter, active clients are returned.

Request fields

listClient request fields
PathTypeRequiredDescriptionAccepted values
filterelementNoContainer for search and paging options. All are optional.
filter/client_idinteger (Invoicera identifier)NoReturn only records for this client.
filter/client_emailstringNoReturn only the client with this business email address.
filter/client_statusstringNoClient status to return. See allowed values. Defaults to Active.
  • Active
  • Archived
  • Deleted
filter/pageintegerNoPage to return. Defaults to 1.
filter/per_page_recordintegerNoRecords per page, from 1 to 100. Defaults to 100. Values above 100 return 100.

Request example

<?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>

Response example

<?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>

Response fields

listClient response fields
PathDescription
clients/clientOne entry per client.

Errors

listClient error messages
StatusMessageWhen
400Per page record is invalid.per_page_record is not a whole number of 1 or more.
400Page is invalid.page is not a whole number of 1 or more.
404Data not found. Kindly check the request.No record matches the filter.
05

Staff

5 methods

createStaff

Create a staff member. Returns the new staff_id.

TransportPOST, xml_request
Request fields7
Required3
  • A password is generated for the staff member.
  • Staff numbers are limited by plan.

Request fields

createStaff request fields
PathTypeRequiredDescriptionAccepted values
namestringYesStaff member name. Required.
usernamestringYesLogin name for the staff member. Required and must be unique.
emailstringYesStaff member email address. Required.
billing_ratedecimal (up to 2 decimal places)NoHourly billing rate for the staff member.
user_access_own_recordstringNoYes limits the staff member to records they own. No gives access to all records.
  • Yes
  • No
assigned_clientselementNoContainer for the clients this staff member may work with. Repeat <client_id> for each client.
assigned_clients/client_idinteger (Invoicera identifier) · repeatableNoIdentifier of a client to assign.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <staff_id>[STAFF_ID]</staff_id>
</response>

Response fields

createStaff response fields
PathDescription
staff_idIdentifier of the new staff member.

Errors

createStaff error messages
StatusMessageWhen
400Email is invalid.
400Billing rate is invalid.
400Client is invalid.An assigned client_id does not belong to your account.
updateStaff

Change an existing staff member.

TransportPOST, xml_request
Request fields8
Required1

Request fields

updateStaff request fields
PathTypeRequiredDescriptionAccepted values
staff_idinteger (Invoicera identifier)YesStaff identifier returned by createStaff or listStaff.
namestringNoStaff member name.
usernamestringNoLogin name for the staff member.
emailstringNoStaff member email address.
billing_ratedecimal (up to 2 decimal places)NoHourly billing rate for the staff member.
user_access_own_recordstringNoYes limits the staff member to records they own. No gives access to all records.
  • Yes
  • No
assigned_clientselementNoContainer for the clients this staff member may work with. Repeat <client_id> for each client.
assigned_clients/client_idinteger (Invoicera identifier) · repeatableNoIdentifier of a client to assign.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Errors

updateStaff error messages
StatusMessageWhen
400Email is invalid.
400Billing rate is invalid.
400Client is invalid.
deleteStaff

Delete one or more staff members.

TransportPOST, xml_request
Request fields1
Required1
  • The response is status 200 even when some identifiers could not be deleted. Those are listed in a <failure> element, for example <failure><staff id="[ID]" /></failure>. Check it before treating the delete as complete.

Request fields

deleteStaff request fields
PathTypeRequiredDescriptionAccepted values
staff_idinteger (Invoicera identifier) · repeatableYesStaff member to delete. Repeat the element to delete more than one.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="deleteStaff">
  <staff_id>[STAFF_ID]</staff_id>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Response fields

deleteStaff response fields
PathDescription
failurePresent only when some staff could not be deleted.

Errors

deleteStaff error messages
StatusMessageWhen
400Staff is invalid.
getStaff

Return one staff member.

TransportPOST, xml_request
Request fields1
Required1

Request fields

getStaff request fields
PathTypeRequiredDescriptionAccepted values
staff_idinteger (Invoicera identifier)YesStaff member to return. One identifier per request.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="getStaff">
  <staff_id>[STAFF_ID]</staff_id>
</request>

Response example

<?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>

Response fields

getStaff response fields
PathDescription
staff/staff_idStaff identifier.
staff/bill_rateBilling rate.
staff/access_own_recordYes or No.
staff/statusActive, Archived or Deleted.
staff/assigned_clients/client_idAssigned clients.
listStaff

Return a page of staff members, newest first.

TransportPOST, xml_request
Request fields5
Required0

Request fields

listStaff request fields
PathTypeRequiredDescriptionAccepted values
filterelementNoContainer for search and paging options. All are optional.
filter/emailstringNoReturn only the staff member with this email address.
filter/statusstringNoStatus to return. See allowed values. Defaults to Active.
  • Active
  • Archived
  • Deleted
filter/pageintegerNoPage to return. Defaults to 1.
filter/per_page_recordintegerNoRecords per page, from 1 to 100. Defaults to 100. Values above 100 return 100.

Request example

<?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>

Response example

<?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>

Response fields

listStaff response fields
PathDescription
staff_users/staffOne entry per staff member.

Errors

listStaff error messages
StatusMessageWhen
400Per page record is invalid.per_page_record is not a whole number of 1 or more.
400Page is invalid.page is not a whole number of 1 or more.
404Data not found. Kindly check the request.No record matches the filter.
06

Products and services

10 methods

createProduct

Create a product. Returns the new product_id.

TransportPOST, xml_request
Request fields4
Required1

Request fields

createProduct request fields
PathTypeRequiredDescriptionAccepted values
namestringYesProduct name. Required. A product with the same name is rejected.
quantitydecimal (up to 2 decimal places)NoQuantity held for the product.
unitcostdecimal (up to 2 decimal places)NoPrice per unit. The element name is unitcost, without an underscore.
descriptionstringNoDescription.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="createProduct">
  <name>[NAME]</name>
  <quantity>2</quantity>
  <unitcost>25.00</unitcost>
  <description>[DESCRIPTION]</description>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <product_id>[PRODUCT_ID]</product_id>
</response>

Response fields

createProduct response fields
PathDescription
product_idIdentifier of the new product.

Errors

createProduct error messages
StatusMessageWhen
400Quantity is invalid.
400Unit cost is invalid.
400Product- [name] already exists.A product with this name exists.
400Please provide valid data.
updateProduct

Change an existing product.

TransportPOST, xml_request
Request fields5
Required1

Request fields

updateProduct request fields
PathTypeRequiredDescriptionAccepted values
product_idinteger (Invoicera identifier)YesProduct identifier returned by createProduct or listProduct.
namestringNoProduct name.
quantitydecimal (up to 2 decimal places)NoQuantity held for the product.
unitcostdecimal (up to 2 decimal places)NoPrice per unit. The element name is unitcost, without an underscore.
descriptionstringNoDescription.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Errors

updateProduct error messages
StatusMessageWhen
400Product id is invalid.
403Product is not associated with your account.
deleteProduct

Delete one or more products.

TransportPOST, xml_request
Request fields1
Required1
  • The response is status 200 even when some identifiers could not be deleted. Those are listed in a <failure> element, for example <failure><product id="[ID]" /></failure>. Check it before treating the delete as complete.

Request fields

deleteProduct request fields
PathTypeRequiredDescriptionAccepted values
product_idinteger (Invoicera identifier) · repeatableYesProduct to delete. Repeat the element to delete more than one.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="deleteProduct">
  <product_id>[PRODUCT_ID]</product_id>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Response fields

deleteProduct response fields
PathDescription
failurePresent only when some products could not be deleted.
getProduct

Return one product.

TransportPOST, xml_request
Request fields1
Required1

Request fields

getProduct request fields
PathTypeRequiredDescriptionAccepted values
product_idinteger (Invoicera identifier)YesProduct to return. One identifier per request.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="getProduct">
  <product_id>[PRODUCT_ID]</product_id>
</request>

Response example

<?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>

Response fields

getProduct response fields
PathDescription
product/product_idProduct identifier.
product/product_nameName.
product/unit_costPrice per unit.
product/quantityQuantity held.
product/dateDate added.
product/statusActive, Archive or Deleted.

Errors

getProduct error messages
StatusMessageWhen
400Product id is invalid.
listProduct

Return a page of products.

TransportPOST, xml_request
Request fields7
Required0

Request fields

listProduct request fields
PathTypeRequiredDescriptionAccepted values
filterelementNoContainer for search and paging options. All are optional.
filter/product_idinteger (Invoicera identifier)NoReturn only this product.
filter/item_namestringNoReturn only items with this name.
filter/item_costdecimal (up to 2 decimal places)NoReturn only items with this unit cost.
filter/item_statusstringNoItem status to return. See allowed values. Defaults to Active.
  • Active
  • Archive
  • Deleted
filter/pageintegerNoPage to return. Defaults to 1.
filter/per_page_recordintegerNoRecords per page, from 1 to 100. Defaults to 100. Values above 100 return 100.

Request example

<?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>

Response example

<?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>

Response fields

listProduct response fields
PathDescription
products/productOne entry per product.

Errors

listProduct error messages
StatusMessageWhen
400Per page record is invalid.per_page_record is not a whole number of 1 or more.
400Page is invalid.page is not a whole number of 1 or more.
404Data not found. Kindly check the request.No record matches the filter.
createService

Create a service. Returns the new service_id.

TransportPOST, xml_request
Request fields4
Required1

Request fields

createService request fields
PathTypeRequiredDescriptionAccepted values
namestringYesService name. Required. A service with the same name is rejected.
costdecimal (up to 2 decimal places)NoPrice per unit of the service.
unitstringNoUnit the service is charged in. See allowed values.
  • Minutes
  • Hour
  • Day
  • Month
  • Year
  • Basic
descriptionstringNoDescription.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="createService">
  <name>[NAME]</name>
  <cost>40.00</cost>
  <unit>Hour</unit>
  <description>[DESCRIPTION]</description>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <service_id>[SERVICE_ID]</service_id>
</response>

Response fields

createService response fields
PathDescription
service_idIdentifier of the new service.

Errors

createService error messages
StatusMessageWhen
400Cost is invalid.
400Unit is invalid.unit is not one of the allowed values.
400Service- [name] already exists.
400Please provide valid data.
updateService

Change an existing service.

TransportPOST, xml_request
Request fields5
Required1

Request fields

updateService request fields
PathTypeRequiredDescriptionAccepted values
service_idinteger (Invoicera identifier)YesService identifier returned by createService or listService.
namestringNoService name.
costdecimal (up to 2 decimal places)NoPrice per unit of the service.
unitstringNoUnit the service is charged in. See allowed values.
  • Minutes
  • Hour
  • Day
  • Month
  • Year
  • Basic
descriptionstringNoDescription.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Errors

updateService error messages
StatusMessageWhen
400Service id is invalid.
400Unit is invalid.
403Service is not associated with your account.
deleteService

Delete one or more services.

TransportPOST, xml_request
Request fields1
Required1
  • The response is status 200 even when some identifiers could not be deleted. Those are listed in a <failure> element, for example <failure><service id="[ID]" /></failure>. Check it before treating the delete as complete.

Request fields

deleteService request fields
PathTypeRequiredDescriptionAccepted values
service_idinteger (Invoicera identifier) · repeatableYesService to delete. Repeat the element to delete more than one.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="deleteService">
  <service_id>[SERVICE_ID]</service_id>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Response fields

deleteService response fields
PathDescription
failurePresent only when some services could not be deleted.
getService

Return one service.

TransportPOST, xml_request
Request fields1
Required1

Request fields

getService request fields
PathTypeRequiredDescriptionAccepted values
service_idinteger (Invoicera identifier)YesService to return. One identifier per request.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="getService">
  <service_id>[SERVICE_ID]</service_id>
</request>

Response example

<?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>

Response fields

getService response fields
PathDescription
service/service_idService identifier.
service/service_nameName.
service/unit_costPrice per unit.
service/quantityThe unit the service is charged in (for example Hour). The element is named quantity.
service/statusActive, Archive or Deleted.

Errors

getService error messages
StatusMessageWhen
400Service id is invalid.
listService

Return a page of services.

TransportPOST, xml_request
Request fields7
Required0

Request fields

listService request fields
PathTypeRequiredDescriptionAccepted values
filterelementNoContainer for search and paging options. All are optional.
filter/service_idinteger (Invoicera identifier)NoReturn only this service.
filter/item_namestringNoReturn only items with this name.
filter/item_costdecimal (up to 2 decimal places)NoReturn only items with this unit cost.
filter/item_statusstringNoItem status to return. See allowed values. Defaults to Active.
  • Active
  • Archive
  • Deleted
filter/pageintegerNoPage to return. Defaults to 1.
filter/per_page_recordintegerNoRecords per page, from 1 to 100. Defaults to 100. Values above 100 return 100.

Request example

<?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>

Response example

<?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>

Response fields

listService response fields
PathDescription
services/serviceOne entry per service.

Errors

listService error messages
StatusMessageWhen
400Per page record is invalid.per_page_record is not a whole number of 1 or more.
400Page is invalid.page is not a whole number of 1 or more.
404Data not found. Kindly check the request.No record matches the filter.
07

Expenses

9 methods

createExpense

Record an expense. Returns the new expense_id.

TransportPOST, xml_request
Request fields11
Required3

Request fields

createExpense request fields
PathTypeRequiredDescriptionAccepted values
project_idinteger (Invoicera identifier)NoProject to link the expense to, if any.
client_idinteger (Invoicera identifier)NoClient to link the expense to, if any.
expense_category_idinteger (Invoicera identifier)YesExpense category identifier. Get it from listExpenseCategory.
amountdecimal (up to 2 decimal places)YesExpense amount. Must be greater than zero.
vendorstringNoSupplier or vendor name.
datedate (YYYY-MM-DD)YesExpense date. Required.
tax1integer (Invoicera identifier)NoIdentifier of the first tax to apply. Get it from listTax.
tax2integer (Invoicera identifier)NoIdentifier of the second tax to apply. Get it from listTax.
notesstringNoNotes stored with the expense.
recurring_frequencyintegerNoWhole number. A value makes the expense recurring. Send the element empty for a one-off expense.
recurring_end_datedate (YYYY-MM-DD)NoDate the recurring expense stops.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <expense_id>[EXPENSE_ID]</expense_id>
</response>

Response fields

createExpense response fields
PathDescription
expense_idIdentifier of the new expense.

Errors

createExpense error messages
StatusMessageWhen
400Expense category id is invalid.
400Amount is invalid.amount is missing, zero or negative.
400Date is invalid.
400Tax-1 id is invalid.
400Tax-2 id is invalid.
400Recurring frequency is invalid.
400Recurring end date is invalid.
400Project id is invalid.
400Client id is invalid.
updateExpense

Change an existing expense.

TransportPOST, xml_request
Request fields12
Required1

Request fields

updateExpense request fields
PathTypeRequiredDescriptionAccepted values
expense_idinteger (Invoicera identifier)YesExpense identifier returned by createExpense or listExpense.
project_idinteger (Invoicera identifier)NoProject to link the expense to, if any.
client_idinteger (Invoicera identifier)NoClient to link the expense to, if any.
expense_category_idinteger (Invoicera identifier)NoExpense category identifier. Get it from listExpenseCategory.
amountdecimal (up to 2 decimal places)NoExpense amount. Must be greater than zero.
vendorstringNoSupplier or vendor name.
datedate (YYYY-MM-DD)NoExpense date.
tax1integer (Invoicera identifier)NoIdentifier of the first tax to apply. Get it from listTax.
tax2integer (Invoicera identifier)NoIdentifier of the second tax to apply. Get it from listTax.
notesstringNoNotes stored with the expense.
recurring_frequencyintegerNoWhole number. A value makes the expense recurring. Send the element empty for a one-off expense.
recurring_end_datedate (YYYY-MM-DD)NoDate the recurring expense stops.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  [EXPENSE_ID]
</response>

Response fields

updateExpense response fields
PathDescription
(text)The expense identifier, returned as plain text.

Errors

updateExpense error messages
StatusMessageWhen
400Expense id is invalid.
403Expense is not associated with your account.
deleteExpense

Delete one or more expenses.

TransportPOST, xml_request
Request fields1
Required1
  • The response is status 200 even when some identifiers could not be deleted. Those are listed in a <failure> element, for example <failure><expense id="[ID]" /></failure>. Check it before treating the delete as complete.

Request fields

deleteExpense request fields
PathTypeRequiredDescriptionAccepted values
expense_idinteger (Invoicera identifier) · repeatableYesExpense to delete. Repeat the element to delete more than one.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="deleteExpense">
  <expense_id>[EXPENSE_ID]</expense_id>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Response fields

deleteExpense response fields
PathDescription
failurePresent only when some expenses could not be deleted.
getExpense

Return one expense.

TransportPOST, xml_request
Request fields1
Required1

Request fields

getExpense request fields
PathTypeRequiredDescriptionAccepted values
expense_idinteger (Invoicera identifier)YesExpense to return. One identifier per request.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="getExpense">
  <expense_id>[EXPENSE_ID]</expense_id>
</request>

Response example

<?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>

Response fields

getExpense response fields
PathDescription
expense/expense_idExpense identifier.
expense/amountAmount.
expense/tax1First tax identifier.
expense/is_expense_recurring1 if recurring, 0 if not.
expense/statusActive, Archived or Deleted.
listExpense

Return a page of expenses.

TransportPOST, xml_request
Request fields8
Required0

Request fields

listExpense request fields
PathTypeRequiredDescriptionAccepted values
filterelementNoContainer for search and paging options. All are optional.
filter/client_idinteger (Invoicera identifier)NoReturn only records for this client.
filter/expense_category_idinteger (Invoicera identifier)NoReturn only expenses in this category.
filter/amountdecimal (up to 2 decimal places)NoReturn only expenses with this amount.
filter/statusstringNoStatus to return. See allowed values. Defaults to Active.
  • Active
  • Archived
  • Deleted
filter/is_expense_invoicedstringNoYes for expenses already on an invoice, No for the rest.
  • Yes
  • No
filter/pageintegerNoPage to return. Defaults to 1.
filter/per_page_recordintegerNoRecords per page, from 1 to 100. Defaults to 100. Values above 100 return 100.

Request example

<?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>

Response example

<?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>

Response fields

listExpense response fields
PathDescription
expenses/expenseOne entry per expense.

Errors

listExpense error messages
StatusMessageWhen
400Per page record is invalid.per_page_record is not a whole number of 1 or more.
400Page is invalid.page is not a whole number of 1 or more.
404Data not found. Kindly check the request.No record matches the filter.
createExpenseCategory

Create an expense category. Returns the new category_id.

TransportPOST, xml_request
Request fields1
Required1

Request fields

createExpenseCategory request fields
PathTypeRequiredDescriptionAccepted values
namestringYesCategory name.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="createExpenseCategory">
  <name>[NAME]</name>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <category_id>[CATEGORY_ID]</category_id>
</response>

Response fields

createExpenseCategory response fields
PathDescription
category_idIdentifier of the new category.
updateExpenseCategory

Rename an expense category.

TransportPOST, xml_request
Request fields2
Required2

Request fields

updateExpenseCategory request fields
PathTypeRequiredDescriptionAccepted values
category_idinteger (Invoicera identifier)YesExpense category identifier returned by createExpenseCategory or listExpenseCategory.
namestringYesNew category name.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="updateExpenseCategory">
  <category_id>[CATEGORY_ID]</category_id>
  <name>[NAME]</name>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>
deleteExpenseCategory

Delete one or more expense categories.

TransportPOST, xml_request
Request fields1
Required1
  • The response is status 200 even when some identifiers could not be deleted. Those are listed in a <failure> element, for example <failure><category id="[ID]" /></failure>. Check it before treating the delete as complete.

Request fields

deleteExpenseCategory request fields
PathTypeRequiredDescriptionAccepted values
category_idinteger (Invoicera identifier) · repeatableYesCategory to delete. Repeat the element to delete more than one.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="deleteExpenseCategory">
  <category_id>[CATEGORY_ID]</category_id>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Response fields

deleteExpenseCategory response fields
PathDescription
failurePresent only when some categories could not be deleted.
listExpenseCategory

Return a page of expense categories.

TransportPOST, xml_request
Request fields4
Required0

Request fields

listExpenseCategory request fields
PathTypeRequiredDescriptionAccepted values
filterelementNoContainer for search and paging options. All are optional.
filter/statusstringNoStatus to return. See allowed values. Defaults to Active.
  • Active
  • Archived
  • Deleted
filter/pageintegerNoPage to return. Defaults to 1.
filter/per_page_recordintegerNoRecords per page, from 1 to 100. Defaults to 100. Values above 100 return 100.

Request example

<?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>

Response example

<?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>

Response fields

listExpenseCategory response fields
PathDescription
categories/categoryOne entry per category.

Errors

listExpenseCategory error messages
StatusMessageWhen
400Per page record is invalid.per_page_record is not a whole number of 1 or more.
400Page is invalid.page is not a whole number of 1 or more.
404Data not found. Kindly check the request.No record matches the filter.
08

Projects

5 methods

createProject

Create a project and optionally link tasks to it. Returns the new project_id.

TransportPOST, xml_request
Request fields8
Required2
  • budget is needed when billing_method is flat or project.
  • If some task identifiers are invalid, the project is still created and the response lists them in <invalid>.

Request fields

createProject request fields
PathTypeRequiredDescriptionAccepted values
namestringYesProject name. Required.
client_idinteger (Invoicera identifier)NoClient the project belongs to.
project_manager_idinteger (Invoicera identifier)NoStaff identifier of the project manager.
descriptionstringNoProject description.
billing_methodstringYesHow the project is billed. See allowed values.
  • flat
  • staff
  • task
  • project
budgetdecimal (up to 2 decimal places)NoProject budget. Needed when billing_method is flat or project.
taskselementNoContainer for tasks to link to the project. Repeat <task_id> for each task.
tasks/task_idinteger (Invoicera identifier) · repeatableNoIdentifier of a task to link.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <project_id>[PROJECT_ID]</project_id>
</response>

Response fields

createProject response fields
PathDescription
project_idIdentifier of the new project.
invalid/task_idTask identifiers that could not be linked, if any.

Errors

createProject error messages
StatusMessageWhen
400Billing method is invalid.
400Amount is invalid.budget is missing or invalid for a flat or project billing method.
400Client id is invalid.
400Project manager id is invalid.
400Please provide valid data.name is missing.
updateProject

Change an existing project.

TransportPOST, xml_request
Request fields9
Required1

Request fields

updateProject request fields
PathTypeRequiredDescriptionAccepted values
project_idinteger (Invoicera identifier)YesProject identifier returned by createProject or listProject.
namestringNoProject name.
client_idinteger (Invoicera identifier)NoClient the project belongs to.
project_manager_idinteger (Invoicera identifier)NoStaff identifier of the project manager.
descriptionstringNoDescription.
billing_methodstringNoHow the project is billed. See allowed values.
  • flat
  • staff
  • task
  • project
budgetdecimal (up to 2 decimal places)NoProject budget. Needed when billing_method is flat or project.
taskselementNoContainer for tasks to link to the project. Repeat <task_id> for each task.
tasks/task_idinteger (Invoicera identifier) · repeatableNoIdentifier of a task to link.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <project_id>[PROJECT_ID]</project_id>
</response>

Response fields

updateProject response fields
PathDescription
project_idIdentifier of the updated project.

Errors

updateProject error messages
StatusMessageWhen
400Billing method is invalid.
403Project is not associated with your account.
deleteProject

Delete one or more projects.

TransportPOST, xml_request
Request fields1
Required1
  • The response is status 200 even when some identifiers could not be deleted. Those are listed in a <failure> element, for example <failure><project id="[ID]" /></failure>. Check it before treating the delete as complete.

Request fields

deleteProject request fields
PathTypeRequiredDescriptionAccepted values
project_idinteger (Invoicera identifier) · repeatableYesProject to delete. Repeat the element to delete more than one.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="deleteProject">
  <project_id>[PROJECT_ID]</project_id>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Response fields

deleteProject response fields
PathDescription
failurePresent only when some projects could not be deleted.
getProject

Return one project with its staff and tasks.

TransportPOST, xml_request
Request fields1
Required1

Request fields

getProject request fields
PathTypeRequiredDescriptionAccepted values
project_idinteger (Invoicera identifier)YesProject to return. One identifier per request.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="getProject">
  <project_id>[PROJECT_ID]</project_id>
</request>

Response example

<?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>

Response fields

getProject response fields
PathDescription
project/project_idProject identifier.
project/billing_methodBilling method.
project/project_billedYes or No.
project/staff/staff_idStaff on the project.
project/task/task_idTasks on the project.

Errors

getProject error messages
StatusMessageWhen
400Project id is invalid.
listProject

Return a page of projects.

TransportPOST, xml_request
Request fields7
Required0

Request fields

listProject request fields
PathTypeRequiredDescriptionAccepted values
filterelementNoContainer for search and paging options. All are optional.
filter/client_idinteger (Invoicera identifier)NoReturn only records for this client.
filter/task_idinteger (Invoicera identifier)NoReturn only records for this task.
filter/project_namestringNoReturn only projects with this name.
filter/project_statusstringNoProject status to return.
filter/pageintegerNoPage to return. Defaults to 1.
filter/per_page_recordintegerNoRecords per page, from 1 to 100. Defaults to 100. Values above 100 return 100.

Request example

<?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>

Response example

<?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>

Response fields

listProject response fields
PathDescription
projects/projectOne entry per project.

Errors

listProject error messages
StatusMessageWhen
400Per page record is invalid.per_page_record is not a whole number of 1 or more.
400Page is invalid.page is not a whole number of 1 or more.
404Data not found. Kindly check the request.No record matches the filter.
09

Tasks

5 methods

createTask

Create a task and optionally link it to projects. Returns the new task_id.

TransportPOST, xml_request
Request fields6
Required1

Request fields

createTask request fields
PathTypeRequiredDescriptionAccepted values
namestringYesTask name. Required.
descriptionstringNoDescription.
task_billablestringNoY if time on the task is billable, N if not. Defaults to N.
  • Y
  • N
task_ratedecimal (up to 2 decimal places)NoHourly rate for the task.
projectselementNoContainer for projects to link to the task. Repeat <project_id> for each project.
projects/project_idinteger (Invoicera identifier) · repeatableNoIdentifier of a project to link.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <task_id>[TASK_ID]</task_id>
</response>

Response fields

createTask response fields
PathDescription
task_idIdentifier of the new task.

Errors

createTask error messages
StatusMessageWhen
400Task rate is invalid.
400Please provide valid data.name is missing.
updateTask

Change an existing task.

TransportPOST, xml_request
Request fields7
Required1

Request fields

updateTask request fields
PathTypeRequiredDescriptionAccepted values
task_idinteger (Invoicera identifier)YesTask identifier returned by createTask or listTask.
namestringNoTask name.
descriptionstringNoDescription.
task_billablestringNoY if time on the task is billable, N if not. Defaults to N.
  • Y
  • N
task_ratedecimal (up to 2 decimal places)NoHourly rate for the task.
projectselementNoContainer for projects to link to the task. Repeat <project_id> for each project.
projects/project_idinteger (Invoicera identifier) · repeatableNoIdentifier of a project to link.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Errors

updateTask error messages
StatusMessageWhen
400Task rate is invalid.
403Task is not associated with your account.
deleteTask

Delete one or more tasks.

TransportPOST, xml_request
Request fields1
Required1
  • The response is status 200 even when some identifiers could not be deleted. Those are listed in a <failure> element, for example <failure><task id="[ID]" /></failure>. Check it before treating the delete as complete.

Request fields

deleteTask request fields
PathTypeRequiredDescriptionAccepted values
task_idinteger (Invoicera identifier) · repeatableYesTask to delete. Repeat the element to delete more than one.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="deleteTask">
  <task_id>[TASK_ID]</task_id>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Response fields

deleteTask response fields
PathDescription
failurePresent only when some tasks could not be deleted.
getTask

Return one task with its projects.

TransportPOST, xml_request
Request fields1
Required1

Request fields

getTask request fields
PathTypeRequiredDescriptionAccepted values
task_idinteger (Invoicera identifier)YesTask to return. One identifier per request.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="getTask">
  <task_id>[TASK_ID]</task_id>
</request>

Response example

<?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>

Response fields

getTask response fields
PathDescription
task/task_idTask identifier.
task/task_billableY or N.
task/task_rateHourly rate.
task/project/project_idProjects the task is linked to.
listTask

Return a page of tasks.

TransportPOST, xml_request
Request fields7
Required0

Request fields

listTask request fields
PathTypeRequiredDescriptionAccepted values
filterelementNoContainer for search and paging options. All are optional.
filter/project_idinteger (Invoicera identifier)NoReturn only records for this project.
filter/task_namestringNoReturn only tasks with this name.
filter/task_billablestringNoY for billable tasks, N for the rest.
  • Y
  • N
filter/task_statusstringNoTask status to return. See allowed values. Defaults to Active.
  • Active
  • Archived
  • Deleted
filter/pageintegerNoPage to return. Defaults to 1.
filter/per_page_recordintegerNoRecords per page, from 1 to 100. Defaults to 100. Values above 100 return 100.

Request example

<?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>

Response example

<?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>

Response fields

listTask response fields
PathDescription
tasks/taskOne entry per task.

Errors

listTask error messages
StatusMessageWhen
400Per page record is invalid.per_page_record is not a whole number of 1 or more.
400Page is invalid.page is not a whole number of 1 or more.
404Data not found. Kindly check the request.No record matches the filter.
10

Time logs

5 methods

createTimeLog

Record time worked on a project task. Returns the new timelog_id.

TransportPOST, xml_request
Request fields6
Required4

Request fields

createTimeLog request fields
PathTypeRequiredDescriptionAccepted values
project_idinteger (Invoicera identifier)YesProject the time belongs to. Required.
task_idinteger (Invoicera identifier)YesTask the time belongs to. Required. The task must be linked to the project.
work_datedate (YYYY-MM-DD)YesDate the work was done.
hours_workeddecimal (up to 2 decimal places)YesHours worked. Must be greater than zero.
notesstringNoNotes stored with the time entry.
billedstringNoYes if the time has already been billed. Defaults to No.
  • Yes
  • No

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <timelog_id>[TIMELOG_ID]</timelog_id>
</response>

Response fields

createTimeLog response fields
PathDescription
timelog_idIdentifier of the new time entry.

Errors

createTimeLog error messages
StatusMessageWhen
400Project id is invalid.
400Task id is invalid.
400Work date is invalid.
400Hours is invalid.hours_worked is zero, negative or not a number.
400Task is not associated with provided project.
400Please provide valid data.A required field is missing.
updateTimeLog

Change an existing time entry.

TransportPOST, xml_request
Request fields7
Required1

Request fields

updateTimeLog request fields
PathTypeRequiredDescriptionAccepted values
timelog_idinteger (Invoicera identifier)YesTime entry identifier returned by createTimeLog or listTimeLog.
project_idinteger (Invoicera identifier)NoProject the time belongs to.
task_idinteger (Invoicera identifier)NoTask the time belongs to. The task must be linked to the project.
work_datedate (YYYY-MM-DD)NoDate the work was done.
hours_workeddecimal (up to 2 decimal places)NoHours worked. Must be greater than zero.
notesstringNoNotes stored with the time entry.
billedstringNoYes if the time has already been billed. Defaults to No.
  • Yes
  • No

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Errors

updateTimeLog error messages
StatusMessageWhen
400Hours is invalid.
403Timelog is not associated with your account.
deleteTimeLog

Delete one or more time entries.

TransportPOST, xml_request
Request fields1
Required1
  • The response is status 200 even when some identifiers could not be deleted. Those are listed in a <failure> element, for example <failure><timelog id="[ID]" /></failure>. Check it before treating the delete as complete.

Request fields

deleteTimeLog request fields
PathTypeRequiredDescriptionAccepted values
timelog_idinteger (Invoicera identifier) · repeatableYesTime entry to delete. Repeat the element to delete more than one.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="deleteTimeLog">
  <timelog_id>[TIMELOG_ID]</timelog_id>
</request>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Response fields

deleteTimeLog response fields
PathDescription
failurePresent only when some entries could not be deleted.
getTimeLog

Return one time entry.

TransportPOST, xml_request
Request fields1
Required1

Request fields

getTimeLog request fields
PathTypeRequiredDescriptionAccepted values
timelog_idinteger (Invoicera identifier)YesTime entry to return. One identifier per request.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="getTimeLog">
  <timelog_id>[TIMELOG_ID]</timelog_id>
</request>

Response example

<?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>

Response fields

getTimeLog response fields
PathDescription
timelog/work_dateDate worked.
timelog/hours_workedHours.
timelog/log_statusEntry status.
listTimeLog

Return a page of time entries.

TransportPOST, xml_request
Request fields7
Required0

Request fields

listTimeLog request fields
PathTypeRequiredDescriptionAccepted values
filterelementNoContainer for search and paging options. All are optional.
filter/project_idinteger (Invoicera identifier)NoReturn only records for this project.
filter/task_idinteger (Invoicera identifier)NoReturn only records for this task.
filter/work_datedate (YYYY-MM-DD)NoReturn only time entries for this date.
filter/billedstringNoFilter time entries by billed state (Yes or No).
  • Yes
  • No
filter/pageintegerNoPage to return. Defaults to 1.
filter/per_page_recordintegerNoRecords per page, from 1 to 100. Defaults to 100. Values above 100 return 100.

Request example

<?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>

Response example

<?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>

Response fields

listTimeLog response fields
PathDescription
timelogs/timelogOne entry per time entry.

Errors

listTimeLog error messages
StatusMessageWhen
400Per page record is invalid.per_page_record is not a whole number of 1 or more.
400Page is invalid.page is not a whole number of 1 or more.
404Data not found. Kindly check the request.No record matches the filter.
11

Account and supporting operations

8 methods

getAccountInfo

Return your account company name, owner name, country and currency. A safe first call to test your token.

TransportPOST, xml_request
Request fields0
Required0

Request fields

This method takes no request fields. Send the root element on its own.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="getAccountInfo">
</request>

Response example

<?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>

Response fields

getAccountInfo response fields
PathDescription
account/companyCompany name.
account/nameAccount owner name.
account/country_codeAccount country code.
account/currency_codeBase currency code.

Errors

getAccountInfo error messages
StatusMessageWhen
404Data not found.
createInvoiceFromTimeTracking

Create an invoice that bills unbilled time entries, plus any extra lines. Returns the new invoice_id.

TransportPOST, xml_request
Request fields48
Required7

Not on the old API help pages. Documented from the request template and XML processor in the Invoicera application.

  • Each time entry must exist and not already be billed.

Request fields

createInvoiceFromTimeTracking request fields
PathTypeRequiredDescriptionAccepted values
clientelementNoContainer for the client being billed.
client/client_idinteger (Invoicera identifier)YesIdentifier of an existing client in your account. Use the client_id returned by createClient or listClient.
client/addressstringNoClient address to print on the document. If left out, no address is copied to the document.
invoice_titlestringNoTitle shown on the invoice.
numberstringNoDocument number shown on the invoice. If left out, or if the number is already in use, Invoicera assigns the next number in your sequence.
datedate (YYYY-MM-DD)NoDocument date. Defaults to today when left out.
due_datedate (YYYY-MM-DD)NoDate payment is due.
schedule_datedate (YYYY-MM-DD)NoDate the document is scheduled for.
po_numberstringNoPurchase order or reference number shown on the document.
statusstringNoInvoice status. Any other value, or no value, saves the invoice as a draft.
  • draft
  • sent
  • paid
notesstringNoNotes shown on the document.
termsstringNoTerms shown on the document, such as payment terms.
time_entrieselementNoContainer for the time entries to bill. Repeat <time_entry> for each entry.
time_entries/time_entryelement · repeatableNoOne time entry to add as a line.
time_entries/time_entry/idinteger (Invoicera identifier)YesTime entry identifier (timelog_id). The entry must not already be billed.
time_entries/time_entry/namestringNoLine item name.
time_entries/time_entry/typestringYesLine type. Use Time. If you leave the element out, the line is rejected.
  • Time
time_entries/time_entry/descriptionstringNoLine item description.
time_entries/time_entry/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
time_entries/time_entry/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
time_entries/time_entry/discountdecimal (up to 2 decimal places)NoDiscount on the line. Read as a percentage or a fixed amount, depending on discount_type.
time_entries/time_entry/discount_typestringYesHow discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent.
  • Percent
  • Fixed
time_entries/time_entry/tax1_namestringNoName of the first tax on the line, for example VAT.
time_entries/time_entry/tax1_percentdecimal (up to 2 decimal places)NoRate of the first tax, as a percentage.
time_entries/time_entry/tax1_typestringNoType of the first tax. Only Normal is accepted. Defaults to Normal.
time_entries/time_entry/tax2_namestringNoName of the second tax on the line.
time_entries/time_entry/tax2_percentdecimal (up to 2 decimal places)NoRate of the second tax, as a percentage.
time_entries/time_entry/tax2_typestringNoType of the second tax: Normal or Compound. Compound applies the second tax on top of the first. Defaults to Normal.
itemselementNoContainer for one or more line items. Repeat <item> for each line.
items/itemelement · repeatableNoOne line item.
items/item/namestringYesLine item name. Required on every line.
items/item/typestringYesLine item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected.
  • Product
  • Service
items/item/descriptionstringNoLine item description.
items/item/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
items/item/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
items/item/discountdecimal (up to 2 decimal places)NoDiscount on the line. Read as a percentage or a fixed amount, depending on discount_type.
items/item/discount_typestringYesHow discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent.
  • Percent
  • Fixed
items/item/tax1_namestringNoName of the first tax on the line, for example VAT.
items/item/tax1_percentdecimal (up to 2 decimal places)NoRate of the first tax, as a percentage.
items/item/tax1_typestringNoType of the first tax. Only Normal is accepted. Defaults to Normal.
  • Normal
items/item/tax2_namestringNoName of the second tax on the line.
items/item/tax2_percentdecimal (up to 2 decimal places)NoRate of the second tax, as a percentage.
items/item/tax2_typestringNoType of the second tax: Normal or Compound. Compound applies the second tax on top of the first. Defaults to Normal.
  • Normal
  • Compound
additional_chargeselementNoContainer for one or more extra charges, such as shipping.
additional_charges/additional_chargeelement · repeatableNoOne extra charge.
additional_charges/additional_charge/namestringNoName of the charge, for example Shipping.
additional_charges/additional_charge/typestringNoHow amount is applied: Percent or Fixed. Defaults to Percent.
  • Percent
  • Fixed
additional_charges/additional_charge/amountdecimal (up to 2 decimal places)NoCharge value, read as a percentage or a fixed amount depending on type.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <invoice_id>[INVOICE_ID]</invoice_id>
</response>

Response fields

createInvoiceFromTimeTracking response fields
PathDescription
invoice_idIdentifier of the new invoice.

Errors

createInvoiceFromTimeTracking error messages
StatusMessageWhen
400Client id is not exists.client_id does not belong to your account.
400Date is invalid.A date is not a real date in YYYY-MM-DD form.
400Due Date is invalid.due_date is not a valid date.
400Schedule Date is invalid.schedule_date is not a valid date.
400Time-entry id is required.
400Time-entry id is not valid or already billed.
createInvoiceFromExpense

Create an invoice that bills unbilled expenses, plus any extra lines. Returns the new invoice_id.

TransportPOST, xml_request
Request fields41
Required7

Not on the old API help pages. Documented from the request template and XML processor in the Invoicera application.

  • Each expense must belong to the client, be active and not already be invoiced.

Request fields

createInvoiceFromExpense request fields
PathTypeRequiredDescriptionAccepted values
clientelementNoContainer for the client being billed.
client/client_idinteger (Invoicera identifier)YesIdentifier of an existing client in your account. Use the client_id returned by createClient or listClient.
client/addressstringNoClient address to print on the document. If left out, no address is copied to the document.
invoice_titlestringNoTitle shown on the invoice.
numberstringNoDocument number shown on the invoice. If left out, or if the number is already in use, Invoicera assigns the next number in your sequence.
datedate (YYYY-MM-DD)NoDocument date. Defaults to today when left out.
due_datedate (YYYY-MM-DD)NoDate payment is due.
late_feeinteger (Invoicera identifier)NoIdentifier of an active late-fee rule. Get it from listLateFee. Leave empty for no late fee.
schedule_datedate (YYYY-MM-DD)NoDate the document is scheduled for.
po_numberstringNoPurchase order or reference number shown on the document.
statusstringNoInvoice status. Any other value, or no value, saves the invoice as a draft.
  • draft
  • sent
  • paid
notesstringNoNotes shown on the document.
termsstringNoTerms shown on the document, such as payment terms.
expenseselementNoContainer for the expenses to bill. Repeat <expense> for each expense.
expenses/expenseelement · repeatableNoOne expense to add as a line.
expenses/expense/idinteger (Invoicera identifier)YesExpense identifier (expense_id). The expense must not already be billed.
expenses/expense/namestringNoLine item name.
expenses/expense/typestringYesLine type. Use Expense. If you leave the element out, the line is rejected.
  • Expense
expenses/expense/descriptionstringNoLine item description.
expenses/expense/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
expenses/expense/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
expenses/expense/discountdecimal (up to 2 decimal places)NoDiscount on the line. Read as a percentage or a fixed amount, depending on discount_type.
expenses/expense/discount_typestringYesHow discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent.
  • Percent
  • Fixed
expenses/expense/tax1_namestringNoName of the first tax on the line, for example VAT.
expenses/expense/tax2_namestringNoName of the second tax on the line.
expenses/expense/tax1_percentdecimal (up to 2 decimal places)NoRate of the first tax, as a percentage.
expenses/expense/tax2_percentdecimal (up to 2 decimal places)NoRate of the second tax, as a percentage.
itemselementNoContainer for one or more line items. Repeat <item> for each line.
items/itemelement · repeatableNoOne line item.
items/item/namestringYesLine item name. Required on every line.
items/item/typestringYesLine item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected.
  • Product
  • Service
items/item/descriptionstringNoLine item description.
items/item/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
items/item/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
items/item/discountdecimal (up to 2 decimal places)NoDiscount on the line. Read as a percentage or a fixed amount, depending on discount_type.
items/item/discount_typestringYesHow discount is applied: Percent or Fixed. Send the element on every line; an empty element is treated as Percent.
  • Percent
  • Fixed
additional_chargeselementNoContainer for one or more extra charges, such as shipping.
additional_charges/additional_chargeelement · repeatableNoOne extra charge.
additional_charges/additional_charge/namestringNoName of the charge, for example Shipping.
additional_charges/additional_charge/typestringNoHow amount is applied: Percent or Fixed. Defaults to Percent.
  • Percent
  • Fixed
additional_charges/additional_charge/amountdecimal (up to 2 decimal places)NoCharge value, read as a percentage or a fixed amount depending on type.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <invoice_id>[INVOICE_ID]</invoice_id>
</response>

Response fields

createInvoiceFromExpense response fields
PathDescription
invoice_idIdentifier of the new invoice.

Errors

createInvoiceFromExpense error messages
StatusMessageWhen
400Client id is not exists.client_id does not belong to your account.
400Date is invalid.A date is not a real date in YYYY-MM-DD form.
400Due Date is invalid.due_date is not a valid date.
400Late Fee is invalid or inactive.late_fee is not an active late-fee identifier.
400Schedule Date is invalid.schedule_date is not a valid date.
400Expense id is required.
400Expense [ID] is not assigned to this client or not active or already invoiced.An expense is not billable for this client.
createInvoiceFromEstimate

Create 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.

TransportPOST, xml_request
Request fields26
Required3

Not on the old API help pages. Documented from the request template and XML processor in the Invoicera application.

  • Send the lines you want in <items>, as you would for createInvoice. The new invoice has no link to any estimate.

Request fields

createInvoiceFromEstimate request fields
PathTypeRequiredDescriptionAccepted values
clientelementNoContainer for the client being billed.
client/client_idinteger (Invoicera identifier)YesIdentifier of an existing client in your account. Use the client_id returned by createClient or listClient.
client/addressstringNoClient address to print on the document. If left out, no address is copied to the document.
invoice_titlestringNoTitle shown on the invoice.
numberstringNoDocument number shown on the invoice. If left out, or if the number is already in use, Invoicera assigns the next number in your sequence.
datedate (YYYY-MM-DD)NoDocument date. Defaults to today when left out.
due_datedate (YYYY-MM-DD)NoDate payment is due.
schedule_datedate (YYYY-MM-DD)NoDate the document is scheduled for.
po_numberstringNoPurchase order or reference number shown on the document.
statusstringNoDocument status. See allowed values.
  • draft
  • sent
  • viewed
  • paid
notesstringNoNotes shown on the document.
termsstringNoTerms shown on the document, such as payment terms.
itemselementNoContainer for one or more line items. Repeat <item> for each line.
items/itemelement · repeatableNoOne line item.
items/item/namestringYesLine item name. Required on every line.
items/item/typestringYesLine item type: Product or Service. An empty element is treated as Product. If you leave the element out, the line is rejected.
  • Product
  • Service
items/item/descriptionstringNoLine item description.
items/item/unit_costdecimal (up to 2 decimal places)NoPrice per unit.
items/item/quantitydecimal (up to 2 decimal places)NoNumber of units. Must not be negative.
items/item/discountdecimal (up to 2 decimal places)NoDiscount on the line. Read as a percentage or a fixed amount, depending on discount_type.
items/item/discount_typestringNoHow discount is applied: Percent or Fixed. An empty element is treated as Percent.
  • Percent
  • Fixed
additional_chargeselementNoContainer for one or more extra charges, such as shipping.
additional_charges/additional_chargeelement · repeatableNoOne extra charge.
additional_charges/additional_charge/namestringNoName of the charge, for example Shipping.
additional_charges/additional_charge/typestringNoHow amount is applied: Percent or Fixed. Defaults to Percent.
  • Percent
  • Fixed
additional_charges/additional_charge/amountdecimal (up to 2 decimal places)NoCharge value, read as a percentage or a fixed amount depending on type.

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200">
  <invoice_id>[INVOICE_ID]</invoice_id>
</response>

Response fields

createInvoiceFromEstimate response fields
PathDescription
invoice_idIdentifier of the new invoice.

Errors

createInvoiceFromEstimate error messages
StatusMessageWhen
400Client id is not exists.client_id does not belong to your account.
400Date is invalid.A date is not a real date in YYYY-MM-DD form.
400Due Date is invalid.due_date is not a valid date.
400Schedule Date is invalid.schedule_date is not a valid date.
400Name is required.A line has no name.
400Cost is invalid.unit_cost is not a number with up to two decimal places.
400Quantity is invalid.quantity is negative or not a number.
400Type is invalid.type is not Product or Service, or the element is missing.
400Discount type is invalid.discount_type is not Percent or Fixed.
invoiceOfflinePayment

Record a payment received outside Invoicera, such as cash or cheque, against one or more invoices.

TransportPOST, xml_request
Request fields7
Required3
  • Repeat <invoice> to record several payments in one request.
  • Use a method name returned by listOfflinePaymentMethod.

Request fields

invoiceOfflinePayment request fields
PathTypeRequiredDescriptionAccepted values
invoiceelement · repeatableNoOne payment to record. Repeat <invoice> to record payments against more than one invoice.
invoice/idinteger (Invoicera identifier)YesIdentifier of the invoice being paid. Required.
invoice/amountdecimal (up to 2 decimal places)YesAmount received.
invoice/methodstringYesPayment method name, for example Cash or Cheque. Use a name returned by listOfflinePaymentMethod.
invoice/datedate (YYYY-MM-DD)NoDate the payment was received.
invoice/notesstringNoNote stored with the payment.
invoice/client_notificationstringNoSet to 1 to email the client a payment notification. Any other value sends nothing.
  • 1
  • 0

Request example

<?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>

Response example

<?xml version="1.0" encoding="utf-8"?>
<response status="200"></response>

Errors

invoiceOfflinePayment error messages
StatusMessageWhen
400Invoice id is required.invoice/id is missing.
400Method is required.invoice/method is missing.
400Amount is invalid.invoice/amount is not a valid amount.
400Date is invalid.invoice/date is not a valid date.
listLateFee

Return the active late-fee rules in your account. Use an id as late_fee on invoices.

TransportPOST, xml_request
Request fields0
Required0

Not on the old API help pages. Documented from the request template and XML processor in the Invoicera application.

Request fields

This method takes no request fields. Send the root element on its own.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="listLateFee">
</request>

Response example

<?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>

Response fields

listLateFee response fields
PathDescription
late_fees@totalNumber of rules.
late_fees/late_fee/idLate-fee identifier.
late_fees/late_fee/nameLate-fee name.

Errors

listLateFee error messages
StatusMessageWhen
404Data not found. Kindly check the request.No active late-fee rule exists.
listTax

Return the taxes set up in your account. Use an id as tax1 or tax2 on expenses.

TransportPOST, xml_request
Request fields0
Required0

Not on the old API help pages. Documented from the request template and XML processor in the Invoicera application.

Request fields

This method takes no request fields. Send the root element on its own.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="listTax">
</request>

Response example

<?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>

Response fields

listTax response fields
PathDescription
taxes/tax/idTax identifier.
taxes/tax/nameTax name.
taxes/tax/typeTax type.
taxes/tax/valueTax rate as a percentage.

Errors

listTax error messages
StatusMessageWhen
404Data not found. Kindly check the request.No tax is set up.
listOfflinePaymentMethod

Return the offline payment method names you can use with invoiceOfflinePayment.

TransportPOST, xml_request
Request fields0
Required0

Not on the old API help pages. Documented from the request template and XML processor in the Invoicera application.

Request fields

This method takes no request fields. Send the root element on its own.

Request example

<?xml version="1.0" encoding="utf-8"?>
<request method="listOfflinePaymentMethod">
</request>

Response example

<?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>

Response fields

listOfflinePaymentMethod response fields
PathDescription
payment_modes/payment_modeOne method name per element.

Errors

listOfflinePaymentMethod error messages
StatusMessageWhen
404Data not found. Kindly check the request.

Not supported

Do not build against names without a public request contract.

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

Confirm account access and limits before you scale.

Account access and allowances can differ by plan. Confirm them with Invoicera before planning bulk imports or scheduled synchronisation.

  1. 01

    Confirm access Verify the account token with getAccountInfo and confirm the method set you need.

  2. 02

    Validate fields Test required and optional fields with representative non-sensitive records.

  3. 03

    Handle responses Parse XML success and error responses, including failure and invalid lists, and retain a safe correlation record.

  4. 04

    Control retries Prevent a timeout or repeated request from creating duplicate commercial records.