Invoices API

To manage your invoices, you can use the following commands.

Description Method URL
Get all invoices GET /api/v1/invoices
Get one invoice GET /api/v1/invoices/{id}
Create new invoice POST /api/v1/invoices/
Delete a invoice DELETE /api/v1/invoices/{id}

All attributes used for invoices

Attribute Type Note
invoicenr string Invoice number including layout

When posting an invoice, do not specify or define this attribute. If you really want to define the invoice number, please include the invoice number as an integer number without any prefix layout. So to create INVOICE00023, please send us 23 as integer.

Use this with caution! When used wrong it can ruin your administration and invoice numbers. Only use this when absolutely necessary.
reference array Contains reference lines on the invoice. 'line1', 'line2', 'line3'. All are strings.
lines array All invoice lines on the invoice
Per line:
'amount'
'amount_desc'
'description'
'tax_rate'
'price'
'discount_pct' (discount percentage)
'tax_country' (boolean, input only)*
'linetotal' (read only)

if you want to use a foreign tax for this line, set this to true. Read more

To use text lines on an invoice, only supply 'description' and do not use the other fields. Check the example below for more info.
profile id The ID of the used profile. Default is default profile
category id The ID of the used category
discounttype string(10) The type of discount. 'amount' or 'percentage'
discount float If 'discounttype' is amount, then this is the amount of discount set on the invoice. If 'discounttype' is set to 'percentage', this is the discount percentage set.
paymentcondition string The payment condition set on the invoice. Default is the payment condition set in the application.
paymentperiod integer Term of payment in days. Default is the payment period set with the client.
collectionread only boolean If invoice is an automatic collection
taxesread only array All taxes defined in the invoice

Per taxes:
'rate': tax rate
'sum': taxes on the invoice for this rate
'sum_of': amount where this taxes is relates to
taxread only float Total of all taxes on this invoice
totalintaxread only float Invoice total including taxes
tax_typeread only string Will show if the invoice lines are excluding or including tax:
Values are: 'intax' or 'extax'
languageread only string The language used in the document.
'nl': dutch
'en': english
'de': german
'fr': france
'es': spanish
'it': italian
tax_shiftedread only boolean If the tax on the invoice is shifted to the receiver
clientnr integer Client number
contactread only string(50)
companyread only string(50)
addressread only string(50)
zipcoderead only string(7)
cityread only string(50)
countryread only integer or string Country id. You can get a list of country id's with the function api/v1/countrylist. When creating or updating a client, you can supply a country id or a country name. We'll then try to find the id of the country you supplied.
phoneread only string(13)
mobileread only string(13)
invoicenoteread only string A note that is saved with the invoice
sent date The date the invoice is sent
uncollectibleread only date The date when the invoice is marked as uncollectible
lastreminderread only date The date when the last reminder was sent
openread only float The amount that is still open on the invoice. If this amount is 0, then the invoice is paid. If it is negative, there is paid more than the invoice amount.
paiddate date The date of the last received payment
payment_urlread only string The complete URL where the invoice can be paid
duedateread only date The duedate of the invoice. This is the sent-date + the payment period in days.
historyread only array The actions taken by the user or the system for this invoice

Special filtering for invoices

The invoices have a special filter to quickly access different invoice types, like invoices that are overdue. Possible filter options:

Description Method URL
Get open invoice (all invoices that are not fully paid yet) GET {url}?filter=open
Get overdue invoices GET {url}?filter=overdue
Get sent invoices GET {url}?filter=sent
Get partly paid invoices GET {url}?filter=partly
Get invoices with too much paid GET {url}?filter=toomuch
Get paid invoices GET {url}?filter=paid
Get invoices that couldn't be collected GET {url}?filter=uncollectible

Example

Receive all invoices that are overdue

GET /api/v1/invoices?filter=overdue

Filter invoices on a date

Description Method URL
Since date GET {url}?since=YYYY-MM-DD
Until dateoptional GET {url}?until=YYYY-MM-DD
Filter on paid date instead of invoice dateoptional GET {url}?sincetype=paidddate

Example 1

Receive all invoices from a specific period.

GET /api/v1/invoices?since=2020-12-15&until=2020-12-31

Example 2

Receive all invoices from a specific period based on the invoice paid date.

GET /api/v1/invoices?since=2020-12-15&until=2020-12-31&sincetype=paiddate

Create new invoice

POST /api/v1/invoices/

When posting a new invoice, there are several extra attributes needed besides the ones shown above.

Attribute Type Note
actionrequired string(6) Define the action what we should do with your request.
'send': send the invoice
'save': save the invoice as a draft
'repeat': plan a repeating invoice
sendmethod string(11) How to send the invoice to the receiver. Required when you use the action 'send'
'mail': print the invoices yourself. We'll send you the invoice number so you can execute a command to retrieve the PDF if you need so.
'email': send invoices through e-mail. It will be sent immediately.
'printcenter': send invoice through the printcenter.
savename string(20) When the action is 'save' or 'repeat' you must supply a savename. We'll save the invoice under that name.
overwrite_if_exist boolean If a savename already exists, it will not be overwritten unless this attribute is set to 'true'. Default is 'false'.
convert_prices_to_euro boolean When this option is set to 'true' we will convert all the given prices on the invoices to euro, based on the currency set in the selected client and the invoice date (to retrieve the current exchange rate).
alreadypaid float or string Mark a part of the invoice as already paid. We'll place an extra line in the PDF that says that a part of the invoice is already paid. We'll also register that a part is paid in your account.

