Skip to content

Instantly share code, notes, and snippets.

@cconrad
Forked from sebastianseilund/billy-api-v2-docs.md
Created March 11, 2014 16:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cconrad/9489313 to your computer and use it in GitHub Desktop.
Save cconrad/9489313 to your computer and use it in GitHub Desktop.

Billy's Billing API v2 Documentation

The new API is a JSON-based REST API. Our new webapp uses the exact same API. This is your guarantee that the API will always support full functionality and generally be nice to work with. We take our own medicine!

During the beta period, the API may have backwards incompatible changes with very short notices. Follow @billydeveloper on Twitter to subscribe to updates.

If you have any questions or feedback (we love feedback!), please ask on Twitter or mail us at beta@billysbilling.com.

Table of Contents

Endpoint

The API is located at https://api.billysbilling.com/v2.

All requests must use SSL.

Authentication

We currently support two ways of authenticating with the API.

###OAuth access tokens

You can obtain an access token for your organization this way:

  • Log into your account on app.billysbilling.com.
  • Go to Settings -> Access tokens.
  • Click Create access token.
  • Enter a descriptive name for it, so you can identify it later, and hit the Save button.
  • Hover over the newly generated access token and click the magnifier icon to show the token.
  • The token will now be selected in a textfield inside a lightbox.

All you have to do is put this token in an X-Access-Token header. See Code examples for full example.

The tokens you create under Settings -> Access tokens are tied to that organization only. If you have multiple organizations, you need a token for each one. They do not expire.

We plan on supporting a 3-legged OAuth solution eventually.

###HTTP basic auth

You can use your normal email and password to authenticate with HTTP Basic Auth. You can try it right now by navigating to e.g. https://api.billysbilling.com/v2/user. Enter your email and password in the browser's credentials form, and you will see your user as a JSON document.

Conventions

The API is very consistent as we use the same conventions for all resources. Generally speaking there are 5 ways to interact with a resource: Get one item, list, create, update and delete.

A resource is always accessed through its pluralized name. E.g. you can access invoices through /v2/invoices.

The following examples will use the invoices resource as an example. But the exact same pattern applies to all of our resources.

Getting a single record

When getting a single record you should use e.g. GET /v2/invoices/:id (where :id denotes a dynamic slug, and should be replaced by a real invoice ID). The response will be a JSON document with a root key named after the singular name that contains the requested record. Invoice example:

{
  "invoice": {
    "id": "3mIN9EbDEeOg8QgAJ4gM",
    "invoiceNo": 41,
    ...
  }
}

Listing a resource

Use GET /v2/invoices. The response will be a JSON document with a root key named after the pluralized name that contains an array of found records. Invoice example:

{
  "invoices": [
    {au
      "id": "3mIN9EbDEeOg8QgAJ4gM",
      "invoiceNo": 41,
      ...
    },
    {
      "id": "4LmaTkbDEeOg8QgAJ4to",
      "invoiceNo": 42,
      ...
    }
  ]
}

Creating a record

Use POST /v2/invoices. The request body should be a JSON document containing a single root key named after the singular name and be a hash of record properties. Invoice example:

{
  "invoice": {
    "invoiceNo": 41,
    "entryDate": "2013-11-14",
    ...
  }
}

See more about the response body in the section Responses to create/update/delete requests. You can get the ID of the newly created record by getting invoices.0.id in the returned JSON document.

Updating a record

Use PUT /v2/invoices/:id. The request body should be a JSON document containing a single root key named after the singular name and be a hash of record properties. The hash does not need to include the record's ID, but if it does, it needs be the exact same as you used in the URL. You can't change a record's ID. Invoice example:

{
  "invoice": {
    "contactMessage": 41,
    ...
  }
}

Only properties that you set in the invoice hash will be updated. Properties that are left out will be considered as if they are the same. So if all you need to do is to update the contactMessage property, then you don't need to include any other properties.

The response works the same as with a POST request.

Bulk creating/updating multiple records

Use PATCH /v2/invoices. The request body should be a JSON document containing a single root key named after the plural name and be an array of record hashes. Each record hash is either a record to create (if it does not contain an id) or update (if it does contain an id). Invoice example:

{
  "invoices": [
    {
      "invoiceNo": 41,
      "entryDate": "2013-11-14",
      ...
    },
    {
      "id": "3mIN9EbDEeOg8QgAJ4gM",
      "contactMessage": "Whale",
      ...
    }
  ]
}

This example will create a new invoice with invoice no. 41, and update the contactMessage of an existing invoice with ID 3mIN9EbDEeOg8QgAJ4gM.

Deleting a record

Use DELETE /v2/invoices/:id. The request should not have a body.

DELETE requests are idempotent, meaning that if you try to DELETE the same record more than once (or delete any other non-existing ID), you will still receive a 200 OK response.

See more about the response body in the section Responses to create/update/delete requests.

Bulk deleting records

Use DELETE /v2/invoices?ids[]=:id1&ids[]=:id2. The request should not have a body.

Responses to create/update/delete requests

When you make POST, PUT, PATCH or DELETE requests to the API the response will always contain all the records that were changed because of the request. The record that you created/updated will of course always be there. But some. Example: When you create an invoiceLine for an existing invoice, the amount field on the invoice will also be changed. So a POST /v2/invoiceLines would return something like:

{
  "invoices": [
    {
      "id": "3mIN9EbDEeOg8QgAJ4gM",
      "amount": 200,
      ...
    }
  ],
  invoiceLines: [
    {
      "id": "cgYxHZWCSfajDIvj9Q8yRQ",
      "invoiceId": "3mIN9EbDEeOg8QgAJ4gM",
      ...
    }
  ]
}

The IDs of deleted records will be accessible through the meta.deletedRecords property. Example: When requesting DELETE /v2/invoices/1234, the response will be:

{
  "meta": {
    "deletedRecords": {
      "invoices": [
        "1234"
      ]
    }
  }
}

Note that some PUT requests may delete records, too. An example is when you overwrite a record's has-many relationship using an embedded array of child records.

Relationships

The API is smart about relationships. Many resources have relationships, and we distinguis between two kinds of relationships:

  • Belongs-to: A record of resource A has an ID that points to a record of resource B. Example: invoice records have a contactId property which points to a contact record.
  • Has-many: A record of resource A has zero or more records of resource B that points to it. Example: invoice records have zero or more invoiceLine records that have an invoiceId property that points back. A has-many relationship always implies a belongs-to relationship on the inverse resource.

Normally when you GET a resource that has a relationships, the belongs-to relationship will be presented as the name of the property suffixed with Id and contain the ID. If you GET /v2/invoices/123 and it responds with a "contactId": "987", you can get the contact by requesting GET /v2/contacts/987. Has-many relationships won't be in the request per default.

Requesting sideloaded or embedded records

You can include relationships by adding an include parameter to your GET request. The value of the include parameter should be on the form resource.property:mode[,resource.property:mode,...], where resource is the name of a resource, property is the name of a property of that resource, and mode is either sideload (default if the : part is omitted) or embed. You can include multiple relationships by separating them with ,.

Example: You can load invoices with its invoiceLines embedded, its contacts sideloaded, and the contact's country embedded by doing GET /invoices?include=invoice.lines:embed,invoice.contact:sideload,contact.country:embed. The response will be something like:

{
  "invoices: [
    {
      "id": "invoice1",
      "contactId": "contact1",
      ...
      "lines": [
        {
          "id": "line1",
          ...
        },
        {
          "id": "line2",
          ...
        }
      ]
    }
  ],
  "contacts: [
    {
      "id": "contact1",
      "country": {
        "id": "DK",
        "name": "Denmark",
        ...
      },
      ...
    }
  ]
}

When sideloading belongs-to relationships the name of the key is the singular name of the resource suffixed with Id (like the default behavior), and each sideloaded record can be found in a root key named after the plural name of the belongs-to inverse resource. It's recommended to sideload records instead of embedding, to avoid duplication (each belongs-to record is only included in the response once).

When embedding belongs-to relationships the name of the key is the singular name of the resource, e.g. contact and it contains all of the record's properties.

When sideloading has-many relationships all the child IDs are included as an array of strings in the parent record in a key named after the relationship's name (not the inverse resource) suffixed with Ids.

When embedding has-many relationships all the full child records are included as an array of hashes in the parent record in a key named after the relationship's name (not the inverse resource).

Saving embedded records

Some resources supports saving child records embedded. An example is invoices. A POST /v2/invoices's request body could look like this:

{
  "invoice": {
    "invoiceNo": 41,
    ...
    "lines:" [
      {
        "productId": "...",
        "unitPrice": 100,
        ...
      }
    ]
  }
}

It is advantageous to embed records when possible, as you get fewer round trips to the API, and everything happens as an atomic transaction (either all or no records are saved).

Paging

You can limit long lists of resources using the paging URL params.

To use pages, you can use page and pageSize. E.g. to get the second page having 20 records per page you would request GET /v2/invoices?page=2&pageSize=20.

If you like using indexes/offsets better you use offset and pageSize. E.g. to get 51 records starting at record at zero-index-based 78, you would request GET /v2/invoices?offset=51&pageSize=78.

pageSize cannot be greater than 1000 (which is also the default if pageSize is omitted).

Whether your results are truncated/paged can be found in the meta.paging key in the response. It will look something like:

{
  "meta": {
    "paging": {
      "page": 4,
      "pageCount": 9,
      "pageSize": 20,
      "total": 192,
      "firstUrl": "https://api.billysbilling.com/v2/invoices?pageSize=20",
      "previousUrl": "https://api.billysbilling.com/v2/invoices?page=3&pageSize=20",
      "nextUrl": "https://api.billysbilling.com/v2/invoices?page=5&pageSize=20",
      "lastUrl": "https://api.billysbilling.com/v2/invoices?page=9&pageSize=20"
    }
  },
  "invoices": [...]
}

Filtering

When listing most resources you can filter the results by various properties.

Sorting

When listing most resources you can sort the results using the sortProperty and sortDirection URL params. Each resource only allows specific properties to be sorted by. Which ones are noted in each resource's documentation. The sortDirection must be either ASC (default) or DESC.

Code examples

PHP

<?php

//Define a reusable class for sending requests to the Billy's Billing API
class BillyClient {
    private $accessToken;
    
    public function __construct($accessToken) {
    	$this->accessToken = $accessToken;
    }