Supply the amount in 'float'. You can also supply 'full' as a value. We will mark the invoice total as amount.
alreadypaidmethod string(32) Enter a string of the payment method. It can be anything you want, for example: 'Pin', 'Cash', 'MasterCard', 'Gift from Santa', etc.

When planning a repeating invoice with the action 'repeat' there are several fields also needed for us to process the invoice.

Attribute Type Note
initialdaterequired date Date when the first invoice must be sent. Please use YYYY-MM-DD
finalsenddateoptional date Date when the last invoice must be sent. After this date the repeating invoice entry is deleted. Please use YYYY-MM-DD
frequencyrequired string(10) The frequency when the invoice must be sent. Based on the initialdate.

Possible options:
'weekly', 'monthly', 'quarterly', 'halfyearly', 'yearly', 'biweekly', 'bimonthly', 'fourweekly'
repeattyperequired string(6) If a savename already exists, it will not be overwritten unless this attribute is set to 'true'. Default is 'false'.

Example 1 - sending an invoice through the e-mail

In this example we'll send an invoice through the e-mail. When this command is executed, the e-mail is immediately sent.

$request->buildPostBody(array(
  'clientnr' => 218064,
  'reference' => array(
    'line1' => 'Soundboard Setup',
    'line2' => 'Thank you for the order',
    'line3' => 'Our reference is: 3993029/11BD'
  ),
  'lines' => array(
    array('amount' => 50,
      'amount_desc' => 'panels',
      'description' => 'Sound buttons',
      'tax_rate' => 21,
      'price' => 5.952
    ),
    array('amount' => 1,
      'amount_desc' => '',
      'description' => 'Wooden case',
      'tax_rate' => 21,
      'dicount_pct' => 25,
      'price' => 500
    ),
    array('amount' => 10,
      'amount_desc' => 'hours',
      'description' => 'Support',
      'tax_rate' => 9,
      'price' => 62.5
    ),
    array('description' => 'This is a textline')),
    'discount' => 10,
    'discounttype' => 'percentage',
    'action' => 'send',
    'sendmethod' => 'email'
));

Or as a JSON:

{
  "clientnr": 218064,
  "reference": {
    "line1": "Soundboard Setup",
    "line2": "Thank you for the order",
    "line3": "Our reference is: 3993029/11BD"
  },
  "lines": [
    {
      "amount": 50,
      "amount_desc": "panels",
      "description": "Sound buttons",
      "tax_rate": 21,
      "price": 5.952
    },
    {
      "amount": 1,
      "amount_desc": "",
      "description": "Wooden case",
      "tax_rate": 21,
      "dicount_pct": 25,
      "price": 500
    },
    {
      "amount": 10,
      "amount_desc": "hours",
      "description": "Support",
      "tax_rate": 9,
      "price": 62.5
    },
    {
      "description": "This is a textline"
    }
  ],
  "discount": 10,
  "discounttype": "percentage",
  "action": "send",
  "sendmethod": "email"
}

Example 2 - save a draft invoice

In this example, we'll create an invoice and then save it as a draft so we can edit it later on in the web application.

$request->buildPostBody(array(
  'clientnr' => 218064,
  'lines' => array(
    array('amount' => 50,
      'amount_desc' => 'panels',
      'description' => 'Sound buttons',
      'tax_rate' => 21,
      'price' => 5.952,
    )
  ),
  'discount' => 10,
  'discounttype' => 'percentage',
  'action' => 'save',
  'savename' => 'my_invoice'
));

Example - plan a repeating invoice

In this example, we'll create an invoice and then plan it as a repeating invoice.

$request->buildPostBody(array(
  'clientnr' => 218064,
  'lines' => array(
    array('amount' => 50,
      'amount_desc' => 'panels',
      'description' => 'Sound buttons',
      'tax_rate' => 21,
      'price' => 5.952,
    )
  ),
  'discount' => 10,
  'discounttype' => 'percentage',
  'action' => 'repeat',
  'savename' => 'planning_invoice',
  'initialdate' => '2020-03-07',
  'finalsenddate' => '2022-01-01',
  'frequency' => 'monthly',
  'repeattype' => 'auto'
));

Example 3 - send an invoice and mark it immediately as paid

In this example, we'll send an invoice and mark it directly as paid. Please note: marking the invoice as paid doesn't change anything to the invoice email text that is sent. Make sure the email text contains information that the invoice is already paid or use the sendmethod 'mail'. This way, no email is sent. You can create an own email in your program and retrieve the invoice pdf file with our api.

$request->buildPostBody(array(
  'clientnr' => 218064,
  'lines' => array(
    array('amount' => 50,
      'amount_desc' => 'panels',
      'description' => 'Sound buttons',
      'tax_rate' => 21,
      'price' => 5.952
  ),
  'action' => 'send',
  'sendmethod' => 'mail',
  'paiddate' => '2020-09-21'
));

Example 4 - send an invoice and mark a part as paid

In this example, we'll send an invoice and mark a part of the invoice as paid (like when the customer already paid a part of the invoice up front). Please note: marking the invoice as paid doesn't change anything to the invoice email text that is sent. Make sure the email text contains information that the invoice is already paid or use the sendmethod 'mail'. This way, no email is sent. You can create an own email in your program and retrieve the invoice pdf file with our api.

$request->buildPostBody(array(
  'clientnr' => 218064,
  'lines' => array(
    array('amount' => 50,
      'amount_desc' => 'panels',
      'description' => 'Sound buttons',
      'tax_rate' => 21,
      'price' => 5.952
  ),
  'action' => 'send',
  'sendmethod' => 'mail',
  'alreadypaid' => 150, // use 'full' for the invoice total
  'alreadypaidmethod' => 'Pin',
));