    public function request($method, $url, $body = null) {
        $headers = array("X-Access-Token: " . $this->accessToken);
        $c = curl_init("https://api.billysbilling.com/v2" . $url);
        curl_setopt($c, CURLOPT_CUSTOMREQUEST, $method);
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        if ($body) {
            curl_setopt($c, CURLOPT_POSTFIELDS, json_encode($body));
            $headers[] = "Content-Type: application/json");
        }
        curl_setopt($c, CURLOPT_HTTPHEADER, $headers);
        $res = curl_exec($c);
        $body = json_decode($res);
        $info = curl_getinfo($c);
        return (object)array(
            'status' => $info['http_code'],
            'body' => $body
        );
    }
}

$client = new BillyClient("INSERT ACCESS TOKEN HERE");

//Get organization
$res = $client->request("GET", "/organization");
if ($res->status !== 200) {
    echo "Something went wrong:\n\n";
    print_r($res->body);
    exit;
}
$organizationId = $res->body->organization->id;

//Create a contact
$res = $client->request("POST", "/contacts", array(
    'contact' => array(
        'organizationId' => $organizationId,
        'name' => "Arnold",
        'countryId' => "DK"
    )
));
if ($res->status !== 200) {
    echo "Something went wrong:\n\n";
    print_r($res->body);
    exit;
}
$contactId = $res->body->contacts[0]->id;

//Get the contact again
$res = $client->request("GET", "/contacts/" . $contactId);
print_r($res->body);

Node.js

First run npm install async request.

var async = require('async'),
    request = require('request');

var accessToken = 'INSERT ACCESS TOKEN HERE';

//Define a reusable function to send requests to the Billy's Billing API
var billyRequest = function(method, url, body, callback) {
	body = body || {}
	request({
		url: 'https://api.billysbilling.com/v2' + url,
		method: method,
		headers: {
			'X-Access-Token': accessToken,
			'Content-Type': 'application/json'
		},
		body: JSON.stringify(body)
	}, function(err, res, body) {
		if (err) {
			callback(err);
		} else {
			callback(null, {
				status: res.statusCode,
				body: JSON.parse(body)
			});
		}
	});
};

var organizationId, contactId;

async.series([
	function(callback) {
		//Get organization
		billyRequest('GET', '/user/organizations', {}, function(err, res) {
			if (err) {
				callback(err);
			} else if (res.status !== 200) {
				console.log('Something went wrong:');
				console.log(res.body);
				process.exit();
			} else {
				organizationId = res.body.organizations[0].id;
				callback();
			}
		});
	},
	function(callback) {
	  //Create a contact
		billyRequest('POST', '/contacts', {
			contact: {
				organizationId: organizationId,
				name: 'Arnold',
				countryId: 'DK'
			}
		}, function(err, res) {
			if (err) {
				callback(err);
			} else if (res.status !== 200) {
				console.log('Something went wrong:');
				console.log(res.body);
				process.exit();
			} else {
				contactId = res.body.contacts[0].id;
				callback();
			}
		});
	},
	function(callback) {
	  //Get the contact
		billyRequest('GET', '/contacts/' + contactId, {}, function(err, res) {
			if (err) {
				callback(err);
			} else if (res.status !== 200) {
				console.log('Something went wrong:');
				console.log(res.body);
				process.exit();
			} else {
				console.log(res.body);
				callback();
			}
		});
	}
], function(err) {
	if (err) {
		console.log(err);
	}
	process.exit();
});

Use case examples

Posting a payment for an invoice

When you want to mark an invoice as paid, you have to create a bank payment that matches the invoice's amount. Let's say you have just created an invoice with ID inv-1234 with a total amount due of 1,200 USD. This is how you would create the payment

POST https://api.billysbilling.com/v2/bankPayments

{
	"bankPayment": {
		"organizationId": "YOUR ORGANIZATION ID",
		"entryDate": "2014-01-16",
		"cashAmount": 1200,
		"cashSide": "debit",
		"cashAccountId": "BANK ACCOUNT ID",
		"associations": [
			{
				"subjectReference": "invoice:inv-1234"
			}
		]
	}
}

cashAccountId is the account that an amount of cashAmount was deposited to/withdrawn on. cashSide: "debit" means a deposit (what you use for invoices). cashSide: "credit" means a withdrawal (what you use for bills).

Each item in the associations array is a balance modifier. Since payments can pay different types of models (invoices, bills, etc.), you add the invoice to the payment by using a "reference", which is a type concatenated with a colon concateneted with an ID, e.g. invoice:inv-1234.

The currency of the payment is determined by the associations. This means that all the associations have to point to subjects in the same currency, i.e. you can't pay a USD invoice together with en EUR invoice. This currency is called subjectCurrency, if you GET the bank payment later from the API. If the subjectCurrency is different from the currency of cashAccount, you also need to set a cashExchangeRate. In this example we assume that the cashAccount is in USD.

After this call our example invoice (of 1,200 USD) will be paid, which visible through the invoice's isPaid property, which ill be true, and it's balance property, which will be 0.0.

The organizationId is only necessary if you are using an access token that's tied to a user (i.e. not an organization), or if you are using Basic Auth. You can list your user's organizations through GET /v2/user/organizations.

Posting a product with default price(s)

When POSTing to /v2/products, you can embed product prices this way:

POST https://api.billysbilling.com/v2/products

{
	"product": {
		"organizationId": "YOUR ORGANIZATION ID",
		"name": "Bat capes",
		"accountId": "REVENUE ACCOUNT ID",
		"salesTaxRulesetId": "SALES TAX RULESET ID"
		"prices": [
			{
				"unitPrice": 14000,
				"currencyId": "USD"
			},
			{
				"unitPrice": 10000,
				"currencyId": "EUR"
			}
		]
	}
}

The organizationId is only necessary if you are using an access token that's tied to a user (i.e. not an organization), or if you are using Basic Auth. You can list your user's organizations through GET /v2/user/organizations.

Resource documentation

In the following you can see an extensive list of all the resources that you can interact with.

Besides all the standard resources there are also a number of "special" routes with which you can interact with the resources. Such as sending an invoice as email. These are currently not documented.

Table of Contents

Resources

/v2/accountGroups

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
nature belongs-to -
name string -
description string -

/v2/accountNatures

Supports: get by id, list, create, update, bulk save, bulk delete

Property Type Description Notes
name string -

/v2/accounts

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
name string - required
accountNo string -
description string -
group belongs-to - required
nature belongs-to - default: unknown
systemRole enum -
currency belongs-to -
taxRate belongs-to -
isPaymentEnabled boolean -
isBankAccount boolean -
isArchived boolean -
commentAssociations has-many Comment associations for the account. readonly

/v2/attachments

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
createdTime datetime - readonly
owner belongs-to-reference - required
file belongs-to The ID of the file to attach. required
priority integer -

/v2/balanceModifiers

Supports: get by id, list, create, update, bulk save, bulk delete

Property Type Description Notes
modifier belongs-to-reference - required
subject belongs-to-reference - required
amount float Balance modifier amount. readonly
entryDate date Date of balance modifier entry readonly
realizedCurrencyDifference float - readonly
isVoided boolean - readonly

/v2/bankLineMatches

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
account belongs-to The ID of the account to create the bank line match for. required
differenceType enum If there is a difference, this value determines its type.
feeAccount belongs-to The ID of the account to add the bank fee to. required
entryDate date -
amount float -
side enum -
isApproved boolean Whether the bank lines and subjects are approved.
lines has-many Lines for this bank line match. If this parameter is set, any existing lines for this bank line match will be deleted before adding the new ones. readonly
subjectAssociations has-many Subject associations for the bank line match. If this parameter is set, any existing subject associations for this bank line match will be deleted before adding the new ones. readonly

/v2/bankLines

Supports: get by id, list, create, update, bulk save, bulk delete

Property Type Description Notes
match belongs-to - required
account belongs-to The ID of the account to create the bank line match for. required
entryDate date - required
description string - required
amount float - required
side enum - required

/v2/bankLineSubjectAssociations

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
match belongs-to - required
subject belongs-to-reference The reference of the subject. required

/v2/bankPayments

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
contact belongs-to The contact that all of the associations' subjects belong to. Will be automatically inferred from the supplied subjects by the API. readonly
createdTime datetime When the payment record was created in the system. readonly
entryDate date The date of the transaction. required
cashAmount float The amount that was deposited into or withdrawn from cashAccount in the account's currency.
cashSide enum Indicates whether the payment was a deposit (debit) or a withdrawal (credit). Must be set if cashAmount is set. required
cashAccount belongs-to The account that an amount was deposited into or withdrawn from. Must have isPaymentEnabled set to true. Must be set if cashAmount is set. required
cashExchangeRate float The exchange rate between cashAccount's currency and subjectCurrency. 1 cashAccountCurrency = cashExchangeRate subjectCurrency. Must be set if cashAmount is set and if cashAccount's currency is different than subjectCurrency. Will be ignored and set to 1 if the currencies are the same. required
feeAmount float Used if the bank or payment provider charged the organization a fee for handling this payment. The fee amount must be positive, and will always be recorded as an expense (i.e. a debit posting on an expense account). The currency of feeAmount must be the same as the currency of cashAmount. The fee is always considered the organization's expense. This means that: - For deposits the subjects' balances will also be offset against the fee, as the customer shouldn't pay for the organization's payment expenses. Example: An invoice of 100 USD will be paid in full by a cashAmount of 95 and a feeAmount of 5. - For withdrawals the subject's balances will not be offset against the fee, as the supplier shouldn't pay for the organization's payment expenses. Example: An bill of 100 USD will be paid in full by a cashAmount of 100 and a feeAmount of any size. Can only be used if cashAmount is set.
feeAccount belongs-to The account to record the fee expense on. Must be an expense account. Must be set if feeAmount is set. required
feeIsIncluded boolean TODO
useCredit boolean Use credit from contact's balance.
isVoided boolean Indicates if the payment has been voided. You must leave this field blank or set to false for new payments. Once a payment has been voided by setting this field to true it can't be unvoided again.
contactAmount float Automatically set by the API and indicates if this payment had any influence on the contact's balance, i.e. if the contact owes the organization money or vice versa. If you for example submit a payment with a cashAmount greater than an invoice's balance, the remaining amount will go towards the contact's balance as a prepayment (the organization will owe the contact money). readonly
contactSide enum This field is automatically set by the API and have the following meaning: - debit means that the contact owes the organization contactAmount (the amount was debited on an asset account). - credit means that the organization owes the contact contactAmount (the amount was credited on a liability account). The amounts are in the currency of subjectCurrency. readonly
subjectAmount float Automatically set by the API to the amount that went towards the subjects' balance. If for example you made a full payment of an invoice with an outstanding balance of 100 USD, this field will be set to 100. readonly
subjectSide enum Automatically set by the API and works with subjectAmount. - debit means that the subjects were mainly bills or invoice credit notes (a withdrawal). - credit means that the subjects were mainly invoices or bill credit notes (a deposit). readonly
subjectCurrency belongs-to Automatically inferred by the API based on the subjects' currency. readonly
associations has-many The subjects that this payment involves. The subjects' outstanding balance and isPaid properties will automatically be updated by the API. required
commentAssociations has-many Comment associations for the payment. readonly

/v2/billLines

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
bill belongs-to - required
account belongs-to - required
taxRate belongs-to -
description string - required
amount float - required
tax float - readonly
priority integer -

/v2/bills

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
type enum -
createdTime datetime - readonly
approvedTime datetime - readonly
contact belongs-to - required
contactName string -
entryDate date - required
paymentAccount belongs-to -
paymentDate date - required
dueDate date -
isBare boolean -
state enum - default: "draft"
suppliersInvoiceNo string -
voucherNo string Voucher number for the bill
amount float - readonly
tax float - readonly
currency belongs-to - required
exchangeRate float - default: unknown
balance float - readonly
isPaid boolean - readonly
lineDescription string - readonly
creditedBill belongs-to -
creditNotes has-many - readonly
lines has-many -
attachments has-many -
balanceModifiers has-many Payment associations for the bill. readonly
commentAssociations has-many Comment associations for the bill. readonly
source string Source of the bill. readonly
subject string Original subject of the bill. readonly

/v2/brands

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
name string Name of the organization branding package required
invoiceSubject string Default email subject for invoices required
invoiceBody string Default email body for invoices required
invoiceReminderSubject string Default email subject for invoice reminders required
invoiceReminderBody string Default email body for invoice reminders required
contactEmailTemplate string Template for contact emails. This will be populated by a default template if left blank. required

/v2/cities

Supports: get by id, list, create, update, bulk save, bulk delete

Property Type Description Notes
name string -
county string -
state belongs-to -
country belongs-to -

/v2/commentAssociations

Supports: get by id, list, create, update, bulk save, bulk delete

Property Type Description Notes
comment belongs-to Comment to associate the record with. required
owner belongs-to-reference Record to associate the comment with. required

/v2/comments

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
createdTime datetime - readonly
authorUser belongs-to -
isSystemComment boolean - readonly
message string - required
associations has-many - required

/v2/contactBalances

Supports: get by id, list, create, update, bulk save, bulk delete

Property Type Description Notes
contact belongs-to Contact to which the balance belongs. readonly
currency belongs-to Currency of the outstanding balance. readonly
amount float Amount of the outstanding balance. A positive amount can be used for payment. readonly
side enum - readonly

/v2/contactPersons

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
contact belongs-to - required
isPrimary boolean If contact person is primary for the parent contact.
name string The name of the contact person. Either name or email must be set. required
email string The contact person's e-mail. Used to mail invoices to the contact. Either name or email must be set.

/v2/contacts

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
type enum Whether contact is a company or a private entity. Defaults to company required, default: "company"
organization belongs-to - required
createdTime datetime - readonly
name string The name of the contact. Can be either a company name or a person's name. required
country belongs-to The contact's home/business country. required
street string The contact's street address.
city belongs-to The contact's city, if finite.
cityText string The contact's city, in text form.
state belongs-to The name of the contact's state, if finite.
stateText string The name of the contact's state, in text form.
zipcode belongs-to The contact's zipcode, if finite.
zipcodeText string The contact's zipcode, in text form.
contactNo string Arbitrary number (or string) that contacts can be referred to by.
phone string The contact's phone number.
fax string The contact's fax number.
currency belongs-to Default currency to use for invoices to the contact. Has no effect in the API, as currency for invoice always is required.
registrationNo string The contact's EU VAT number, CVR number in Denmark, TIN/EIN/SSN in US.
ean string The contact's EAN (European Article Number).
paymentTermsMode enum The contact's mode for payment terms, either daysAfter, currentMonth or followingMonth.
paymentTermsValue float For daysAfter mode, the number of net days. For currentMonth or followingMonth, the day of the month.
localeId string Locale to use in communications with the contact. The locale also decides which locale should be used on invoices to the contact.
brand belongs-to The contact's default organization brand.
isCustomer boolean Whether the contact is regarded as a customer and can have invoices etc.
isSupplier boolean Whether the contact is regarded as a supplier and can have bills etc.
contactPersons has-many You can add one or more contact persons for the contact. If this parameter is set, any existing contact persons for this contact will be deleted before adding the new ones.
balances has-many A contact can have balances in one or more currencies. This will list all the contact's balances. readonly
commentAssociations has-many Comment associations for the contact. readonly
accessCode string Used to generate the contact's customer portal URL.
emailAttachmentDeliveryMode enum Whether to deliver attachments by link to customer portal or with email attachments.

/v2/countryGroups

Supports: get by id, list, create, update, bulk save, bulk delete

Property Type Description Notes
name string -
icon string -
memberCountryIds string -

/v2/countries

Supports: get by id, list, create, update, bulk save, bulk delete

Property Type Description Notes
name string -
hasStates boolean -
hasFiniteStates boolean -
hasFiniteZipcodes boolean -
icon string -

/v2/currencies

Supports: get by id, list, create, update, bulk save, bulk delete

Property Type Description Notes
name string -
exchangeRate float -

/v2/daybookBalanceAccounts

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
daybook belongs-to - required
account belongs-to - required
priority integer - required

/v2/daybooks

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
isTransactionSummaryEnabled boolean - required
name string The name of the daybook. required
defaultContraAccount belongs-to -
balanceAccounts has-many Balance accounts to monitor.

/v2/daybookTransactionLines

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
daybookTransaction belongs-to - required
text string Line description.
account belongs-to @id@ of account line is to be applied to. Either @accountId@ or @accountNo@ must be filled in. required
taxRate belongs-to -
contraAccount belongs-to @id@ of account line is to be applied against.
amount float Amount of line. required
side enum "debit" or "credit" required
currency belongs-to - default: unknown
priority integer -

/v2/daybookTransactions

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
daybook belongs-to -
createdTime datetime - readonly
entryDate date The transaction entry date in YYYY-MM-DD format. required
voucherNo string A number or a string that identifies this transaction's voucher number, e.g. a bill.
description string Description of transaction.
extendedDescription string Extended/verbose description of transaction.
apiType string Method used to make the API call. This is for your notation only.
state enum - default: "draft"
priority integer -
lines has-many Lines for the transaction. At minimum one line must be supplied.
attachments has-many Attachments for the daybook transaction.

/v2/files

Supports: get by id, list, create, bulk save, bulk delete

Property Type Description Notes
createdTime datetime - readonly
fileName string - readonly
fileSize integer - readonly
fileType integer - readonly
isImage boolean - readonly
isPdf boolean - readonly
imageWidth integer - readonly
imageHeight integer - readonly
downloadUrl string - readonly

/v2/invoiceLateFees

Supports: get by id, list, create, update, bulk save, bulk delete

Property Type Description Notes
invoice belongs-to - required
createdTime datetime - readonly
entryDate date - required
flatFee float - required
percentageFee float - required
amount float - readonly
isVoided boolean -

/v2/invoiceLines

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
invoice belongs-to - required
product belongs-to The product to use for the line. required
description string Optional description to display under the product's name on the invoice.
quantity float The line's quantity. default: 1
unitPrice float The price per unit of the product. required
amount float - readonly
tax float - readonly
taxRate belongs-to - readonly
discountText string Text to display if the line has a discount.
discountMode enum How the discount should be calculated. Cash discount. The value of @discountValue@ will be subtracted from the line's amount. Percentage discount. The percentage value of @discountValue@ will be subtracted from the line's amount.
discountValue float Depending on @discountMode@, either an amount or a percentage value. Percentage value should be supplied as e.g. 25 for 25%. Required if @discountValue@ is set. ignored if @discountValue@ is not set.
priority integer -

/v2/invoiceReminderActions

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
scheme belongs-to Invoice reminder scheme the action belongs to. required
actionNo integer Chronological number of the action. readonly
daysPastDue integer Number of days the invoice is overdue to apply this action. required
subject string Subject of the reminder email that is sent to the customer. required
body string Message body of the reminder email that is sent to the customer. required
flatFee float Flat fee to apply to the invoice.
percentageFee float Percentage fee to apply to the invoice.

/v2/invoiceReminderAssociations

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
reminder belongs-to - required
invoice belongs-to - required
lateFee belongs-to - readonly

/v2/invoiceReminders

Supports: get by id, list, create, bulk save, bulk delete

Property Type Description Notes
organization belongs-to - required
contact belongs-to - required
createdTime datetime - readonly
associations has-many -
flatFee float -
percentageFee float -
feeCurrency belongs-to - required
sendEmail boolean -
contactPerson belongs-to - required
emailSubject string - required
emailBody string - required
copyToUser belongs-to -
downloadUrl string -

/v2/invoiceReminderSchemes

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
actions has-many You can add one or more reminder actions for the scheme. If this parameter is set, any existing reminder actions for this scheme will be deleted before adding the new ones.
name string Reminder scheme name. required
description string Reminder scheme description.
reminderLimit integer Don't send reminders more often than the following number of days.
isDefault boolean Whether or not the reminder scheme is the organization's default.
invoiceMinDueDate date Only process invoices due after the following date.
sendNotifications boolean Send a notification email when reminders and fees are processed for this scheme.

/v2/invoices

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
type enum Whether to create an invoice or a credit note. Defaults to @invoice@.
createdTime datetime - readonly
approvedTime datetime - readonly
contact belongs-to The ID of the contact to create the invoice for. required
attContactPerson belongs-to ID for a contact person belonging to the contact that should be included as Att: in the invoice address area.
entryDate date The invoice date. This parameter must not be set if the invoice has already been approved. required
dueDate date The due date for payment of the invoice.
state enum Used to change the state of the invoice. Currently the only state change possible is from draft to approved. Once an invoice has been approved, its state can't be changed. Omit from request body if state shouldn't be changed. required, default: "draft"
sentState enum Sent state of the email. Invoice is marked as unsent by default, can be marked as printed, sent, opened, viewed. required, default: "unsent"
invoiceNo string Manually set the invoice number. Invoice numbers has to be unique. If no invoice number is set when the invoice gets approved, it will automatically be assigned a number using the organization's invoice number model. This parameter must not be set if the invoice has already been approved.
taxMode enum -
amount float - readonly
tax float - readonly
currency belongs-to The currency of the invoice. All lines' @unitPrice@ parameter should be in this currency. required
exchangeRate float The exchange rate used for invoices in foreign currencies. The value should calculated like this: bq. @exchangeRate@ = @currency@ / @organization's base currency@ If this field is left blank, then today's exchange rate will automatically be used. If @currencyId@ equals the organization's base currency, the value of this field is ignored, i.e. it will always be 1. default: unknown
balance float - readonly
isPaid boolean - readonly
creditedInvoice belongs-to -
contactMessage string Optional message to the contact to display in the top of the invoice PDF.
lineDescription string Automatically generated based on its lines' 'descriptions.
downloadUrl string -
lines has-many Lines for the invoice. At minimum one line must be supplied. If this parameter is set, any existing lines for this invoice will be deleted before adding the new ones. This parameter must not be set if the invoice has already been approved. required
attachments has-many Attachments for the invoice.
lateFees has-many - readonly
balanceModifiers has-many Payment associations for the invoice. readonly
commentAssociations has-many Comment associations for the invoice. readonly

/v2/organizationInvitations

Supports: get by id, list, create, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
invitedByUser belongs-to Inviting user readonly
email string Email address of user being invited. required
createdTime datetime - readonly

/v2/organizationInvoices

Supports: get by id, list, create, update, bulk save, bulk delete

Property Type Description Notes
organization belongs-to - readonly
createdTime datetime - readonly
invoiceNo integer - readonly
state enum - readonly
amount float - readonly
tax float - readonly
printUrl string -

/v2/organizations

Supports: get by id, create, update, bulk save, bulk delete

Property Type Description Notes
ownerUser belongs-to - readonly
name string - required
url string - readonly
street string -
zipcode string -
city string -
country belongs-to - required
phone string -
fax string -
email string -
registrationNo string -
baseCurrency belongs-to - required
logoFile belongs-to Organization logo. readonly
logoPdfFile belongs-to Logo file to be used with PDFs. readonly
logoUrl string Full-size logo URL readonly
iconFile belongs-to Organization icon. readonly
iconUrl string Full-size icon URL readonly
icon48Url string 48x48 pixels icon URL readonly
bankName string Bank name.
bankRegNo string Bank registration no.
bankAccountNo string Bank account number.
fiscalYearEndMonth integer - required
firstFiscalYearStart date - required
firstFiscalYearEnd date - required
hasBillVoucherNo boolean Whether or not the organization has a bill voucher number
subscriptionCardType string -
subscriptionCardNumber string -
subscriptionCardExpires date -
isSubscriptionBankPayer boolean - readonly
subscriptionPrice float - readonly
subscriptionPeriod enum - required
subscriptionDiscount float - readonly
subscriptionExpires date - readonly
isTrial boolean - readonly
isTerminated boolean - readonly
brand belongs-to The contact's default organization brand.
localeId string The organization's default locale. Will be used for all contacts unless overridden on a contact level. required
billEmailAddress string An email can be sent to this address and its attachments will be processed into bills readonly
isUnmigrated boolean If this is true, the organization is not yet migrated to our new system. readonly
isLocked boolean If this is true, the organization is locked. readonly
lockedReason string Reason the organization is currently locked. readonly
appUrl string - readonly
emailAttachmentDeliveryMode enum Whether to deliver attachments by link to customer portal or with email attachments. required
hasVat boolean -
vatPeriod enum - required

/v2/organizationUserAccesses

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
user belongs-to - required

/v2/postings

Supports: get by id, list, create, update, bulk save, bulk delete

Property Type Description Notes
organization belongs-to - required
transaction belongs-to - readonly
entryDate date - readonly
text string - readonly
account belongs-to - readonly
amount float - readonly
side enum - readonly
currency belongs-to - readonly
balance float - readonly
vatReturn belongs-to - readonly
isVoided boolean - readonly
isBankMatched boolean - readonly
priority integer - readonly

/v2/productPrices

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
product belongs-to - required
unitPrice float Currency for the unit price. required
currency belongs-to The default unit price for invoice lines when the invoice's currency matches this currency. required

/v2/products

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
name string The name of the product. required
description string Optional description that will be used as default on invoice lines with this product.
account belongs-to The account that sales of the product should be coded to. required
productNo string A number (or string) that the organization identifies the product by.
suppliersProductNo string A number (or string) that the organization's supplier identifies the product by.
salesTaxRuleset belongs-to -
isArchived boolean -
prices has-many The product can have a unit price for each of the organization's currencies.

/v2/reportLayouts

Supports: get by id, list, update, bulk save, bulk delete

Property Type Description Notes
organization belongs-to - required
type enum -
items json -

/v2/salesTaxRules

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
ruleset belongs-to - required
country belongs-to - required
state belongs-to -
countryGroup belongs-to -
contactType enum -
taxRate belongs-to -
priority integer -

/v2/salesTaxRulesets

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
name string - required
abbreviation string -
description string -
fallbackTaxRate belongs-to -
isPredefined boolean - readonly
rules has-many -

/v2/scheduledInvoiceLines

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
contact belongs-to The ID of the contact to create the scheduled invoice line for.
scheduledInvoice belongs-to -
product belongs-to The product to use for the line. required
description string Optional description to display under the product's name on the invoice.
quantity float The line's quantity. default: 1
unitPrice float The price per unit of the product. required
discountText string Text to display if the line has a discount.
discountMode enum How the discount should be calculated. Cash discount. The value of @discountValue@ will be subtracted from the line's amount. Percentage discount. The percentage value of @discountValue@ will be subtracted from the line's amount.
discountValue float Depending on @discountMode@, either an amount or a percentage value. Percentage value should be supplied as e.g. 25 for 25%. Required if @discountValue@ is set. ignored if @discountValue@ is not set.
isRecurring boolean Whether the scheduled invoice line is one-time or recurring.

/v2/scheduledInvoices

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
createdTime datetime - readonly
contact belongs-to The ID of the contact to create the scheduled invoice for. required
isRecurring boolean Whether the scheduled invoice is one-time or recurring.
recurringInterval float The interval of units; 1 for every, 2 for every second, 3 for every third and so on. required
recurringUnit enum Unit of which interval and value is based on, either day, month, week, or year. required
recurringValue float The day to run the scheduled invoice on; day of the week, month, or year. required
nextInvoiceDate date The next date for which a scheduled invoice will be sent. required
endDate date The last date for which a scheduled invoice will be sent.
createMode enum The state of the invoices created by this scheduled invoice. Can either be draft, approve, or approveAndSend. default: "approveAndSend"
attContactPerson belongs-to ID for a contact person belonging to the contact that should be included as Att: in the invoice address area.
emailSubject string The subject of the email sent along with the invoice.
emailBody string The body of the email sent along with the invoice.
emailCopyToUser belongs-to ID of a user to receive a copy of the invoice, when create mode is set to approve and send.
dueMode enum The mode for how to determine due date. Can either be daysAfter, currentMonth or followingMonth.
dueValue float The value for the due mode; for days after, it is the number of days; and for current or following month, it is the day of the month.
contactMessage string Optional message to the contact to display in the top of the invoice PDF.
lines has-many Lines for the scheduled invoice.

/v2/states

Supports: get by id, list, create, update, bulk save, bulk delete

Property Type Description Notes
stateCode string -
name string -
country belongs-to -

/v2/taxRateDeductionComponents

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
taxRate belongs-to - required
share float - required
source enum - required
account belongs-to - required
priority integer -

/v2/taxRates

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
name string - required
abbreviation string -
description string -
rate float - required
appliesToSales boolean -
appliesToPurchases boolean -
isPredefined boolean - readonly
isActive boolean -
netAmountMetaField belongs-to -
deductionComponents has-many -

/v2/transactions

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
transactionNo integer - readonly
voucherNo string - readonly
createdTime datetime - readonly
entryDate date - readonly
originator belongs-to-reference - readonly
originatorName string - readonly
isVoided boolean - readonly
isVoid boolean - readonly
postings has-many - readonly
commentAssociations has-many Comment associations for the transaction. readonly

/v2/users

Supports: get by id, update, bulk save, bulk delete

Property Type Description Notes
name string User's full name. required
email string User's email address. required
phone string User's phone number.
profilePicFile belongs-to Profile picture of user.
profilePicUrl string -
profilePic48Url string -
isBillyStaff boolean Whether or not the user is a member of the Billy staff. readonly
isSupporter boolean Whether or not the user is a Billy supporter. readonly
isAdmin boolean Whether or not the user is a Billy admin. readonly

/v2/vatFields

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
account belongs-to - required
type enum - required
priority integer -

/v2/vatMetaFields

Supports: get by id, list, create, update, bulk save, delete, bulk delete

Property Type Description Notes
organization belongs-to - required
name string - required
description string -
priority integer -
isPredefined boolean -

/v2/vatReturnPayments

Supports: get by id, list, create, update, bulk save, bulk delete

Property Type Description Notes
vatReturn belongs-to - required
entryDate date - required
account belongs-to - required
amount float - readonly
side enum - readonly
isVoided boolean -

/v2/vatReturns

Supports: get by id, list, update, bulk save, bulk delete

Property Type Description Notes
organization belongs-to - readonly
createdTime datetime - readonly
periodType enum - readonly
period string - readonly
periodText string -
correctionNo integer - readonly
startDate date - readonly
endDate date - readonly
reportDeadline date -
isSettled boolean -
isPaid boolean - readonly

/v2/zipcodes

Supports: get by id, list, create, update, bulk save, bulk delete

Property Type Description Notes
zipcode string -
city belongs-to -
state belongs-to -
country belongs-to -
latitude float -
longitude float -
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment