Introduction
The Booqable API is a RESTful JSON API as such is designed to have predictable, resource-oriented URLs and to use HTTP response codes to indicate API errors. We use standard HTTP features, like HTTP authentication and HTTP verbs, which can be understood by off-the-shelf HTTP clients.
Endpoint
All API requests need to be directed to the correct company-specific endpoint. The format is as follows:
https://{company_slug}.booqable.com/api/boomerang/
Response types
The Booqable API supports two response types jsonapi
and json
.
By default, the API returns jsonapi
responses. These responses are designed to return graph data more efficiently and also include links to related resources.
You can, however, also request data in nested structure by appending .json
to the path of each request.
A typical JSON API response:
GET /api/boomerang/orders?include=customer
{
"data": [
{
"id": "54808378-a247-4715-89f6-0a8da2e7ad62",
"type": "orders",
"attributes": {
"starts_at": "2021-11-12T15:00:00+00:00",
"stops_at": "2021-11-13T15:00:00+00:00"
},
"relationships": {
"customer": {
"links": {
"related": "api/boomerang/customers/24e54970-7473-49a9-a71a-8c07eb97e510"
},
"data": {
"type": "customers",
"id": "24e54970-7473-49a9-a71a-8c07eb97e510"
}
}
}
}
],
"included": [
{
"id": "24e54970-7473-49a9-a71a-8c07eb97e510",
"type": "customers",
"attributes": {
"name": "John Doe"
},
"relationships": {
"properties": {
"links": {
"related": "api/boomerang/properties?filter[owner_id]=24e54970-7473-49a9-a71a-8c07eb97e510&filter[owner_type]=Customer"
}
}
}
}
],
"links": {
"self": "api/boomerang/orders?fields%5Bcustomer%5D=name&fields%5Borders%5D=starts_at%2Cstops_at&include=customer&page%5Bnumber%5D=1&page%5Bsize%5D=25",
"first": "api/boomerang/orders?fields%5Bcustomer%5D=name&fields%5Borders%5D=starts_at%2Cstops_at&include=customer&page%5Bnumber%5D=1&page%5Bsize%5D=25",
"last": "api/boomerang/orders?fields%5Bcustomer%5D=name&fields%5Borders%5D=starts_at%2Cstops_at&include=customer&page%5Bnumber%5D=1&page%5Bsize%5D=25"
},
"meta": {}
}
A JSON response:
GET /api/boomerang/orders.json?include=customer
{
"data": [
{
"id": "30d35575-c8d1-4f5c-b4c6-cc0abc32c6ed",
"starts_at": "2021-11-12T15:15:00+00:00",
"stops_at": "2021-11-13T15:15:00+00:00",
"customer": {
"id": "92ec8fee-423e-4f7e-8565-3e6028a0f437",
"name": "John Doe"
}
}
]
}
Fields
For every resource, fields can be written, read, filtered, sorted, and aggregated. The behavior of fields is described for each resource.
On every request, you can specify fields to be returned in the response. Note that you can also specify fields of included resources.
Including specific fields can be done like this:
?fields[orders]=starts_at,stops_at&fields[plannings]=reserved_from,reserved_till
Filtering
Collections returned in list requests can be filtered on specific fields; filters support the following operators:
Type | Operators |
---|---|
String | eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
Uuid | eq , not_eq |
Enum | eq , not_eq |
Integer | eq , not_eq , gt , gte , lt , lte |
Integer | eq , not_eq , gt , gte , lt , lte |
Big Decimal | eq , not_eq , gt , gte , lt , lte |
Float | eq , not_eq , gt , gte , lt , lte |
Boolean | eq |
Date | eq , not_eq , gt , gte , lt , lte |
DateTime | eq , not_eq , gt , gte , lt , lte |
Hash | eq |
Array | eq |
How to filter a request:
/api/boomerang/orders?filter[starts_at][gte]=1980-11-16T09:00:00+00:00&filter[starts_at][lte]=1990-11-16T09:00:00+00:00&filter[status]=reserved
Includes
The Booqable API consists of many resources related to each other. Therefore the API supports loading associated resources in a single request. Use the dot-syntax to deeply nest includes.
Including associated data:
GET api/boomerang/orders?include=customer,customer.properties
{
"data": {
"id": "f2afdb0e-55bd-4993-b9c2-4f04b569419d",
"type": "orders",
"attributes": {
"starts_at": "2021-11-12T16:00:00+00:00",
"stops_at": "2021-11-13T16:00:00+00:00"
},
"relationships": {
"customer": {
"links": {
"related": "api/boomerang/customers/404021af-c889-4d72-9296-481640f4c750"
},
"data": {
"type": "customers",
"id": "404021af-c889-4d72-9296-481640f4c750"
}
},
}
},
"included": [
{
"id": "404021af-c889-4d72-9296-481640f4c750",
"type": "customers",
"attributes": {
"name": "John Doe"
},
"relationships": {
"properties": {
"links": {
"related": "api/boomerang/properties?filter[owner_id]=404021af-c889-4d72-9296-481640f4c750&filter[owner_type]=Customer"
},
"data": [
{
"type": "properties",
"id": "9625bd15-732e-4301-8c1c-f5b3e03c1bed"
}
]
},
}
},
{
"id": "9625bd15-732e-4301-8c1c-f5b3e03c1bed",
"type": "properties",
"attributes": {
"name": "Phone",
"value": "+31600000000"
},
"relationships": {
"owner": {
"links": {
"related": "api/boomerang/customers/404021af-c889-4d72-9296-481640f4c750"
}
}
}
}
],
"meta": {}
}
Stats
Results from list requests can be aggregated by providing stats. These stats are always computed over the unpaginated filtered collection. The following aggregations are supported: count
, count_each
, average
, sum
, maximum
, minimum
. You can supply multiple types for each field.
Example of how to request stats:
?stats[to_be_paid_in_cents][]=sum&stats[grand_total_in_cents][]=average&stats[grand_total_in_cents][]=sum&stats[total]=count&stats[payment_status]=count
"meta": {
"stats": {
"to_be_paid_in_cents": {
"sum": 79000
},
"grand_total_in_cents": {
"average": 25000,
"sum": 1198000
},
"total": {
"count": 237
},
"payment_status": {
"count": {
"payment_due": 161,
"paid": 51,
"partially_paid": 13,
"overpaid": 11,
"process_deposit": 1
}
}
}
}
Sideposting
Due to the nature of actions in the API, the API does not support official JSON API compliant side posting. Instead, actions are designed in a way that related resources are managed automatically.
There are a few exceptions though, in these cases, resources can be created or associated by setting:
{resource_name}_attributes
array of resources to create, update and associate.{resource_name}_ids
array of resources to associate.{resource_name}_id
id off the resource to associate.
When side posting is supported, it will be mentioned in the resource-specific documentation.
Advanced search
The following resources support advanced searching with POST requests:
- Order
- Item
- Bundle
- ProductGroup
- Product
- Document
- Planning
- Customer
With advanced search you can make logical filter groups with and/or operators. The example on the right yields:
(starts_at >= date AND starts_at <= date) OR (stops_at >= date AND stops_at <= date)
{
"filter": {
"conditions": {
"operator": "or",
"attributes": [
{
"operator": "and",
"attributes": [
{
"starts_at": {
"gte": "2022-04-27T12:54:37Z"
}
},
{
"starts_at": {
"lte": "2022-04-30T12:54:37Z"
}
}
]
},
{
"operator": "and",
"attributes": [
{
"stops_at": {
"gte": "2022-04-27T12:54:37Z"
}
},
{
"stops_at": {
"lte": "2022-04-30T12:54:37Z"
}
}
]
}
]
}
}
}
Authentication
To interact with the Booqable API, first, you have to have a means of authentification, here's how to setup authentication.
Access Token
- Go to your account settings page
{company-name-here}.booqable.com/employees/current
- Name your new token
- Click "Create new authentication method"
You can manage your Access Tokens from your account. You can have multiple Access Tokens active at one time.
Example of an authorized request
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/customers' \
--header 'Authorization: Bearer 9bcabeaa827810ad6383d2e15feab2d0c7d039093e22fdd955f11fe83437a32a'
You authenticate to the Booqable API by providing on of your Access Tokens in the request.
Request signing
Single-Use Tokens to sign requests are generated on the client and can only be used once for one particular request. The Booqable API supports the following signing algorithms:
ES256
RS256
HS256
- Go to your account settings page
{company-name-here}.booqable.com/employees/current
- Name your new authentication method
- Insert your public key (for
ES256
andRS256
only) - Click "Create new authentication method"
You can manage your authentication methods from your account. You can have multiple authentication methods active at one time.
Signing a request (in Ruby, other languages should work like this as well)
# To prevent tampering with the request (making a DELETE from a GET, or posting different params with
# the same signature) we include all request data in the data value. Note that we generate a SHA256 from it.
request_method = 'POST'
# Encoded request params
fullpath = '/api/boomerang/orders/?filter%5Bcreated_at%5D%5Bgte%5D%3D1231232131132'
# Base64 encoded SHA256 body
body = '{"note":"Let me in!"}'
encoded_body = Base64.strict_encode64(::OpenSSL::Digest::SHA256.new(body).digest)
# Compute data value
data = Base64.strict_encode64(
::OpenSSL::Digest::SHA256.new([request_method, fullpath, encoded_body].join('.').join('.')).digest
)
# Generate a unique request identifier (can be anything unique)
uuid = Digest::UUID.uuid_v4
# We define the authentication method id (which you have obtained in a previous step) and kind in the header
headers = { kid: authentication_method_id, kind: 'single_use' }
payload = {
iss: 'http://company-name.booqable.com',
sub: employee_id,
aud: company_id,
exp: (Time.current + 10.minutes).to_i, # Can not exceed 10 minutes
iat: Time.current.to_i,
jti: "#{uuid}.#{data}"
}
# Note that with HS256 you don't have to supply a public key but a secret is generated for you.
token = JWT.encode payload, private_key, 'ES256', headers
token #=> eyJraWQiOiIwZTJkM2I2YS00OTU0LTQyZTItYTAyNS1kYjMzODE1ZDU2YzUiLCJraW5kIjoic2luZ2xlX3VzZSIsImFsZyI6IkVTMjU2In0.eyJpc3MiOiJodHRwOi8vY29tcGFueS1uYW1lLmJvb3FhYmxlLmNvbSIsInN1YiI6IjVlMWViZmFmLWM5YmEtNDMyOC1hM2U1LThlNzNmZGQ1NGNiOSIsImF1ZCI6IjE4ZGI4YTE0LThhYzctNDE1OS05NmJkLTMxMzI0NmRhYTExMCIsImV4cCI6MTYzNTk0ODk3MiwiaWF0IjoxNjM1OTQ4MzcyLCJqdGkiOiJmMTNkZjNlOC0zMWNjLTQxYTUtOWVlNy1mZjgzMTdmNWQ0Y2EuVUU5VFZDNHZQMlpwYkhSbGNpVTFRbU55WldGMFpXUmZZWFFsTlVRbE5VSm5kR1VsTlVRbE0wUXhNak14TWpNeU1UTXhNVE15TGpWemNGcEhSak5IZFdVeVoycFZRVVZ3ZUhsVll6VTVVbTlIZW5sb2NHMXNWbVo0WlVGNVRrSlZUazA5In0.7S2eI3R6meFPPgZ5iyZQOsTDBHRCihKozKMjvIrNHeYoEsxzKltQhGjb2rnfSlpGrCL38-ub-FTs5EXP39rJfw
The algorithm to generate the data value in the payload looks like this:
Base64(
SHA256(
[
request_method,
encoded_request_fullpath_with_paramaters,
Base64(
SHA256(request_body)
)
].join('.')
)
)
Example of an authorized request
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/customers' \
--header 'Authorization: Bearer eyJraWQiOiIwZTJkM2I2YS00OTU0LTQyZTItYTAyNS1kYjMzODE1ZDU2YzUiLCJraW5kIjoic2luZ2xlX3VzZSIsImFsZyI6IkVTMjU2In0.eyJpc3MiOiJodHRwOi8vY29tcGFueS1uYW1lLmJvb3FhYmxlLmNvbSIsInN1YiI6IjVlMWViZmFmLWM5YmEtNDMyOC1hM2U1LThlNzNmZGQ1NGNiOSIsImF1ZCI6IjE4ZGI4YTE0LThhYzctNDE1OS05NmJkLTMxMzI0NmRhYTExMCIsImV4cCI6MTYzNTk0ODk3MiwiaWF0IjoxNjM1OTQ4MzcyLCJqdGkiOiJmMTNkZjNlOC0zMWNjLTQxYTUtOWVlNy1mZjgzMTdmNWQ0Y2EuVUU5VFZDNHZQMlpwYkhSbGNpVTFRbU55WldGMFpXUmZZWFFsTlVRbE5VSm5kR1VsTlVRbE0wUXhNak14TWpNeU1UTXhNVE15TGpWemNGcEhSak5IZFdVeVoycFZRVVZ3ZUhsVll6VTVVbTlIZW5sb2NHMXNWbVo0WlVGNVRrSlZUazA5In0.7S2eI3R6meFPPgZ5iyZQOsTDBHRCihKozKMjvIrNHeYoEsxzKltQhGjb2rnfSlpGrCL38-ub-FTs5EXP39rJfw
You authenticate to the Booqable API by signing the request.
Errors
The Booqable API uses the following error codes:
Error Code | Meaning |
---|---|
400 | Bad Request -- Your request is invalid. |
401 | Unauthorized -- You are not authenticated. |
403 | Forbidden -- The resource requested is hidden for administrators only. |
404 | Not Found -- The specified resource could not be found. |
405 | Method Not Allowed -- You tried to access a resource with an invalid method. |
406 | Not Acceptable -- You requested a format that isn't json. |
410 | Gone -- The resource requested has been removed from our servers. |
418 | I'm a teapot. |
422 | Unprocessible Entity -- Something wen't wrong saving your data. |
429 | Too Many Requests -- You're doing too many requests! Slow down! |
500 | Internal Server Error -- We had a problem with our server. Try again later. |
503 | Service Unavailable -- We're temporarily offline for maintenance. Please try again later. |
Resources
Barcodes
You can assign barcodes to products (or their variations), individually tracked stock items, and customers (for use on a customer card, for example).
Booqable supports the following barcode formats:
- QR code: QR codes are flexible in size, have high fault tolerance, and fast readability.
- EAN-8: Ideal for identifying small items, stores eight digits.
- EAN-13: Can store a relatively large amount of data (13 digits) in a small area.
- Code 39: Stores both digits and characters. The size of the barcode makes them unsuitable to use on small items.
- Code 93: A more compact alternative to Code 39 (about 25% shorter).
- Code 128: A high-density barcode that can store any character of the ASCII 128 character set.
Note that when using URLs as numbers, it's advised to base64 encode the number before filtering.
Endpoints
GET /api/boomerang/barcodes
GET /api/boomerang/barcodes/{id}
POST /api/boomerang/barcodes
PUT /api/boomerang/barcodes/{id}
DELETE /api/boomerang/barcodes/{id}
Fields
Every barcode has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
number |
String The barcode data, can be a number, code or url. Leave blank to let Booqable create one. When using a URL, it's advised to base64 encode the number before filtering. |
barcode_type |
String One of code39 , code93 , code128 , ean8 , ean13 , qr_code |
image_url |
String readonly The barcode as an image |
owner_id |
Uuid ID of its owner |
owner_type |
String The resource type of the owner. One of orders , products , customers , stock_items |
Relationships
Barcodes have the following relationships:
Name | Description |
---|---|
owner |
Customer, Product, Order, Stock item Associated Owner |
Listing barcodes
How to fetch a list of barcodes:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/barcodes' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "2bebb230-3665-4a80-aa45-d9a7a3b571cb",
"type": "barcodes",
"attributes": {
"created_at": "2024-09-30T09:29:30.724393+00:00",
"updated_at": "2024-09-30T09:29:30.724393+00:00",
"number": "http://bqbl.it/2bebb230-3665-4a80-aa45-d9a7a3b571cb",
"barcode_type": "qr_code",
"image_url": "http://company-name-284.lvh.me:/barcodes/2bebb230-3665-4a80-aa45-d9a7a3b571cb/image",
"owner_id": "a507a1fc-433b-433a-9a79-db0c7ceb5996",
"owner_type": "customers"
},
"relationships": {}
}
],
"meta": {}
}
How to find an owner by a barcode number:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/barcodes?filter%5Bnumber%5D=http%3A%2F%2Fbqbl.it%2Fbbf256d7-a28a-48d0-92eb-f42398951c6b&include=owner' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "bbf256d7-a28a-48d0-92eb-f42398951c6b",
"type": "barcodes",
"attributes": {
"created_at": "2024-09-30T09:29:31.380154+00:00",
"updated_at": "2024-09-30T09:29:31.380154+00:00",
"number": "http://bqbl.it/bbf256d7-a28a-48d0-92eb-f42398951c6b",
"barcode_type": "qr_code",
"image_url": "http://company-name-285.lvh.me:/barcodes/bbf256d7-a28a-48d0-92eb-f42398951c6b/image",
"owner_id": "24b091cf-73bf-4b92-a786-51152386a240",
"owner_type": "customers"
},
"relationships": {
"owner": {
"data": {
"type": "customers",
"id": "24b091cf-73bf-4b92-a786-51152386a240"
}
}
}
}
],
"included": [
{
"id": "24b091cf-73bf-4b92-a786-51152386a240",
"type": "customers",
"attributes": {
"created_at": "2024-09-30T09:29:31.328043+00:00",
"updated_at": "2024-09-30T09:29:31.382077+00:00",
"archived": false,
"archived_at": null,
"number": 1,
"name": "John Doe",
"email": "[email protected]",
"deposit_type": "default",
"deposit_value": 0.0,
"discount_percentage": 0.0,
"legal_type": "person",
"email_marketing_consented": false,
"email_marketing_consent_updated_at": null,
"properties": {},
"tag_list": [],
"merge_suggestion_customer_id": null,
"tax_region_id": null
},
"relationships": {}
}
],
"meta": {}
}
How to find an owner by a barcode number containing a url:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/barcodes?filter%5Bnumber%5D=aHR0cDovL2JxYmwuaXQvNjE2MGE3MmEtMWVkNC00MTkxLWFjZGEtZGM2MGJmNTA5ODgz&include=owner' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "6160a72a-1ed4-4191-acda-dc60bf509883",
"type": "barcodes",
"attributes": {
"created_at": "2024-09-30T09:29:30.141784+00:00",
"updated_at": "2024-09-30T09:29:30.141784+00:00",
"number": "http://bqbl.it/6160a72a-1ed4-4191-acda-dc60bf509883",
"barcode_type": "qr_code",
"image_url": "http://company-name-283.lvh.me:/barcodes/6160a72a-1ed4-4191-acda-dc60bf509883/image",
"owner_id": "95638f66-86c9-4460-8c61-266bc140359b",
"owner_type": "customers"
},
"relationships": {
"owner": {
"data": {
"type": "customers",
"id": "95638f66-86c9-4460-8c61-266bc140359b"
}
}
}
}
],
"included": [
{
"id": "95638f66-86c9-4460-8c61-266bc140359b",
"type": "customers",
"attributes": {
"created_at": "2024-09-30T09:29:30.097956+00:00",
"updated_at": "2024-09-30T09:29:30.143872+00:00",
"archived": false,
"archived_at": null,
"number": 2,
"name": "John Doe",
"email": "[email protected]",
"deposit_type": "default",
"deposit_value": 0.0,
"discount_percentage": 0.0,
"legal_type": "person",
"email_marketing_consented": false,
"email_marketing_consent_updated_at": null,
"properties": {},
"tag_list": [],
"merge_suggestion_customer_id": null,
"tax_region_id": null
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/barcodes
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=owner |
fields[] |
Array List of comma seperated fields to include ?fields[barcodes]=created_at,updated_at,number |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
number |
String eq |
barcode_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
owner_id |
Uuid eq , not_eq |
owner_type |
String eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request accepts the following includes:
owner
=>
photo
product
=>
photo
Fetching a barcode
How to fetch a barcode:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/barcodes/70b5308b-1300-4c06-a015-cc9bed779abd?include=owner' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "70b5308b-1300-4c06-a015-cc9bed779abd",
"type": "barcodes",
"attributes": {
"created_at": "2024-09-30T09:29:28.104181+00:00",
"updated_at": "2024-09-30T09:29:28.104181+00:00",
"number": "http://bqbl.it/70b5308b-1300-4c06-a015-cc9bed779abd",
"barcode_type": "qr_code",
"image_url": "http://company-name-280.lvh.me:/barcodes/70b5308b-1300-4c06-a015-cc9bed779abd/image",
"owner_id": "26fed2a8-de83-484f-975e-82e6abfe2772",
"owner_type": "customers"
},
"relationships": {
"owner": {
"data": {
"type": "customers",
"id": "26fed2a8-de83-484f-975e-82e6abfe2772"
}
}
}
},
"included": [
{
"id": "26fed2a8-de83-484f-975e-82e6abfe2772",
"type": "customers",
"attributes": {
"created_at": "2024-09-30T09:29:28.056359+00:00",
"updated_at": "2024-09-30T09:29:28.106351+00:00",
"archived": false,
"archived_at": null,
"number": 1,
"name": "John Doe",
"email": "[email protected]",
"deposit_type": "default",
"deposit_value": 0.0,
"discount_percentage": 0.0,
"legal_type": "person",
"email_marketing_consented": false,
"email_marketing_consent_updated_at": null,
"properties": {},
"tag_list": [],
"merge_suggestion_customer_id": null,
"tax_region_id": null
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/barcodes/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=owner |
fields[] |
Array List of comma seperated fields to include ?fields[barcodes]=created_at,updated_at,number |
Includes
This request accepts the following includes:
owner
=>
photo
product
=>
photo
Creating a barcode
How to create a barcode:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/barcodes' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "barcodes",
"attributes": {
"barcode_type": "qr_code",
"owner_id": "e00a5801-28b8-4789-a2a8-2f13d0e31a8c",
"owner_type": "customers"
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "ad11fb6a-d98e-4ad4-949f-8a1e17f165ab",
"type": "barcodes",
"attributes": {
"created_at": "2024-09-30T09:29:32.186519+00:00",
"updated_at": "2024-09-30T09:29:32.186519+00:00",
"number": "http://bqbl.it/ad11fb6a-d98e-4ad4-949f-8a1e17f165ab",
"barcode_type": "qr_code",
"image_url": "http://company-name-286.lvh.me:/barcodes/ad11fb6a-d98e-4ad4-949f-8a1e17f165ab/image",
"owner_id": "e00a5801-28b8-4789-a2a8-2f13d0e31a8c",
"owner_type": "customers"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/barcodes
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=owner |
fields[] |
Array List of comma seperated fields to include ?fields[barcodes]=created_at,updated_at,number |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][number] |
String The barcode data, can be a number, code or url. Leave blank to let Booqable create one. When using a URL, it's advised to base64 encode the number before filtering. |
data[attributes][barcode_type] |
String One of code39 , code93 , code128 , ean8 , ean13 , qr_code |
data[attributes][owner_id] |
Uuid ID of its owner |
data[attributes][owner_type] |
String The resource type of the owner. One of orders , products , customers , stock_items |
Includes
This request accepts the following includes:
owner
=>
photo
product
=>
photo
Updating a barcode
How to update a barcode:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/barcodes/075fd9c4-c8d9-44b8-9184-67100e92ce60' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "075fd9c4-c8d9-44b8-9184-67100e92ce60",
"type": "barcodes",
"attributes": {
"number": "https://myfancysite.com"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "075fd9c4-c8d9-44b8-9184-67100e92ce60",
"type": "barcodes",
"attributes": {
"created_at": "2024-09-30T09:29:28.731046+00:00",
"updated_at": "2024-09-30T09:29:28.801079+00:00",
"number": "https://myfancysite.com",
"barcode_type": "qr_code",
"image_url": "http://company-name-281.lvh.me:/barcodes/075fd9c4-c8d9-44b8-9184-67100e92ce60/image",
"owner_id": "095fcacb-49ea-4667-adff-70416da9edd9",
"owner_type": "customers"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/barcodes/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=owner |
fields[] |
Array List of comma seperated fields to include ?fields[barcodes]=created_at,updated_at,number |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][number] |
String The barcode data, can be a number, code or url. Leave blank to let Booqable create one. When using a URL, it's advised to base64 encode the number before filtering. |
data[attributes][barcode_type] |
String One of code39 , code93 , code128 , ean8 , ean13 , qr_code |
data[attributes][owner_id] |
Uuid ID of its owner |
data[attributes][owner_type] |
String The resource type of the owner. One of orders , products , customers , stock_items |
Includes
This request accepts the following includes:
owner
=>
photo
product
=>
photo
Destroying a barcode
How to delete a barcode:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/barcodes/4919f616-b617-4c9a-bea2-9d4182bb2e6b' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "4919f616-b617-4c9a-bea2-9d4182bb2e6b",
"type": "barcodes",
"attributes": {
"created_at": "2024-09-30T09:29:29.335524+00:00",
"updated_at": "2024-09-30T09:29:29.335524+00:00",
"number": "http://bqbl.it/4919f616-b617-4c9a-bea2-9d4182bb2e6b",
"barcode_type": "qr_code",
"image_url": "http://company-name-282.lvh.me:/barcodes/4919f616-b617-4c9a-bea2-9d4182bb2e6b/image",
"owner_id": "c9010af9-6c3d-422f-95f7-7b5724fce58a",
"owner_type": "customers"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/barcodes/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=owner |
fields[] |
Array List of comma seperated fields to include ?fields[barcodes]=created_at,updated_at,number |
Includes
This request accepts the following includes:
owner
=>
photo
product
=>
photo
Bundle items
Bundle items define which products and product groups are associated with a bundle. When bundles are planned on an order the quantity and discount percentage defined in a bundle item will apply.
When product_id
is left blank, and the associated product group has variations,
the variation needs to be specified when adding this bundle to an order.
See the book_bundle
action under OrderFulfilments.
Endpoints
GET /api/boomerang/bundle_items
GET /api/boomerang/bundle_items/{id}
POST /api/boomerang/bundle_items
PUT /api/boomerang/bundle_items/{id}
DELETE /api/boomerang/bundle_items/{id}
Fields
Every bundle item has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
quantity |
Integer The quantity of the item |
discount_percentage |
Float The discount percentage for this product when rented out in a bundle |
position |
Integer Position of the product in bundle list |
bundle_id |
Uuid The associated Bundle |
product_group_id |
Uuid The associated Product group |
product_id |
Uuid nullable The associated Product |
Relationships
Bundle items have the following relationships:
Name | Description |
---|---|
bundle |
Bundles readonly Associated Bundle |
product |
Products readonly Associated Product |
product_group |
Product groups Associated Product group |
Listing bundle items
How to fetch a list of bundle items:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/bundle_items?filter%5Bbundle_id%5D=95f07da3-a5ff-4693-9e68-22d2d3e43929' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "7463819a-8a54-4568-b59c-19eb070f57b7",
"type": "bundle_items",
"attributes": {
"created_at": "2024-09-30T09:24:43.929588+00:00",
"updated_at": "2024-09-30T09:24:43.929588+00:00",
"quantity": 2,
"discount_percentage": 15.0,
"position": 1,
"bundle_id": "95f07da3-a5ff-4693-9e68-22d2d3e43929",
"product_group_id": "ddf70d38-e944-457a-a072-13cc4d6b7932",
"product_id": "82172ec1-c8be-4315-b3a0-47830db6b4bc"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/bundle_items
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=bundle,product,product_group |
fields[] |
Array List of comma seperated fields to include ?fields[bundle_items]=created_at,updated_at,quantity |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
quantity |
Integer eq , not_eq , gt , gte , lt , lte |
discount_percentage |
Float eq , not_eq , gt , gte , lt , lte |
position |
Integer eq , not_eq , gt , gte , lt , lte |
bundle_id |
Uuid eq , not_eq |
product_group_id |
Uuid eq , not_eq |
product_id |
Uuid eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request accepts the following includes:
bundle
product
=>
photo
product_group
=>
photo
Fetching a bundle item
How to fetch a bundle item:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/bundle_items/34a66201-01ff-41cd-ae47-b6103724c582' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "34a66201-01ff-41cd-ae47-b6103724c582",
"type": "bundle_items",
"attributes": {
"created_at": "2024-09-30T09:24:45.052703+00:00",
"updated_at": "2024-09-30T09:24:45.052703+00:00",
"quantity": 2,
"discount_percentage": 15.0,
"position": 1,
"bundle_id": "2d3aa99b-11c8-47c2-be69-15050c65af00",
"product_group_id": "234a18af-ecbc-4ddc-a4e3-48c29054042a",
"product_id": "36ab6d4d-a0b8-4e7d-812e-16e3613adb1b"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/bundle_items/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=bundle,product,product_group |
fields[] |
Array List of comma seperated fields to include ?fields[bundle_items]=created_at,updated_at,quantity |
Includes
This request accepts the following includes:
bundle
product
=>
photo
product_group
=>
photo
Creating a bundle item
How to create a bundle item:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/bundle_items' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "bundle_items",
"attributes": {
"bundle_id": "6e6769cc-b69a-4b30-bf3c-aa1a57d63506",
"product_group_id": "398447db-7cef-4cc2-b81b-0a81a8880c62",
"product_id": "e65f56ab-87cb-49ba-b2cc-a050575b089d",
"quantity": 2,
"discount_percentage": 15
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "f23eedb7-5b66-475d-8488-085940fea0ae",
"type": "bundle_items",
"attributes": {
"created_at": "2024-09-30T09:24:42.841265+00:00",
"updated_at": "2024-09-30T09:24:42.841265+00:00",
"quantity": 2,
"discount_percentage": 15.0,
"position": 2,
"bundle_id": "6e6769cc-b69a-4b30-bf3c-aa1a57d63506",
"product_group_id": "398447db-7cef-4cc2-b81b-0a81a8880c62",
"product_id": "e65f56ab-87cb-49ba-b2cc-a050575b089d"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/bundle_items
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=bundle,product,product_group |
fields[] |
Array List of comma seperated fields to include ?fields[bundle_items]=created_at,updated_at,quantity |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][quantity] |
Integer The quantity of the item |
data[attributes][discount_percentage] |
Float The discount percentage for this product when rented out in a bundle |
data[attributes][position] |
Integer Position of the product in bundle list |
data[attributes][bundle_id] |
Uuid The associated Bundle |
data[attributes][product_group_id] |
Uuid The associated Product group |
data[attributes][product_id] |
Uuid The associated Product |
Includes
This request accepts the following includes:
bundle
product
=>
photo
product_group
=>
photo
Updating a bundle item
How to update a bundle item:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/bundle_items/9a6999d3-eaa6-49d2-a613-3f80f82ce9ea' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "9a6999d3-eaa6-49d2-a613-3f80f82ce9ea",
"type": "bundle_items",
"attributes": {
"quantity": 3,
"discount_percentage": 20
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "9a6999d3-eaa6-49d2-a613-3f80f82ce9ea",
"type": "bundle_items",
"attributes": {
"created_at": "2024-09-30T09:24:46.286141+00:00",
"updated_at": "2024-09-30T09:24:46.415848+00:00",
"quantity": 3,
"discount_percentage": 20.0,
"position": 1,
"bundle_id": "08a8dde0-05f7-4d37-b416-c9be55204151",
"product_group_id": "9ee53c2a-0951-4061-80d3-40e82e2bd907",
"product_id": "5cd5b436-1704-4b7e-bef2-fb480733097b"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/bundle_items/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=bundle,product,product_group |
fields[] |
Array List of comma seperated fields to include ?fields[bundle_items]=created_at,updated_at,quantity |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][quantity] |
Integer The quantity of the item |
data[attributes][discount_percentage] |
Float The discount percentage for this product when rented out in a bundle |
data[attributes][position] |
Integer Position of the product in bundle list |
data[attributes][bundle_id] |
Uuid The associated Bundle |
data[attributes][product_group_id] |
Uuid The associated Product group |
data[attributes][product_id] |
Uuid The associated Product |
Includes
This request accepts the following includes:
bundle
product
=>
photo
product_group
=>
photo
Deleting a bundle item
How to delete a bundle item:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/bundle_items/ab899ace-eda2-4ec3-8f03-8267d0a6bf12' \
--header 'content-type: application/json' \
--data '{}'
A 200 status response looks like this:
{
"data": {
"id": "ab899ace-eda2-4ec3-8f03-8267d0a6bf12",
"type": "bundle_items",
"attributes": {
"created_at": "2024-09-30T09:24:47.463602+00:00",
"updated_at": "2024-09-30T09:24:47.463602+00:00",
"quantity": 2,
"discount_percentage": 15.0,
"position": 1,
"bundle_id": "a7b73e42-44f2-44f8-a10f-b1cd7b33843f",
"product_group_id": "42582597-55ff-4806-8d8e-86a8ccbed2e6",
"product_id": "132d7503-4ca5-4bac-9ee9-f3149e13aec7"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/bundle_items/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[bundle_items]=created_at,updated_at,quantity |
Includes
This request does not accept any includes
Bundles
Bundles allow for a single product to be made up of multiple other products. This makes it possible to track the status of multiple smaller products within a single larger product (the bundle).
Endpoints
GET /api/boomerang/bundles
POST api/boomerang/bundles/search
GET /api/boomerang/bundles/{id}
POST /api/boomerang/bundles
PUT /api/boomerang/bundles/{id}
DELETE /api/boomerang/bundles/{id}
Fields
Every bundle has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
archived |
Boolean readonly Whether item is archived |
archived_at |
Datetime nullable readonly When the item was archived |
type |
String readonly One of product_groups , products , bundles |
name |
String Name of the item |
slug |
String Slug of the item |
product_type |
String readonly One of rental , consumable , service |
extra_information |
String nullable Extra information about the item, shown on orders and documents |
photo_url |
String readonly Main photo url |
remote_photo_url |
String writeonly Url to an image on the web |
photo_base64 |
String writeonly Base64 encoded photo, use this field to store a main photo |
description |
String nullable Description used in the online store |
excerpt |
String Excerpt used in the online store |
show_in_store |
Boolean Whether to show this item in the online |
sorting_weight |
Integer Defines sort order in the online store, the lower the weight - the higher it shows up in lists |
discountable |
Boolean Whether discounts should be applied to items in this bundle |
taxable |
Boolean Whether item is taxable |
bundle_items_attributes |
Array writeonly The bundle items to associate |
seo_title |
String SEO title tag |
seo_description |
String SEO meta description tag |
tag_list |
Array List of tags |
photo_id |
Uuid The associated Photo |
tax_category_id |
Uuid The associated Tax category |
Relationships
Bundles have the following relationships:
Name | Description |
---|---|
bundle_items |
Bundle items readonly Associated Bundle items |
inventory_levels |
Inventory levels readonly Associated Inventory levels |
photo |
Photos readonly Associated Photo |
tax_category |
Tax categories readonly Associated Tax category |
Listing bundles
How to fetch a list of bundles:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/bundles' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "182fd33c-157e-48ac-b291-a446e5f2d86a",
"type": "bundles",
"attributes": {
"created_at": "2024-09-30T09:22:32.953130+00:00",
"updated_at": "2024-09-30T09:22:32.953130+00:00",
"archived": false,
"archived_at": null,
"type": "bundles",
"name": "iPad Bundle",
"slug": "ipad-bundle",
"product_type": "bundle",
"extra_information": null,
"photo_url": null,
"description": null,
"excerpt": null,
"show_in_store": true,
"sorting_weight": 0,
"discountable": true,
"taxable": true,
"seo_title": null,
"seo_description": null,
"tag_list": [],
"photo_id": null,
"tax_category_id": null
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/bundles
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=photo,inventory_levels |
fields[] |
Array List of comma seperated fields to include ?fields[bundles]=created_at,updated_at,archived |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
archived |
Boolean eq |
archived_at |
Datetime eq , not_eq , gt , gte , lt , lte |
q |
String eq |
type |
String eq , not_eq |
name |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
slug |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
product_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
extra_information |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
description |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
excerpt |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
show_in_store |
Boolean eq |
sorting_weight |
Integer eq , not_eq , gt , gte , lt , lte |
discountable |
Boolean eq |
taxable |
Boolean eq |
seo_title |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
seo_description |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
tag_list |
String eq |
tax_category_id |
Uuid eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
archived |
Array count |
tag_list |
Array count |
taxable |
Array count |
discountable |
Array count |
product_type |
Array count |
show_in_store |
Array count |
tax_category_id |
Array count |
Includes
This request accepts the following includes:
photo
inventory_levels
Searching bundles
Use advanced search to make logical filter groups with and/or operators.
How to search for bundles:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/bundles/search' \
--header 'content-type: application/json' \
--data '{
"fields": {
"bundles": "id"
},
"filter": {
"conditions": {
"operator": "or",
"attributes": [
{
"operator": "and",
"attributes": [
{
"discountable": true
},
{
"taxable": true
}
]
},
{
"operator": "and",
"attributes": [
{
"show_in_store": true
},
{
"taxable": true
}
]
}
]
}
}
}'
A 200 status response looks like this:
{
"data": [
{
"id": "eac1714e-6288-4f4d-955f-3bdd28011934"
},
{
"id": "98d10976-804b-4380-92f1-0fb6e0724608"
},
{
"id": "4c587901-460b-41e2-b176-c7ec9a7f1af2"
}
]
}
HTTP Request
POST api/boomerang/bundles/search
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=photo,inventory_levels |
fields[] |
Array List of comma seperated fields to include ?fields[bundles]=created_at,updated_at,archived |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
archived |
Boolean eq |
archived_at |
Datetime eq , not_eq , gt , gte , lt , lte |
q |
String eq |
type |
String eq , not_eq |
name |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
slug |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
product_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
extra_information |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
description |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
excerpt |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
show_in_store |
Boolean eq |
sorting_weight |
Integer eq , not_eq , gt , gte , lt , lte |
discountable |
Boolean eq |
taxable |
Boolean eq |
seo_title |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
seo_description |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
tag_list |
String eq |
tax_category_id |
Uuid eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
archived |
Array count |
tag_list |
Array count |
taxable |
Array count |
discountable |
Array count |
product_type |
Array count |
show_in_store |
Array count |
tax_category_id |
Array count |
Includes
This request accepts the following includes:
photo
inventory_levels
Fetching a bundle
How to fetch a bundle:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/bundles/aadbc3e8-ca86-425c-bed8-5ab2374808a3' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "aadbc3e8-ca86-425c-bed8-5ab2374808a3",
"type": "bundles",
"attributes": {
"created_at": "2024-09-30T09:22:30.160241+00:00",
"updated_at": "2024-09-30T09:22:30.160241+00:00",
"archived": false,
"archived_at": null,
"type": "bundles",
"name": "iPad Bundle",
"slug": "ipad-bundle",
"product_type": "bundle",
"extra_information": null,
"photo_url": null,
"description": null,
"excerpt": null,
"show_in_store": true,
"sorting_weight": 0,
"discountable": true,
"taxable": true,
"seo_title": null,
"seo_description": null,
"tag_list": [],
"photo_id": null,
"tax_category_id": null
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/bundles/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=photo,bundle_items,tax_category |
fields[] |
Array List of comma seperated fields to include ?fields[bundles]=created_at,updated_at,archived |
Includes
This request accepts the following includes:
photo
bundle_items
=>
product_group
=>
photo
products
=>
photo
product
=>
photo
tax_category
Creating a bundle
How to create a bundle with bundle items:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/bundles' \
--header 'content-type: application/json' \
--data '{
"include": "bundle_items",
"data": {
"type": "bundles",
"attributes": {
"name": "iPad Pro Bundle",
"bundle_items_attributes": [
{
"quantity": 2,
"discount_percentage": 10,
"product_group_id": "5deec247-2ede-43df-a4bf-4d483bebc7d3",
"product_id": "b0be73ca-8a1d-46e3-9a27-2f6c4b5aee54"
},
{
"quantity": 2,
"discount_percentage": 15,
"product_group_id": "ab96c62f-b5ee-4a54-acbb-6fafa43737c4",
"product_id": "f8b3a163-5cc2-4940-a357-937b67f97a12"
}
]
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "1e51661e-b88a-4c46-9da2-72f037fc503d",
"type": "bundles",
"attributes": {
"created_at": "2024-09-30T09:22:26.487671+00:00",
"updated_at": "2024-09-30T09:22:26.868409+00:00",
"archived": false,
"archived_at": null,
"type": "bundles",
"name": "iPad Pro Bundle",
"slug": "ipad-pro-bundle",
"product_type": "bundle",
"extra_information": null,
"photo_url": null,
"description": null,
"excerpt": null,
"show_in_store": true,
"sorting_weight": 0,
"discountable": true,
"taxable": true,
"seo_title": null,
"seo_description": null,
"tag_list": [],
"photo_id": null,
"tax_category_id": null
},
"relationships": {
"bundle_items": {
"data": [
{
"type": "bundle_items",
"id": "cac4301b-2460-4030-ac27-5f6548ae1911"
},
{
"type": "bundle_items",
"id": "b47be3d9-f54e-4a96-886c-394746813de8"
},
{
"type": "bundle_items",
"id": "cc0cdc53-3608-4e4c-82bb-703b46807a8b"
},
{
"type": "bundle_items",
"id": "05b7b6ef-32b6-41e6-9725-42d5cf3004dc"
}
]
}
}
},
"included": [
{
"id": "cac4301b-2460-4030-ac27-5f6548ae1911",
"type": "bundle_items",
"attributes": {
"created_at": "2024-09-30T09:22:26.491774+00:00",
"updated_at": "2024-09-30T09:22:26.491774+00:00",
"quantity": 2,
"discount_percentage": 10.0,
"position": 1,
"bundle_id": "1e51661e-b88a-4c46-9da2-72f037fc503d",
"product_group_id": "5deec247-2ede-43df-a4bf-4d483bebc7d3",
"product_id": "b0be73ca-8a1d-46e3-9a27-2f6c4b5aee54"
},
"relationships": {}
},
{
"id": "b47be3d9-f54e-4a96-886c-394746813de8",
"type": "bundle_items",
"attributes": {
"created_at": "2024-09-30T09:22:26.494276+00:00",
"updated_at": "2024-09-30T09:22:26.494276+00:00",
"quantity": 2,
"discount_percentage": 15.0,
"position": 2,
"bundle_id": "1e51661e-b88a-4c46-9da2-72f037fc503d",
"product_group_id": "ab96c62f-b5ee-4a54-acbb-6fafa43737c4",
"product_id": "f8b3a163-5cc2-4940-a357-937b67f97a12"
},
"relationships": {}
},
{
"id": "cc0cdc53-3608-4e4c-82bb-703b46807a8b",
"type": "bundle_items",
"attributes": {
"created_at": "2024-09-30T09:22:26.496105+00:00",
"updated_at": "2024-09-30T09:22:26.496105+00:00",
"quantity": 2,
"discount_percentage": 10.0,
"position": 3,
"bundle_id": "1e51661e-b88a-4c46-9da2-72f037fc503d",
"product_group_id": "5deec247-2ede-43df-a4bf-4d483bebc7d3",
"product_id": "b0be73ca-8a1d-46e3-9a27-2f6c4b5aee54"
},
"relationships": {}
},
{
"id": "05b7b6ef-32b6-41e6-9725-42d5cf3004dc",
"type": "bundle_items",
"attributes": {
"created_at": "2024-09-30T09:22:26.497600+00:00",
"updated_at": "2024-09-30T09:22:26.497600+00:00",
"quantity": 2,
"discount_percentage": 15.0,
"position": 4,
"bundle_id": "1e51661e-b88a-4c46-9da2-72f037fc503d",
"product_group_id": "ab96c62f-b5ee-4a54-acbb-6fafa43737c4",
"product_id": "f8b3a163-5cc2-4940-a357-937b67f97a12"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
POST /api/boomerang/bundles
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=photo,bundle_items,tax_category |
fields[] |
Array List of comma seperated fields to include ?fields[bundles]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the item |
data[attributes][slug] |
String Slug of the item |
data[attributes][extra_information] |
String Extra information about the item, shown on orders and documents |
data[attributes][remote_photo_url] |
String Url to an image on the web |
data[attributes][photo_base64] |
String Base64 encoded photo, use this field to store a main photo |
data[attributes][excerpt] |
String Excerpt used in the online store |
data[attributes][show_in_store] |
Boolean Whether to show this item in the online |
data[attributes][sorting_weight] |
Integer Defines sort order in the online store, the lower the weight - the higher it shows up in lists |
data[attributes][discountable] |
Boolean Whether discounts should be applied to items in this bundle |
data[attributes][taxable] |
Boolean Whether item is taxable |
data[attributes][bundle_items_attributes][] |
Array The bundle items to associate |
data[attributes][seo_title] |
String SEO title tag |
data[attributes][seo_description] |
String SEO meta description tag |
data[attributes][tag_list][] |
Array List of tags |
data[attributes][photo_id] |
Uuid The associated Photo |
data[attributes][tax_category_id] |
Uuid The associated Tax category |
Includes
This request accepts the following includes:
photo
bundle_items
=>
product_group
=>
photo
product
=>
photo
tax_category
Updating a bundle
How to update a bundle with bundle items:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/bundles/b8ad61b7-c769-4e88-86fd-792d0cf7bafc' \
--header 'content-type: application/json' \
--data '{
"include": "bundle_items",
"data": {
"id": "b8ad61b7-c769-4e88-86fd-792d0cf7bafc",
"type": "bundles",
"attributes": {
"name": "iPad Pro Bundle",
"bundle_items_attributes": [
{
"id": "7271c9eb-2226-474c-8153-5fa4f566cf00",
"_destroy": true
},
{
"quantity": 2,
"discount_percentage": 15,
"product_group_id": "fad64ffe-1591-4be0-9fea-fcebfa744c96",
"product_id": "56f77132-6882-4007-9b56-ca68f03774dd"
}
]
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "b8ad61b7-c769-4e88-86fd-792d0cf7bafc",
"type": "bundles",
"attributes": {
"created_at": "2024-09-30T09:22:28.455993+00:00",
"updated_at": "2024-09-30T09:22:29.517520+00:00",
"archived": false,
"archived_at": null,
"type": "bundles",
"name": "iPad Pro Bundle",
"slug": "ipad-bundle",
"product_type": "bundle",
"extra_information": null,
"photo_url": null,
"description": null,
"excerpt": null,
"show_in_store": true,
"sorting_weight": 0,
"discountable": true,
"taxable": true,
"seo_title": null,
"seo_description": null,
"tag_list": [],
"photo_id": null,
"tax_category_id": null
},
"relationships": {
"bundle_items": {
"data": [
{
"type": "bundle_items",
"id": "1c5fd0ef-bf92-486f-bc32-2d73755c51ee"
},
{
"type": "bundle_items",
"id": "6556798f-38ea-411e-821b-7adbe2ad08a9"
}
]
}
}
},
"included": [
{
"id": "1c5fd0ef-bf92-486f-bc32-2d73755c51ee",
"type": "bundle_items",
"attributes": {
"created_at": "2024-09-30T09:22:29.290545+00:00",
"updated_at": "2024-09-30T09:22:29.290545+00:00",
"quantity": 2,
"discount_percentage": 15.0,
"position": 2,
"bundle_id": "b8ad61b7-c769-4e88-86fd-792d0cf7bafc",
"product_group_id": "fad64ffe-1591-4be0-9fea-fcebfa744c96",
"product_id": "56f77132-6882-4007-9b56-ca68f03774dd"
},
"relationships": {}
},
{
"id": "6556798f-38ea-411e-821b-7adbe2ad08a9",
"type": "bundle_items",
"attributes": {
"created_at": "2024-09-30T09:22:29.292300+00:00",
"updated_at": "2024-09-30T09:22:29.292300+00:00",
"quantity": 2,
"discount_percentage": 15.0,
"position": 3,
"bundle_id": "b8ad61b7-c769-4e88-86fd-792d0cf7bafc",
"product_group_id": "fad64ffe-1591-4be0-9fea-fcebfa744c96",
"product_id": "56f77132-6882-4007-9b56-ca68f03774dd"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
PUT /api/boomerang/bundles/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=photo,bundle_items,tax_category |
fields[] |
Array List of comma seperated fields to include ?fields[bundles]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the item |
data[attributes][slug] |
String Slug of the item |
data[attributes][extra_information] |
String Extra information about the item, shown on orders and documents |
data[attributes][remote_photo_url] |
String Url to an image on the web |
data[attributes][photo_base64] |
String Base64 encoded photo, use this field to store a main photo |
data[attributes][excerpt] |
String Excerpt used in the online store |
data[attributes][show_in_store] |
Boolean Whether to show this item in the online |
data[attributes][sorting_weight] |
Integer Defines sort order in the online store, the lower the weight - the higher it shows up in lists |
data[attributes][discountable] |
Boolean Whether discounts should be applied to items in this bundle |
data[attributes][taxable] |
Boolean Whether item is taxable |
data[attributes][bundle_items_attributes][] |
Array The bundle items to associate |
data[attributes][seo_title] |
String SEO title tag |
data[attributes][seo_description] |
String SEO meta description tag |
data[attributes][tag_list][] |
Array List of tags |
data[attributes][photo_id] |
Uuid The associated Photo |
data[attributes][tax_category_id] |
Uuid The associated Tax category |
Includes
This request accepts the following includes:
photo
bundle_items
=>
product_group
=>
photo
product
=>
photo
tax_category
Archiving a bundle
How to delete a bundle:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/bundles/210864fb-46c6-418c-9e76-e7b578053253' \
--header 'content-type: application/json' \
--data '{}'
A 200 status response looks like this:
{
"data": {
"id": "210864fb-46c6-418c-9e76-e7b578053253",
"type": "bundles",
"attributes": {
"created_at": "2024-09-30T09:22:27.551032+00:00",
"updated_at": "2024-09-30T09:22:27.731112+00:00",
"archived": true,
"archived_at": "2024-09-30T09:22:27.731112+00:00",
"type": "bundles",
"name": "iPad Bundle",
"slug": "ipad-bundle",
"product_type": "bundle",
"extra_information": null,
"photo_url": null,
"description": null,
"excerpt": null,
"show_in_store": true,
"sorting_weight": 0,
"discountable": true,
"taxable": true,
"seo_title": null,
"seo_description": null,
"tag_list": [],
"photo_id": null,
"tax_category_id": null
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/bundles/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[bundles]=created_at,updated_at,archived |
Includes
This request does not accept any includes
Companies
Every action performed in a Booqable account is scoped to a company; A company holds information and configuration about an account.
Endpoints
GET /api/boomerang/companies/current
PUT /api/boomerang/companies/current
Fields
Every company has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
name |
String Name of the company |
slug |
String readonly Company's slug, used in urls |
email |
String Used in customer communication, on documents and as the reply-to address for emails that are being sent |
billing_email |
String Used to send billing emails to |
phone |
String Phone number |
website |
String Website |
address_line_1 |
String First address line |
address_line_2 |
String Second address line |
zipcode |
String Zipcode |
city |
String City |
region |
String Region |
country |
String Country |
market |
String The market the company operates in |
use_billing_address |
Boolean Whether to use billing address on invoices received from Booqable |
billing_company |
String Company name (used for invoices received from Booqable) |
billing_address_line_1 |
String First address line (used for invoices received from Booqable) |
billing_address_line_2 |
String Second address line (used for invoices received from Booqable) |
billing_address_zipcode |
String Zipcode (used for invoices received from Booqable) |
billing_address_city |
String City (used for invoices received from Booqable) |
billing_address_region |
String Region (used for invoices received from Booqable) |
billing_address_country |
String Country (used for invoices received from Booqable) |
logo_url |
String readonly Url of the uploaded logo |
logo_base64 |
String writeonly To update a logo send it as base64 encoded string |
remove_logo |
Boolean writeonly Remove current logo |
favicon_url |
String readonly Company favicon url |
favicon_base64 |
String writeonly To upload a favicon send it as a base64 encoded string |
remove_favicon |
Boolean writeonly Remove current favicon |
default_timezone |
String Company's default timezone |
currency |
String Currency of the company |
financial_line_1 |
String First extra financial information line (line bank account) used in customer communication, on documents and as the reply-to address for emails that are being sent |
financial_line_2 |
String Second extra financial information line (line bank account) used in customer communication, on documents and as the reply-to address for emails that are being sent |
vat_number |
String Company's vat number, used in customer communication and to define tax exempts |
custom_domain |
String Custom domain to use for hosted store and checkout |
development |
Boolean readonly Whether this is a development account |
shop_theme_id |
Uuid ID of installed shop theme |
installed_online_store |
Boolean readonly If the online store is installed, this boolean will return true |
source |
String readonly UTM source present during signup |
medium |
String readonly UTM medium present during signup |
tenant_token |
String readonly Token |
pending_subscription |
Boolean readonly Whether the company has a pending subscription |
team_size |
String readonly Team size given during signup |
projected_revenue |
String readonly Projected revenue size given during signup |
address |
String readonly The full address |
main_address_attributes |
Hash writeonly A hash with the company main address fields. Use it when updating the company main address. See address property type for more information |
main_address |
Hash readonly A hash with the company main address fields. Use it when fetching the company. See address property type for more information |
billing_address_attributes |
Hash writeonly A hash with the company billing address fields. Use it when updating the company billing address. See address property type for more information |
billing_address |
Hash readonly A hash with the company billing address fields. Use it when fetching the company. See address property type for more information |
in_europe |
Boolean readonly Whether company is situated in europe |
continent |
String readonly Continent the company is situated |
subscription |
Hash readonly Details about the subscription |
third_party_id |
String readonly ID used for third party tools |
Fetching a company
How to fetch a companies:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/companies/current' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "cad0c78f-98e3-4ba2-a4c7-1fbaa5b634a1",
"type": "companies",
"attributes": {
"created_at": "2024-09-30T09:22:58.072473+00:00",
"updated_at": "2024-09-30T09:22:58.086658+00:00",
"name": "iRent",
"slug": "irent",
"email": "[email protected]",
"billing_email": null,
"phone": "0581234567",
"website": "www.booqable.com",
"address_line_1": "Blokhuispoort",
"address_line_2": "Leeuwarden",
"zipcode": "8900AB",
"city": "Leeuwarden",
"region": null,
"country": "the Netherlands",
"market": "AV / Camera",
"use_billing_address": false,
"billing_company": null,
"billing_address_line_1": null,
"billing_address_line_2": null,
"billing_address_zipcode": null,
"billing_address_city": null,
"billing_address_region": null,
"billing_address_country": null,
"logo_url": null,
"favicon_url": null,
"default_timezone": "UTC",
"currency": "usd",
"financial_line_1": "Blokhuispoort",
"financial_line_2": "Leeuwarden",
"vat_number": null,
"custom_domain": null,
"development": false,
"shop_theme_id": null,
"installed_online_store": false,
"source": null,
"medium": null,
"tenant_token": "440815774169aab6f03552df83de4bef",
"pending_subscription": false,
"team_size": null,
"projected_revenue": null,
"address": "Blokhuispoort\nLeeuwarden\n8900AB Leeuwarden\nthe Netherlands",
"main_address": {
"meets_validation_requirements": false,
"first_name": null,
"last_name": null,
"address1": "Blokhuispoort",
"address2": "Leeuwarden",
"city": "Leeuwarden",
"region": null,
"zipcode": "8900AB",
"country": "the Netherlands",
"country_id": null,
"province_id": null,
"latitude": null,
"longitude": null,
"value": "Blokhuispoort\nLeeuwarden\n8900AB Leeuwarden\nthe Netherlands"
},
"billing_address": null
}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/companies/current
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[companies]=created_at,updated_at,name |
Includes
This request does not accept any includes
Fetching subscription details
The subscription has the following fields:
Name | Description |
---|---|
trial_ends_at |
Datetime readonly When the trial ends |
activated |
Boolean readonly Whether subscription is active |
suspended |
Boolean readonly Whether account is suspended |
canceled |
Boolean readonly Whether subscription is canceled |
canceled_at |
Datetime readonly When the subscription is canceled (can also be in the future) |
on_hold |
Boolean readonly Whether account is on-hold |
needs_activation |
Boolean readonly Whether account needs to activate a subscription |
legacy |
Datetime readonly Whether it's a legacy subscription |
product |
String readonly Which product is active, one of Essential , Pro , Premium , Legacy |
plan_id |
String readonly ID of the product (used internally by Booqable) |
interval |
String readonly Billing interval, one of month , year |
current_period_end |
Datetime readonly When the current billing period ends |
quantity |
Integer readonly Quantity of the subscription (used for legacy subscriptions to buy seats) |
extra_employees |
Integer readonly Extra employees billed for |
extra_locations |
Integer readonly Extra locations billed for |
amount_in_cents |
Integer readonly Amount in cents |
discount_in_cents |
Integer readonly Discount in cents |
balance_in_cents |
Integer readonly Balance in cents, will be deducted from the next invoice(s) |
coupon |
String readonly Coupon that's currently active |
coupon_percent_off |
String* readonly Percentage of discount on the current active coupon |
coupon_duration |
String* readonly Duration type of the current active coupon, one of forever , once , repeating |
coupon_duration_in_months |
String* readonly Amount of months the coupon is active. Only present when coupon duration is repeating . |
strategy |
String readonly Billing strategy, one of send_invoice , charge_automatically |
source |
Hash readonly Information about the payment source |
enabled_features |
Hash readonly Beta features that are currently enabled |
allowed_features |
Hash readonly List of allowed features for plan |
restrictions |
Hash readonly Restrictions applied to this account |
How to fetch details about the company its subscription:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/companies/current?extra_fields%5Bcompanies%5D=subscription&fields%5Bcompanies%5D=subscription' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "9724029c-d851-4e76-b1e2-3fcd2bcee5ce",
"type": "companies",
"attributes": {
"subscription": {
"trial_ends_at": "2024-10-14T09:22:58.506Z",
"activated": false,
"active_subscription": false,
"suspended": false,
"canceled": false,
"canceled_at": null,
"on_hold": false,
"needs_activation": false,
"product": "Premium",
"plan_id": "premium_monthly",
"interval": "month",
"current_period_end": null,
"extra_employees": 0,
"extra_locations": 0,
"amount_in_cents": 29900,
"discount_in_cents": 0,
"balance_in_cents": 0,
"coupon": null,
"coupon_percent_off": null,
"coupon_duration": null,
"coupon_duration_in_months": null,
"strategy": "charge_automatically",
"source": null,
"enabled_features": [],
"allowed_features": [
"bundles",
"multiple_locations",
"advanced_pricing",
"api",
"custom_fields",
"overbookings",
"categories",
"customer_auth",
"custom_domain",
"barcodes",
"reports",
"permissions",
"exports",
"coupons",
"shop_tracking",
"sso",
"iprestrictions",
"2fa_enforcing",
"remove_powered_by"
],
"restrictions": {
"employees": 15,
"email_max_recipients": 2000,
"rate_limit_max": 250,
"rate_limit_period": 60,
"locations": 3
},
"can_try_plan": true
}
}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/companies/current
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[companies]=created_at,updated_at,name |
Includes
This request does not accept any includes
Updating a company
How to update a company:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/companies/current' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "08a70b55-aed8-49de-bb4b-4fb331853419",
"type": "companies",
"attributes": {
"name": "iRent LLC"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "08a70b55-aed8-49de-bb4b-4fb331853419",
"type": "companies",
"attributes": {
"created_at": "2024-09-30T09:22:57.624404+00:00",
"updated_at": "2024-09-30T09:22:57.696914+00:00",
"name": "iRent LLC",
"slug": "irent",
"email": "[email protected]",
"billing_email": null,
"phone": "0581234567",
"website": "www.booqable.com",
"address_line_1": "Blokhuispoort",
"address_line_2": "Leeuwarden",
"zipcode": "8900AB",
"city": "Leeuwarden",
"region": null,
"country": "the Netherlands",
"market": "AV / Camera",
"use_billing_address": false,
"billing_company": null,
"billing_address_line_1": null,
"billing_address_line_2": null,
"billing_address_zipcode": null,
"billing_address_city": null,
"billing_address_region": null,
"billing_address_country": null,
"logo_url": null,
"favicon_url": null,
"default_timezone": "UTC",
"currency": "usd",
"financial_line_1": "Blokhuispoort",
"financial_line_2": "Leeuwarden",
"vat_number": null,
"custom_domain": null,
"development": false,
"shop_theme_id": null,
"installed_online_store": false,
"source": null,
"medium": null,
"tenant_token": "6abca841faccc32ea20f3ccc07424c09",
"pending_subscription": false,
"team_size": null,
"projected_revenue": null,
"address": "Blokhuispoort\nLeeuwarden\n8900AB Leeuwarden\nthe Netherlands",
"main_address": {
"meets_validation_requirements": false,
"first_name": null,
"last_name": null,
"address1": "Blokhuispoort",
"address2": "Leeuwarden",
"city": "Leeuwarden",
"region": null,
"zipcode": "8900AB",
"country": "the Netherlands",
"country_id": null,
"province_id": null,
"latitude": null,
"longitude": null,
"value": "Blokhuispoort\nLeeuwarden\n8900AB Leeuwarden\nthe Netherlands"
},
"billing_address": null
}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/companies/current
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[companies]=created_at,updated_at,name |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the company |
data[attributes][email] |
String Used in customer communication, on documents and as the reply-to address for emails that are being sent |
data[attributes][billing_email] |
String Used to send billing emails to |
data[attributes][phone] |
String Phone number |
data[attributes][website] |
String Website |
data[attributes][address_line_1] |
String First address line |
data[attributes][address_line_2] |
String Second address line |
data[attributes][zipcode] |
String Zipcode |
data[attributes][city] |
String City |
data[attributes][region] |
String Region |
data[attributes][country] |
String Country |
data[attributes][market] |
String The market the company operates in |
data[attributes][use_billing_address] |
Boolean Whether to use billing address on invoices received from Booqable |
data[attributes][billing_company] |
String Company name (used for invoices received from Booqable) |
data[attributes][billing_address_line_1] |
String First address line (used for invoices received from Booqable) |
data[attributes][billing_address_line_2] |
String Second address line (used for invoices received from Booqable) |
data[attributes][billing_address_zipcode] |
String Zipcode (used for invoices received from Booqable) |
data[attributes][billing_address_city] |
String City (used for invoices received from Booqable) |
data[attributes][billing_address_region] |
String Region (used for invoices received from Booqable) |
data[attributes][billing_address_country] |
String Country (used for invoices received from Booqable) |
data[attributes][logo_base64] |
String To update a logo send it as base64 encoded string |
data[attributes][remove_logo] |
Boolean Remove current logo |
data[attributes][favicon_base64] |
String To upload a favicon send it as a base64 encoded string |
data[attributes][remove_favicon] |
Boolean Remove current favicon |
data[attributes][default_timezone] |
String Company's default timezone |
data[attributes][currency] |
String Currency of the company |
data[attributes][financial_line_1] |
String First extra financial information line (line bank account) used in customer communication, on documents and as the reply-to address for emails that are being sent |
data[attributes][financial_line_2] |
String Second extra financial information line (line bank account) used in customer communication, on documents and as the reply-to address for emails that are being sent |
data[attributes][vat_number] |
String Company's vat number, used in customer communication and to define tax exempts |
data[attributes][custom_domain] |
String Custom domain to use for hosted store and checkout |
data[attributes][shop_theme_id] |
Uuid ID of installed shop theme |
data[attributes][main_address_attributes] |
Hash A hash with the company main address fields. Use it when updating the company main address. See address property type for more information |
data[attributes][billing_address_attributes] |
Hash A hash with the company billing address fields. Use it when updating the company billing address. See address property type for more information |
Includes
This request does not accept any includes
Countries
The Country
resource describes countries, including the information required to validate the format of addresses.
Fields
Every country has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
name |
String readonly Name of the country |
alpha2 |
String readonly ISO 3166-1 alpha-2 code |
province_required |
Boolean readonly Whether a province is required for addresses in this country |
province_type |
String readonly The province type of this country. One of county , emirate , governorate , prefecture , province , region , state , state_and_territory |
form_layout |
String readonly The layout of the address form |
show_layout |
String readonly The layout of the address when shown |
zipcode_required |
Boolean readonly Whether a zipcode is required for addresses in this country |
zipcode_autofill |
String readonly The value to use for the zipcode when autofilling |
zipcode_format |
String readonly The format of the zipcode, as a regular expression |
zipcode_placeholder |
String readonly The placeholder to use for the zipcode |
zipcode_type |
String readonly The zipcode type of this country. One of eircode , pincode , postal_code , postal_index , postcode , zipcode |
city_autofill |
String readonly The value to use for the city when autofilling |
Listing countries
How to fetch a list of countries:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/countries' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "e822bc2a-8851-4bf7-93de-1e9214dadfd2",
"type": "countries",
"attributes": {
"created_at": "2024-09-30T09:26:25.042527+00:00",
"updated_at": "2024-09-30T09:26:25.042527+00:00",
"name": "Netherlands",
"alpha2": "NL",
"province_required": false,
"province_type": "province",
"form_layout": "{country}\n{first_name}{last_name}\n{address1}\n{address2}\n{zipcode}{city}",
"show_layout": "{first_name} {last_name}\n{address1}\n{address2}\n{zipcode} {city}\n{country}",
"zipcode_required": true,
"zipcode_autofill": null,
"zipcode_format": "\\d{4} ?[A-Z]{2}",
"zipcode_placeholder": "1234 AB",
"zipcode_type": "postcode",
"city_autofill": null
}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/countries
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[countries]=created_at,updated_at,name |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
name |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
alpha2 |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request does not accept any includes
Coupons
Create codes to discount orders by a fixed amount or a percentage. Customers can redeem the codes online at checkout. Coupons can also be added to orders.
Endpoints
GET /api/boomerang/coupons
GET /api/boomerang/coupons/{id}
POST /api/boomerang/coupons
PUT /api/boomerang/coupons/{id}
DELETE /api/boomerang/coupons/{id}
Fields
Every coupon has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
archived |
Boolean readonly Whether coupon is archived |
archived_at |
Datetime nullable readonly When the coupon was archived |
identifier |
String The code that customers need to type in |
coupon_type |
String One of percentage , cents |
value |
Integer A percentage for type percentage or a value in cents for cents |
active |
Boolean Whether coupon can be redeemed at the moment |
Listing coupons
How to fetch a list of coupons:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/coupons' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "d23b7015-5ca0-45ad-b267-3d543ec07939",
"type": "coupons",
"attributes": {
"created_at": "2024-09-30T09:24:08.628138+00:00",
"updated_at": "2024-09-30T09:24:08.628138+00:00",
"archived": false,
"archived_at": null,
"identifier": "SUMMER20OFF",
"coupon_type": "percentage",
"value": 20,
"active": true
}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/coupons
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[coupons]=created_at,updated_at,archived |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
archived |
Boolean eq |
archived_at |
Datetime eq , not_eq , gt , gte , lt , lte |
identifier |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
coupon_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
value |
Integer eq , not_eq , gt , gte , lt , lte |
active |
Boolean eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request does not accept any includes
Fetching a coupon
How to fetch a coupon:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/coupons/f8230063-16e3-4038-a01b-f093e12b334a' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "f8230063-16e3-4038-a01b-f093e12b334a",
"type": "coupons",
"attributes": {
"created_at": "2024-09-30T09:24:09.666283+00:00",
"updated_at": "2024-09-30T09:24:09.666283+00:00",
"archived": false,
"archived_at": null,
"identifier": "SUMMER20OFF",
"coupon_type": "percentage",
"value": 20,
"active": true
}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/coupons/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[coupons]=created_at,updated_at,archived |
Includes
This request does not accept any includes
Creating a coupon
How to create a coupon:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/coupons' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "coupons",
"attributes": {
"identifier": "WINTERDISCOUNT",
"coupon_type": "cents",
"value": 2000,
"active": true
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "50897ad8-a800-418d-b2d9-08d239e92454",
"type": "coupons",
"attributes": {
"created_at": "2024-09-30T09:24:07.900253+00:00",
"updated_at": "2024-09-30T09:24:07.900253+00:00",
"archived": false,
"archived_at": null,
"identifier": "WINTERDISCOUNT",
"coupon_type": "cents",
"value": 2000,
"active": true
}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/coupons
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[coupons]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][identifier] |
String The code that customers need to type in |
data[attributes][coupon_type] |
String One of percentage , cents |
data[attributes][value] |
Integer A percentage for type percentage or a value in cents for cents |
data[attributes][active] |
Boolean Whether coupon can be redeemed at the moment |
Includes
This request does not accept any includes
Updating a coupon
When updating a coupon the existing one is archived and a new one gets created:
How to update a coupon:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/coupons/532f4825-1465-4f13-b32c-9ecb4c3b5963' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "532f4825-1465-4f13-b32c-9ecb4c3b5963",
"type": "coupons",
"attributes": {
"identifier": "SUMMER30OFF",
"coupon_type": "percentage",
"value": 30
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "359ba994-4e94-4e15-8cd9-c2375b7dd000",
"type": "coupons",
"attributes": {
"created_at": "2024-09-30T09:24:10.164289+00:00",
"updated_at": "2024-09-30T09:24:10.190372+00:00",
"archived": false,
"archived_at": null,
"identifier": "SUMMER30OFF",
"coupon_type": "percentage",
"value": 30,
"active": false
}
},
"meta": {}
}
How to deativate a coupon:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/coupons/74d08a62-371f-4cb7-bb9a-972cab6cc152' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "74d08a62-371f-4cb7-bb9a-972cab6cc152",
"type": "coupons",
"attributes": {
"active": false
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "d5ae06bf-12da-464d-a8c1-3f5519e2c322",
"type": "coupons",
"attributes": {
"created_at": "2024-09-30T09:24:10.750709+00:00",
"updated_at": "2024-09-30T09:24:10.775082+00:00",
"archived": false,
"archived_at": null,
"identifier": "SUMMER20OFF",
"coupon_type": "percentage",
"value": 20,
"active": false
}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/coupons/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[coupons]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][identifier] |
String The code that customers need to type in |
data[attributes][coupon_type] |
String One of percentage , cents |
data[attributes][value] |
Integer A percentage for type percentage or a value in cents for cents |
data[attributes][active] |
Boolean Whether coupon can be redeemed at the moment |
Includes
This request does not accept any includes
Archiving a coupon
How to archive a coupon:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/coupons/fdd4d5e9-43ce-46e3-8a64-5c6a910aaa5f' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "fdd4d5e9-43ce-46e3-8a64-5c6a910aaa5f",
"type": "coupons",
"attributes": {
"created_at": "2024-09-30T09:24:09.144107+00:00",
"updated_at": "2024-09-30T09:24:09.168278+00:00",
"archived": true,
"archived_at": "2024-09-30T09:24:09.168278+00:00",
"identifier": "SUMMER20OFF",
"coupon_type": "percentage",
"value": 20,
"active": true
}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/coupons/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[coupons]=created_at,updated_at,archived |
Includes
This request does not accept any includes
Customers
Customers are an essential part of your business. You can manage settings and custom data. Stored customer information like addresses, customer tax profiles, discounts, and customized security deposits are applied to associated orders when created or when assigned a new customer.
Endpoints
GET /api/boomerang/customers
POST api/boomerang/customers/search
GET /api/boomerang/customers/{id}
POST /api/boomerang/customers
PUT /api/boomerang/customers/{id}
DELETE /api/boomerang/customers/{id}
Fields
Every customer has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
archived |
Boolean readonly Whether customer is archived |
archived_at |
Datetime nullable readonly When the customer was archived |
number |
Integer readonly The assigned number |
name |
String Person or Company name |
email |
String nullable E-mail address used for communication |
deposit_type |
String One of default , none , percentage_total , percentage , fixed |
deposit_value |
Float The value to use for deposit_type |
discount_percentage |
Float Default discount applied to each new order for this customer |
legal_type |
String Either person or commercial |
email_marketing_consented |
Boolean Whether the customer has consented to receive email marketing |
email_marketing_consent_updated_at |
Datetime readonly When the email marketing consent was last updated |
properties |
Hash readonly A hash containing all basic property values (include properties if you need more detailed information about properties) |
properties_attributes |
Array writeonly Create or update multiple properties associated with this customer |
tag_list |
Array Case insensitive tag list |
merge_suggestion_customer_id |
Uuid The associated Merge suggestion customer |
tax_region_id |
Uuid nullable The associated Tax region |
Relationships
Customers have the following relationships:
Name | Description |
---|---|
barcode |
Barcodes Associated Barcode |
merge_suggestion_customer |
Customers readonly Associated Merge suggestion customer |
notes |
Notes readonly Associated Notes |
properties |
Properties readonly Associated Properties |
tax_region |
Tax regions readonly Associated Tax region |
Listing customers
How to fetch a list of customers:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/customers' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "d28b545e-280a-411a-9c51-809f9d2b4242",
"type": "customers",
"attributes": {
"created_at": "2024-09-30T09:24:22.512826+00:00",
"updated_at": "2024-09-30T09:24:22.512826+00:00",
"archived": false,
"archived_at": null,
"number": 1,
"name": "John Doe",
"email": "[email protected]",
"deposit_type": "default",
"deposit_value": 0.0,
"discount_percentage": 0.0,
"legal_type": "person",
"email_marketing_consented": false,
"email_marketing_consent_updated_at": null,
"properties": {},
"tag_list": [],
"merge_suggestion_customer_id": null,
"tax_region_id": null
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/customers
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=barcode,properties,tax_region |
fields[] |
Array List of comma seperated fields to include ?fields[customers]=created_at,updated_at,archived |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq , gt |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
archived |
Boolean eq |
archived_at |
Datetime eq , not_eq , gt , gte , lt , lte |
number |
Integer eq , not_eq , gt , gte , lt , lte |
name |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
email |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
deposit_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
deposit_value |
Float eq , not_eq , gt , gte , lt , lte |
discount_percentage |
Float eq , not_eq , gt , gte , lt , lte |
legal_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
email_marketing_consented |
Boolean eq |
tag_list |
String eq |
merge_suggestion_customer_id |
Uuid eq , not_eq |
tax_region_id |
Uuid eq , not_eq |
q |
String eq |
conditions |
Hash eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
archived |
Array count |
legal_type |
Array count |
tag_list |
Array count |
discount_percentage |
Array maximum , minimum , average |
Includes
This request accepts the following includes:
barcode
properties
tax_region
Searching customers
Use advanced search to make logical filter groups with and/or operators.
How to search for customers:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/customers/search' \
--header 'content-type: application/json' \
--data '{
"fields": {
"customers": "id"
},
"filter": {
"conditions": {
"operator": "and",
"attributes": [
{
"operator": "or",
"attributes": [
{
"name": "john"
},
{
"name": "jane"
}
]
},
{
"operator": "and",
"attributes": [
{
"discount_percentage": {
"gte": 50
}
},
{
"deposit_type": "none"
}
]
}
]
}
}
}'
A 200 status response looks like this:
{
"data": [
{
"id": "c37d600d-3119-4955-a5d0-5ab2353113a0"
},
{
"id": "86898e86-a0ac-48c4-93ad-6f5a43e96781"
}
]
}
HTTP Request
POST api/boomerang/customers/search
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=barcode,properties,tax_region |
fields[] |
Array List of comma seperated fields to include ?fields[customers]=created_at,updated_at,archived |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq , gt |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
archived |
Boolean eq |
archived_at |
Datetime eq , not_eq , gt , gte , lt , lte |
number |
Integer eq , not_eq , gt , gte , lt , lte |
name |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
email |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
deposit_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
deposit_value |
Float eq , not_eq , gt , gte , lt , lte |
discount_percentage |
Float eq , not_eq , gt , gte , lt , lte |
legal_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
email_marketing_consented |
Boolean eq |
tag_list |
String eq |
merge_suggestion_customer_id |
Uuid eq , not_eq |
tax_region_id |
Uuid eq , not_eq |
q |
String eq |
conditions |
Hash eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
archived |
Array count |
legal_type |
Array count |
tag_list |
Array count |
discount_percentage |
Array maximum , minimum , average |
Includes
This request accepts the following includes:
barcode
properties
tax_region
Fetching a customer
How to fetch a customers:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/customers/fd59bb3f-94eb-48d4-a45f-62560d594843?include=barcode%2Cproperties' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "fd59bb3f-94eb-48d4-a45f-62560d594843",
"type": "customers",
"attributes": {
"created_at": "2024-09-30T09:24:29.469973+00:00",
"updated_at": "2024-09-30T09:24:29.469973+00:00",
"archived": false,
"archived_at": null,
"number": 1,
"name": "John Doe",
"email": "[email protected]",
"deposit_type": "default",
"deposit_value": 0.0,
"discount_percentage": 0.0,
"legal_type": "person",
"email_marketing_consented": false,
"email_marketing_consent_updated_at": null,
"properties": {},
"tag_list": [],
"merge_suggestion_customer_id": null,
"tax_region_id": null
},
"relationships": {
"properties": {
"data": []
},
"barcode": {
"data": null
}
}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/customers/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=barcode,properties,tax_region |
fields[] |
Array List of comma seperated fields to include ?fields[customers]=created_at,updated_at,archived |
Includes
This request accepts the following includes:
barcode
properties
tax_region
Creating a customer
How to create a customer:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/customers' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "customers",
"attributes": {
"name": "John Doe",
"email": "[email protected]"
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "18d5e1d8-bb99-4d1b-8996-242be24ca277",
"type": "customers",
"attributes": {
"created_at": "2024-09-30T09:24:27.999608+00:00",
"updated_at": "2024-09-30T09:24:27.999608+00:00",
"archived": false,
"archived_at": null,
"number": 2,
"name": "John Doe",
"email": "[email protected]",
"deposit_type": "default",
"deposit_value": 0.0,
"discount_percentage": 0.0,
"legal_type": "person",
"email_marketing_consented": false,
"email_marketing_consent_updated_at": null,
"properties": {},
"tag_list": [],
"merge_suggestion_customer_id": null,
"tax_region_id": null
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/customers
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=barcode,properties,tax_region |
fields[] |
Array List of comma seperated fields to include ?fields[customers]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Person or Company name |
data[attributes][email] |
String E-mail address used for communication |
data[attributes][deposit_type] |
String One of default , none , percentage_total , percentage , fixed |
data[attributes][deposit_value] |
Float The value to use for deposit_type |
data[attributes][discount_percentage] |
Float Default discount applied to each new order for this customer |
data[attributes][legal_type] |
String Either person or commercial |
data[attributes][email_marketing_consented] |
Boolean Whether the customer has consented to receive email marketing |
data[attributes][properties_attributes][] |
Array Create or update multiple properties associated with this customer |
data[attributes][tag_list][] |
Array Case insensitive tag list |
data[attributes][merge_suggestion_customer_id] |
Uuid The associated Merge suggestion customer |
data[attributes][tax_region_id] |
Uuid The associated Tax region |
Includes
This request accepts the following includes:
barcode
properties
tax_region
Updating a customer
How to update a customer:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/customers/40e7aac5-4ec5-4844-b24d-9c1dcdd20785' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "40e7aac5-4ec5-4844-b24d-9c1dcdd20785",
"type": "customers",
"attributes": {
"name": "Jane Doe"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "40e7aac5-4ec5-4844-b24d-9c1dcdd20785",
"type": "customers",
"attributes": {
"created_at": "2024-09-30T09:24:25.230790+00:00",
"updated_at": "2024-09-30T09:24:25.331154+00:00",
"archived": false,
"archived_at": null,
"number": 1,
"name": "Jane Doe",
"email": "[email protected]",
"deposit_type": "default",
"deposit_value": 0.0,
"discount_percentage": 0.0,
"legal_type": "person",
"email_marketing_consented": false,
"email_marketing_consent_updated_at": null,
"properties": {},
"tag_list": [],
"merge_suggestion_customer_id": null,
"tax_region_id": null
},
"relationships": {}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/customers/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=barcode,properties,tax_region |
fields[] |
Array List of comma seperated fields to include ?fields[customers]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Person or Company name |
data[attributes][email] |
String E-mail address used for communication |
data[attributes][deposit_type] |
String One of default , none , percentage_total , percentage , fixed |
data[attributes][deposit_value] |
Float The value to use for deposit_type |
data[attributes][discount_percentage] |
Float Default discount applied to each new order for this customer |
data[attributes][legal_type] |
String Either person or commercial |
data[attributes][email_marketing_consented] |
Boolean Whether the customer has consented to receive email marketing |
data[attributes][properties_attributes][] |
Array Create or update multiple properties associated with this customer |
data[attributes][tag_list][] |
Array Case insensitive tag list |
data[attributes][merge_suggestion_customer_id] |
Uuid The associated Merge suggestion customer |
data[attributes][tax_region_id] |
Uuid The associated Tax region |
Includes
This request accepts the following includes:
barcode
properties
tax_region
Archiving a customer
How to archive a customer:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/customers/db0b6ab2-807f-4f7f-98a4-ac738dc7f2a3' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "db0b6ab2-807f-4f7f-98a4-ac738dc7f2a3",
"type": "customers",
"attributes": {
"created_at": "2024-09-30T09:24:23.818893+00:00",
"updated_at": "2024-09-30T09:24:23.944510+00:00",
"archived": true,
"archived_at": "2024-09-30T09:24:23.944510+00:00",
"number": 1,
"name": "John Doe",
"email": "[email protected]",
"deposit_type": "default",
"deposit_value": 0.0,
"discount_percentage": 0.0,
"legal_type": "person",
"email_marketing_consented": false,
"email_marketing_consent_updated_at": null,
"properties": {},
"tag_list": [],
"merge_suggestion_customer_id": null,
"tax_region_id": null
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/customers/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[customers]=created_at,updated_at,archived |
Includes
This request does not accept any includes
Default properties
Booqable comes with standard fields but you can also add custom properties to capture additional data. Default properties show up in forms within Booqable and can be connected to checkout fields. Default properties are searchable, show up in exports and can be used in email templates. The actual values of those properties are stored in the Property resource.
Properties inherit their fields from a default property when they are connected. When creating properties, they are mapped with their default when one of the following fields correspond:
name
identifier
default_property_id
Endpoints
GET /api/boomerang/default_properties
GET /api/boomerang/default_properties/{id}
POST /api/boomerang/default_properties
PUT /api/boomerang/default_properties/{id}
DELETE /api/boomerang/default_properties/{id}
Fields
Every default property has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
name |
String Name of the property (used as label and to compute identifier if left blank) |
identifier |
String Key that will be used in exports, responses and custom field variables in templates |
position |
Integer Which position the property has |
property_type |
String One of address , date_field , email , phone , select , text_area , text_field |
show_on |
Array Array of items to show this custom field on. Any of contract , invoice , packing , quote |
validation_required |
Boolean Whether this property has to be validated |
owner_type |
String The resource type of the owner. One of orders , product_groups , customers , users |
select_options |
Array For type select . The select options as array. |
editable |
Boolean readonly Whether this property is editable |
Listing default properties
How to fetch a list of default properties:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/default_properties?include=owner' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "b9222de6-ba83-492f-aab3-d0167462b3f1",
"type": "default_properties",
"attributes": {
"created_at": "2024-09-30T09:29:21.660703+00:00",
"updated_at": "2024-09-30T09:29:21.660703+00:00",
"name": "Phone",
"identifier": "phone",
"position": 1,
"property_type": "phone",
"show_on": [],
"validation_required": false,
"owner_type": "customers",
"select_options": [],
"editable": true
}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/default_properties
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[default_properties]=created_at,updated_at,name |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
name |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
identifier |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
validation_required |
Boolean eq |
owner_type |
String eq , not_eq |
editable |
Boolean eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request does not accept any includes
Fetching a default property
How to fetch a default properties:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/default_properties/acc3a83b-4a81-4af4-97bc-3316a0276b7f?include=owner' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "acc3a83b-4a81-4af4-97bc-3316a0276b7f",
"type": "default_properties",
"attributes": {
"created_at": "2024-09-30T09:29:21.132764+00:00",
"updated_at": "2024-09-30T09:29:21.132764+00:00",
"name": "Phone",
"identifier": "phone",
"position": 1,
"property_type": "phone",
"show_on": [],
"validation_required": false,
"owner_type": "customers",
"select_options": [],
"editable": true
}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/default_properties/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[default_properties]=created_at,updated_at,name |
Includes
This request does not accept any includes
Creating a default property
How to create a default property and assign it to an owner:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/default_properties' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "default_properties",
"attributes": {
"name": "Mobile phone",
"property_type": "phone",
"owner_type": "customers"
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "ca9386cf-3c2f-47d3-b9d3-67508f71112a",
"type": "default_properties",
"attributes": {
"created_at": "2024-09-30T09:29:20.104264+00:00",
"updated_at": "2024-09-30T09:29:20.104264+00:00",
"name": "Mobile phone",
"identifier": "mobile_phone",
"position": 2,
"property_type": "phone",
"show_on": [],
"validation_required": false,
"owner_type": "customers",
"select_options": [],
"editable": true
}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/default_properties
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[default_properties]=created_at,updated_at,name |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the property (used as label and to compute identifier if left blank) |
data[attributes][identifier] |
String Key that will be used in exports, responses and custom field variables in templates |
data[attributes][position] |
Integer Which position the property has |
data[attributes][property_type] |
String One of address , date_field , email , phone , select , text_area , text_field |
data[attributes][show_on][] |
Array Array of items to show this custom field on. Any of contract , invoice , packing , quote |
data[attributes][validation_required] |
Boolean Whether this property has to be validated |
data[attributes][owner_type] |
String The resource type of the owner. One of orders , product_groups , customers , users |
data[attributes][select_options][] |
Array For type select . The select options as array. |
Includes
This request does not accept any includes
Updating a default property
How to update a default property:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/default_properties/c3952232-45d5-465b-a219-edb09d68f6d9' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "c3952232-45d5-465b-a219-edb09d68f6d9",
"type": "default_properties",
"attributes": {
"property_type": "text_field"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "c3952232-45d5-465b-a219-edb09d68f6d9",
"type": "default_properties",
"attributes": {
"created_at": "2024-09-30T09:29:19.556311+00:00",
"updated_at": "2024-09-30T09:29:19.586012+00:00",
"name": "Phone",
"identifier": "phone",
"position": 1,
"property_type": "text_field",
"show_on": [],
"validation_required": false,
"owner_type": "customers",
"select_options": [],
"editable": true
}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/default_properties/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[default_properties]=created_at,updated_at,name |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the property (used as label and to compute identifier if left blank) |
data[attributes][identifier] |
String Key that will be used in exports, responses and custom field variables in templates |
data[attributes][position] |
Integer Which position the property has |
data[attributes][property_type] |
String One of address , date_field , email , phone , select , text_area , text_field |
data[attributes][show_on][] |
Array Array of items to show this custom field on. Any of contract , invoice , packing , quote |
data[attributes][validation_required] |
Boolean Whether this property has to be validated |
data[attributes][owner_type] |
String The resource type of the owner. One of orders , product_groups , customers , users |
data[attributes][select_options][] |
Array For type select . The select options as array. |
Includes
This request does not accept any includes
Deleting a default property
How to delete a default property:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/default_properties/b31a7a3d-3786-4fbd-bf5c-9b5ea3eb75db' \
--header 'content-type: application/json' \
--data '{}'
A 200 status response looks like this:
{
"data": {
"id": "b31a7a3d-3786-4fbd-bf5c-9b5ea3eb75db",
"type": "default_properties",
"attributes": {
"created_at": "2024-09-30T09:29:20.598958+00:00",
"updated_at": "2024-09-30T09:29:20.598958+00:00",
"name": "Phone",
"identifier": "phone",
"position": 1,
"property_type": "phone",
"show_on": [],
"validation_required": false,
"owner_type": "customers",
"select_options": [],
"editable": true
}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/default_properties/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[default_properties]=created_at,updated_at,name |
Includes
This request does not accept any includes
Documents
Documents hold financial and or legal information about an order. There are three types of documents: quote
, contract
, invoice
.
When creating quotes and contracts, the following data is copied from the current state of the order:
- Customer information (when present)
- Pricing and deposit
- Lines
Quotes and contracts are always finalized; to make a revision, archive the document, make changes to the order, and create a new one.
Invoices are automatically generated and updated based on changes made to an order. When an invoice is finalized, and further changes are made to the order, a new invoice is created with prorated changes. The payment status of the invoice is automatically updated when payments are made for the associated order.
Endpoints
GET /api/boomerang/documents
POST api/boomerang/documents/search
GET /api/boomerang/documents/{id}
POST /api/boomerang/documents
PUT /api/boomerang/documents/{id}
DELETE /api/boomerang/documents/{id}
Fields
Every document has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
archived |
Boolean readonly Whether document is archived |
archived_at |
Datetime nullable readonly When the document was archived |
document_type |
String One of invoice , contract , quote |
number |
Integer The document number, must be unique per type. Automatically generated if left blank. |
prefix |
String Add a prefix to document numbers to make it easier to identify different documents. You can add dynamic values (like a year or order number) and custom prefixes e.g. {year}-{customer_number} . |
prefix_with_number |
String readonly Rendered prefix with document number |
date |
Date Date the document was finalized |
due_date |
Date The latest date by which the invoice must be fully paid |
name |
String Customer name. If left blank, automatically populated with the customer name of the associated order |
address |
String Customer Address. If left blank, automatically populated with the customer address of the associated order |
reference |
String A project number or other reference |
revised |
Boolean Whether document is revised (applies only to invoice ) |
finalized |
Boolean Whether document is finalized ( quote and contract are always finalized) |
sent |
Boolean Whether document is sent (with Booqable) |
confirmed |
Boolean Whether document is confirmed, applies to quote and contract |
status |
String One of confirmed , unconfirmed , revised , partially_paid , payment_due , paid , process_deposit , overpaid |
signature_url |
String readonly Url where the signature is stored |
deposit_type |
String nullable One of none , percentage_total , percentage , fixed |
deposit_value |
Float The value to use for deposit_type |
tag_list |
Array Case insensitive tag list |
price_in_cents |
Integer readonly Subtotal excl. taxes (excl. deposit) |
grand_total_in_cents |
Integer readonly Total excl. taxes (excl. deposit) |
grand_total_with_tax_in_cents |
Integer readonly Amount incl. taxes (excl. deposit) |
discount_in_cents |
Integer readonly Discount (incl. or excl. taxes based on tax_strategy |
coupon_discount_in_cents |
Integer readonly Coupon discount (incl. or excl. taxes based on tax_strategy |
total_discount_in_cents |
Integer readonly Total discount (incl. or excl. taxes based on tax_strategy |
deposit_in_cents |
Integer readonly Deposit |
deposit_paid_in_cents |
Integer readonly How much of the deposit is paid |
deposit_refunded_in_cents |
Integer readonly How much of the deposit is refunded |
deposit_held_in_cents |
Integer readonly Amount of deposit held |
deposit_to_refund_in_cents |
Integer readonly Amount of deposit (still) to be refunded |
to_be_paid_in_cents |
Integer readonly Amount that (still) has to be paid |
paid_in_cents |
Integer readonly How much was paid |
tax_in_cents |
Integer readonly Total tax |
discount_percentage |
Float The discount percentage applied to this order |
order_id |
Uuid The associated Order |
customer_id |
Uuid nullable The associated Customer |
tax_region_id |
Uuid nullable The associated Tax region |
coupon_id |
Uuid nullable The associated Coupon |
body |
String readonly Custom content displayed on a document, agreement details on a contract, for instance. Applicable to quote and contract . Populated with setting {document_type}.body , but can also be overridden for a specific document |
footer |
String readonly The footer of a document. Populated with setting {document_type}.footer , but can also be overridden for a specific document |
Relationships
Documents have the following relationships:
Name | Description |
---|---|
coupon |
Coupons Associated Coupon |
customer |
Customers Associated Customer |
lines |
Lines readonly Associated Lines |
order |
Orders Associated Order |
tax_region |
Tax regions Associated Tax region |
tax_values |
Tax values readonly Associated Tax values |
Listing documents
How to fetch a list of documents:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/documents' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "ee35272c-c7f1-4e02-8103-b9adc24e4c33",
"type": "documents",
"attributes": {
"created_at": "2024-09-30T09:26:53.574667+00:00",
"updated_at": "2024-09-30T09:26:53.625069+00:00",
"archived": false,
"archived_at": null,
"document_type": "invoice",
"number": null,
"prefix": null,
"prefix_with_number": null,
"date": null,
"due_date": null,
"name": "John Doe",
"address": null,
"reference": null,
"revised": false,
"finalized": false,
"sent": false,
"confirmed": false,
"status": "payment_due",
"signature_url": null,
"deposit_type": "percentage",
"deposit_value": 10.0,
"tag_list": [],
"price_in_cents": 80250,
"grand_total_in_cents": 72225,
"grand_total_with_tax_in_cents": 87392,
"discount_in_cents": 8025,
"coupon_discount_in_cents": 0,
"total_discount_in_cents": 8025,
"deposit_in_cents": 10000,
"deposit_paid_in_cents": 0,
"deposit_refunded_in_cents": 0,
"deposit_held_in_cents": 0,
"deposit_to_refund_in_cents": 0,
"to_be_paid_in_cents": 97392,
"paid_in_cents": 0,
"tax_in_cents": 15167,
"discount_percentage": 10.0,
"order_id": "4c5f9c7e-de65-4500-ad8c-2cc65854cf10",
"customer_id": "07310969-49db-42fe-89ca-3e695bc78fa9",
"tax_region_id": null,
"coupon_id": null
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/documents
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=customer,order |
fields[] |
Array List of comma seperated fields to include ?fields[documents]=created_at,updated_at,archived |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq , gt |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
archived |
Boolean eq |
archived_at |
Datetime eq , not_eq , gt , gte , lt , lte |
document_type |
String eq , not_eq |
number |
Integer eq , not_eq , gt , gte , lt , lte |
prefix |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
prefix_with_number |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
date |
Date eq , not_eq , gt , gte , lt , lte |
due_date |
Date eq , not_eq , gt , gte , lt , lte |
name |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
address |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
revised |
Boolean eq |
finalized |
Boolean eq |
sent |
Boolean eq |
confirmed |
Boolean eq |
status |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
deposit_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
tag_list |
String eq |
price_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
grand_total_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
grand_total_with_tax_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
discount_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
coupon_discount_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
total_discount_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_paid_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_refunded_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_held_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_to_refund_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
to_be_paid_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
paid_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
tax_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
discount_percentage |
Float eq , not_eq , gt , gte , lt , lte |
order_id |
Uuid eq , not_eq |
customer_id |
Uuid eq , not_eq |
tax_region_id |
Uuid eq , not_eq |
coupon_id |
Uuid eq , not_eq |
q |
String eq |
date_or_created_at |
Datetime eq , not_eq , gt , gte , lt , lte , between |
conditions |
Hash eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
status |
Array count |
tag_list |
Array count |
tax_strategy |
Array count |
currency |
Array count |
deposit_type |
Array count |
price_in_cents |
Array sum , maximum , minimum , average |
grand_total_in_cents |
Array sum , maximum , minimum , average |
grand_total_with_tax_in_cents |
Array sum , maximum , minimum , average |
discount_in_cents |
Array sum , maximum , minimum , average |
coupon_discount_in_cents |
Array sum , maximum , minimum , average |
total_discount_in_cents |
Array sum , maximum , minimum , average |
deposit_in_cents |
Array sum , maximum , minimum , average |
deposit_paid_in_cents |
Array sum , maximum , minimum , average |
deposit_refunded_in_cents |
Array sum , maximum , minimum , average |
deposit_held_in_cents |
Array sum , maximum , minimum , average |
deposit_to_refund_in_cents |
Array sum , maximum , minimum , average |
to_be_paid_in_cents |
Array sum , maximum , minimum , average |
paid_in_cents |
Array sum , maximum , minimum , average |
tax_in_cents |
Array sum , maximum , minimum , average |
discount_percentage |
Array maximum , minimum , average |
Includes
This request accepts the following includes:
customer
order
Searching documents
Use advanced search to make logical filter groups with and/or operators.
How to search for documents:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/documents/search' \
--header 'content-type: application/json' \
--data '{
"fields": {
"documents": "id"
},
"filter": {
"conditions": {
"operator": "and",
"attributes": [
{
"operator": "or",
"attributes": [
{
"status": "paid"
},
{
"deposit_type": "none"
}
]
},
{
"operator": "and",
"attributes": [
{
"date": {
"gte": "2024-09-27T09:27:06.480Z"
}
},
{
"date": {
"lte": "2024-10-03T09:27:06.481Z"
}
}
]
}
]
}
}
}'
A 200 status response looks like this:
{
"data": [
{
"id": "40347f7b-b358-4b44-8e07-6327fc522053"
},
{
"id": "ecf4be64-7d40-4fb4-8859-3a56d4132001"
}
]
}
HTTP Request
POST api/boomerang/documents/search
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=customer,order |
fields[] |
Array List of comma seperated fields to include ?fields[documents]=created_at,updated_at,archived |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq , gt |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
archived |
Boolean eq |
archived_at |
Datetime eq , not_eq , gt , gte , lt , lte |
document_type |
String eq , not_eq |
number |
Integer eq , not_eq , gt , gte , lt , lte |
prefix |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
prefix_with_number |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
date |
Date eq , not_eq , gt , gte , lt , lte |
due_date |
Date eq , not_eq , gt , gte , lt , lte |
name |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
address |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
revised |
Boolean eq |
finalized |
Boolean eq |
sent |
Boolean eq |
confirmed |
Boolean eq |
status |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
deposit_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
tag_list |
String eq |
price_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
grand_total_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
grand_total_with_tax_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
discount_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
coupon_discount_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
total_discount_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_paid_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_refunded_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_held_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_to_refund_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
to_be_paid_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
paid_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
tax_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
discount_percentage |
Float eq , not_eq , gt , gte , lt , lte |
order_id |
Uuid eq , not_eq |
customer_id |
Uuid eq , not_eq |
tax_region_id |
Uuid eq , not_eq |
coupon_id |
Uuid eq , not_eq |
q |
String eq |
date_or_created_at |
Datetime eq , not_eq , gt , gte , lt , lte , between |
conditions |
Hash eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
status |
Array count |
tag_list |
Array count |
tax_strategy |
Array count |
currency |
Array count |
deposit_type |
Array count |
price_in_cents |
Array sum , maximum , minimum , average |
grand_total_in_cents |
Array sum , maximum , minimum , average |
grand_total_with_tax_in_cents |
Array sum , maximum , minimum , average |
discount_in_cents |
Array sum , maximum , minimum , average |
coupon_discount_in_cents |
Array sum , maximum , minimum , average |
total_discount_in_cents |
Array sum , maximum , minimum , average |
deposit_in_cents |
Array sum , maximum , minimum , average |
deposit_paid_in_cents |
Array sum , maximum , minimum , average |
deposit_refunded_in_cents |
Array sum , maximum , minimum , average |
deposit_held_in_cents |
Array sum , maximum , minimum , average |
deposit_to_refund_in_cents |
Array sum , maximum , minimum , average |
to_be_paid_in_cents |
Array sum , maximum , minimum , average |
paid_in_cents |
Array sum , maximum , minimum , average |
tax_in_cents |
Array sum , maximum , minimum , average |
discount_percentage |
Array maximum , minimum , average |
Includes
This request accepts the following includes:
customer
order
Fetching a document
How to fetch a documents:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/documents/87ca55e1-9b3d-41e6-84a8-5cecdfc0f0e3' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "87ca55e1-9b3d-41e6-84a8-5cecdfc0f0e3",
"type": "documents",
"attributes": {
"created_at": "2024-09-30T09:27:00.339903+00:00",
"updated_at": "2024-09-30T09:27:00.388075+00:00",
"archived": false,
"archived_at": null,
"document_type": "invoice",
"number": null,
"prefix": null,
"prefix_with_number": null,
"date": null,
"due_date": null,
"name": "John Doe",
"address": null,
"reference": null,
"revised": false,
"finalized": false,
"sent": false,
"confirmed": false,
"status": "payment_due",
"signature_url": null,
"deposit_type": "percentage",
"deposit_value": 10.0,
"tag_list": [],
"price_in_cents": 80250,
"grand_total_in_cents": 72225,
"grand_total_with_tax_in_cents": 87392,
"discount_in_cents": 8025,
"coupon_discount_in_cents": 0,
"total_discount_in_cents": 8025,
"deposit_in_cents": 10000,
"deposit_paid_in_cents": 0,
"deposit_refunded_in_cents": 0,
"deposit_held_in_cents": 0,
"deposit_to_refund_in_cents": 0,
"to_be_paid_in_cents": 97392,
"paid_in_cents": 0,
"tax_in_cents": 15167,
"discount_percentage": 10.0,
"order_id": "c453b917-0bd8-4931-8334-ba5255dc3761",
"customer_id": "86903f21-bf58-41ec-99d1-a3f7cf466d54",
"tax_region_id": null,
"coupon_id": null
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/documents/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=customer,order,tax_region |
fields[] |
Array List of comma seperated fields to include ?fields[documents]=created_at,updated_at,archived |
Includes
This request accepts the following includes:
customer
order
tax_region
lines
=>
item
=>
photo
tax_values
coupon
Creating a document
How to create a contract:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/documents' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "documents",
"attributes": {
"document_type": "contract",
"order_id": "98012f05-e8d6-4bc2-b464-4b97c62b0b4f"
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "856ee924-aead-49a0-bcea-a62b8ec2aeb8",
"type": "documents",
"attributes": {
"created_at": "2024-09-30T09:26:51.129174+00:00",
"updated_at": "2024-09-30T09:26:51.145389+00:00",
"archived": false,
"archived_at": null,
"document_type": "contract",
"number": 1,
"prefix": null,
"prefix_with_number": "1",
"date": "2024-09-30",
"due_date": null,
"name": "John Doe",
"address": "",
"reference": null,
"revised": false,
"finalized": true,
"sent": false,
"confirmed": false,
"status": "unconfirmed",
"signature_url": null,
"deposit_type": "percentage",
"deposit_value": 10.0,
"tag_list": [],
"price_in_cents": 80250,
"grand_total_in_cents": 72225,
"grand_total_with_tax_in_cents": 87392,
"discount_in_cents": 8025,
"coupon_discount_in_cents": 0,
"total_discount_in_cents": 8025,
"deposit_in_cents": 10000,
"deposit_paid_in_cents": 0,
"deposit_refunded_in_cents": 0,
"deposit_held_in_cents": 0,
"deposit_to_refund_in_cents": 0,
"to_be_paid_in_cents": 0,
"paid_in_cents": 0,
"tax_in_cents": 15167,
"discount_percentage": 10.0,
"order_id": "98012f05-e8d6-4bc2-b464-4b97c62b0b4f",
"customer_id": "24e88957-6a5d-4a8d-8d01-a497db70de28",
"tax_region_id": null,
"coupon_id": null
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/documents
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=customer,order,tax_region |
fields[] |
Array List of comma seperated fields to include ?fields[documents]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][document_type] |
String One of invoice , contract , quote |
data[attributes][number] |
Integer The document number, must be unique per type. Automatically generated if left blank. |
data[attributes][prefix] |
String Add a prefix to document numbers to make it easier to identify different documents. You can add dynamic values (like a year or order number) and custom prefixes e.g. {year}-{customer_number} . |
data[attributes][date] |
Date Date the document was finalized |
data[attributes][due_date] |
Date The latest date by which the invoice must be fully paid |
data[attributes][name] |
String Customer name. If left blank, automatically populated with the customer name of the associated order |
data[attributes][address] |
String Customer Address. If left blank, automatically populated with the customer address of the associated order |
data[attributes][reference] |
String A project number or other reference |
data[attributes][revised] |
Boolean Whether document is revised (applies only to invoice ) |
data[attributes][finalized] |
Boolean Whether document is finalized ( quote and contract are always finalized) |
data[attributes][sent] |
Boolean Whether document is sent (with Booqable) |
data[attributes][confirmed] |
Boolean Whether document is confirmed, applies to quote and contract |
data[attributes][status] |
String One of confirmed , unconfirmed , revised , partially_paid , payment_due , paid , process_deposit , overpaid |
data[attributes][deposit_type] |
String One of none , percentage_total , percentage , fixed |
data[attributes][deposit_value] |
Float The value to use for deposit_type |
data[attributes][tag_list][] |
Array Case insensitive tag list |
data[attributes][discount_percentage] |
Float The discount percentage applied to this order |
data[attributes][order_id] |
Uuid The associated Order |
data[attributes][customer_id] |
Uuid The associated Customer |
data[attributes][tax_region_id] |
Uuid The associated Tax region |
data[attributes][coupon_id] |
Uuid The associated Coupon |
Includes
This request accepts the following includes:
customer
order
tax_region
lines
=>
item
=>
photo
tax_values
coupon
Updating a document
How to update a document:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/documents/5fac2f0b-a6e9-4f80-b0d6-c9a66846886a' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "5fac2f0b-a6e9-4f80-b0d6-c9a66846886a",
"type": "documents",
"attributes": {
"name": "Jane Doe"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "5fac2f0b-a6e9-4f80-b0d6-c9a66846886a",
"type": "documents",
"attributes": {
"created_at": "2024-09-30T09:26:56.588970+00:00",
"updated_at": "2024-09-30T09:26:57.412377+00:00",
"archived": false,
"archived_at": null,
"document_type": "invoice",
"number": null,
"prefix": null,
"prefix_with_number": null,
"date": null,
"due_date": null,
"name": "Jane Doe",
"address": null,
"reference": null,
"revised": false,
"finalized": false,
"sent": false,
"confirmed": false,
"status": "payment_due",
"signature_url": null,
"deposit_type": "percentage",
"deposit_value": 10.0,
"tag_list": [],
"price_in_cents": 80250,
"grand_total_in_cents": 72225,
"grand_total_with_tax_in_cents": 87392,
"discount_in_cents": 8025,
"coupon_discount_in_cents": 0,
"total_discount_in_cents": 8025,
"deposit_in_cents": 10000,
"deposit_paid_in_cents": 0,
"deposit_refunded_in_cents": 0,
"deposit_held_in_cents": 0,
"deposit_to_refund_in_cents": 0,
"to_be_paid_in_cents": 97392,
"paid_in_cents": 0,
"tax_in_cents": 15167,
"discount_percentage": 10.0,
"order_id": "bf2ab6ad-9603-46d7-8ca8-e9683739021e",
"customer_id": "eefbac17-e654-40c5-bb36-61b76b7c1524",
"tax_region_id": null,
"coupon_id": null
},
"relationships": {}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/documents/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=customer,order,tax_region |
fields[] |
Array List of comma seperated fields to include ?fields[documents]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][document_type] |
String One of invoice , contract , quote |
data[attributes][number] |
Integer The document number, must be unique per type. Automatically generated if left blank. |
data[attributes][prefix] |
String Add a prefix to document numbers to make it easier to identify different documents. You can add dynamic values (like a year or order number) and custom prefixes e.g. {year}-{customer_number} . |
data[attributes][date] |
Date Date the document was finalized |
data[attributes][due_date] |
Date The latest date by which the invoice must be fully paid |
data[attributes][name] |
String Customer name. If left blank, automatically populated with the customer name of the associated order |
data[attributes][address] |
String Customer Address. If left blank, automatically populated with the customer address of the associated order |
data[attributes][reference] |
String A project number or other reference |
data[attributes][revised] |
Boolean Whether document is revised (applies only to invoice ) |
data[attributes][finalized] |
Boolean Whether document is finalized ( quote and contract are always finalized) |
data[attributes][sent] |
Boolean Whether document is sent (with Booqable) |
data[attributes][confirmed] |
Boolean Whether document is confirmed, applies to quote and contract |
data[attributes][status] |
String One of confirmed , unconfirmed , revised , partially_paid , payment_due , paid , process_deposit , overpaid |
data[attributes][deposit_type] |
String One of none , percentage_total , percentage , fixed |
data[attributes][deposit_value] |
Float The value to use for deposit_type |
data[attributes][tag_list][] |
Array Case insensitive tag list |
data[attributes][discount_percentage] |
Float The discount percentage applied to this order |
data[attributes][order_id] |
Uuid The associated Order |
data[attributes][customer_id] |
Uuid The associated Customer |
data[attributes][tax_region_id] |
Uuid The associated Tax region |
data[attributes][coupon_id] |
Uuid The associated Coupon |
Includes
This request accepts the following includes:
customer
order
tax_region
lines
=>
item
=>
photo
tax_values
coupon
Archiving a document
When archiving an invoice make sure delete_invoices
permission is enabled.
How to archive a document:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/documents/9f31ef72-da17-4077-8908-5417114572e0' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "9f31ef72-da17-4077-8908-5417114572e0",
"type": "documents",
"attributes": {
"created_at": "2024-09-30T09:26:45.108132+00:00",
"updated_at": "2024-09-30T09:26:46.175299+00:00",
"archived": true,
"archived_at": "2024-09-30T09:26:46.175299+00:00",
"document_type": "invoice",
"number": null,
"prefix": null,
"prefix_with_number": null,
"date": null,
"due_date": null,
"name": "John Doe",
"address": null,
"reference": null,
"revised": false,
"finalized": false,
"sent": false,
"confirmed": false,
"status": "payment_due",
"signature_url": null,
"deposit_type": "percentage",
"deposit_value": 10.0,
"tag_list": [],
"price_in_cents": 80250,
"grand_total_in_cents": 72225,
"grand_total_with_tax_in_cents": 87392,
"discount_in_cents": 8025,
"coupon_discount_in_cents": 0,
"total_discount_in_cents": 8025,
"deposit_in_cents": 10000,
"deposit_paid_in_cents": 0,
"deposit_refunded_in_cents": 0,
"deposit_held_in_cents": 0,
"deposit_to_refund_in_cents": 0,
"to_be_paid_in_cents": 97392,
"paid_in_cents": 0,
"tax_in_cents": 15167,
"discount_percentage": 10.0,
"order_id": "9ca09092-a8c4-4827-8425-25c102cd7816",
"customer_id": "3228857e-0a58-483e-9335-59da074b32ec",
"tax_region_id": null,
"coupon_id": null
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/documents/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[documents]=created_at,updated_at,archived |
Includes
This request does not accept any includes
Email templates
Email templates allow for creating pre-filled emails with dynamic data. Booqable comes with automated templates which can be updated but not deleted.
For more information about using variables for dynamic data in e-mail templates see our help center
Endpoints
GET /api/boomerang/email_templates
GET /api/boomerang/email_templates/{id}
POST /api/boomerang/email_templates
PUT /api/boomerang/email_templates/{id}
DELETE /api/boomerang/email_templates/{id}
Fields
Every email template has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
name |
String Name of the template |
identifier |
String readonly A unique identifier assigned to this template |
subject |
String Email subject line template |
context |
String Which resource or process the template applies to. One of order , invoice , document , all , payment , user |
body |
String Email body template |
default |
Boolean readonly Whether this is a system default template |
automated |
Boolean readonly When true , this template is used by built-in features and can not be deleted. Updating is possible. |
Listing email templates
How to fetch a list of email templates:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/email_templates' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "42537834-c197-4dc5-8251-14d4b9747710",
"type": "email_templates",
"attributes": {
"created_at": "2024-09-30T09:29:05.536599+00:00",
"updated_at": "2024-09-30T09:29:05.536599+00:00",
"name": "Webshop confirmation",
"identifier": "webshop_confirmation",
"subject": "We received your order",
"context": "all",
"body": "We'll get started on it right away",
"default": false,
"automated": false
}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/email_templates
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[email_templates]=created_at,updated_at,name |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
name |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
identifier |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
context |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
default |
Boolean eq |
automated |
Boolean eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request does not accept any includes
Fetching an email template
How to fetch an email templates:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/email_templates/faf5101c-1608-4d93-b498-d3a5070d5018' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "faf5101c-1608-4d93-b498-d3a5070d5018",
"type": "email_templates",
"attributes": {
"created_at": "2024-09-30T09:29:04.650575+00:00",
"updated_at": "2024-09-30T09:29:04.650575+00:00",
"name": "Webshop confirmation",
"identifier": "webshop_confirmation",
"subject": "We received your order",
"context": "all",
"body": "We'll get started on it right away",
"default": false,
"automated": false
}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/email_templates/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=emails |
fields[] |
Array List of comma seperated fields to include ?fields[email_templates]=created_at,updated_at,name |
Includes
This request accepts the following includes:
emails
Creating an email template
How to create a email template:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/email_templates' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "email_templates",
"attributes": {
"name": "Webshop confirmation",
"subject": "We received your order (#{{order.number}})",
"body": "We'll get started on it right away. Your order number is #{{order.number}}.",
"context": "order"
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "088bd148-9c20-4483-8e06-68a354e9a2a0",
"type": "email_templates",
"attributes": {
"created_at": "2024-09-30T09:29:06.894374+00:00",
"updated_at": "2024-09-30T09:29:06.894374+00:00",
"name": "Webshop confirmation",
"identifier": "webshop_confirmation",
"subject": "We received your order (#{{order.number}})",
"context": "order",
"body": "We'll get started on it right away. Your order number is #{{order.number}}.",
"default": false,
"automated": false
}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/email_templates
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[email_templates]=created_at,updated_at,name |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the template |
data[attributes][subject] |
String Email subject line template |
data[attributes][context] |
String Which resource or process the template applies to. One of order , invoice , document , all , payment , user |
data[attributes][body] |
String Email body template |
Includes
This request does not accept any includes
Updating an email template
How to update an email template:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/email_templates/cfcf0136-b3f7-4008-afe0-6b5471d1f192' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "cfcf0136-b3f7-4008-afe0-6b5471d1f192",
"type": "email_templates",
"attributes": {
"name": "Order confirmation"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "cfcf0136-b3f7-4008-afe0-6b5471d1f192",
"type": "email_templates",
"attributes": {
"created_at": "2024-09-30T09:29:03.460084+00:00",
"updated_at": "2024-09-30T09:29:03.490765+00:00",
"name": "Order confirmation",
"identifier": "webshop_confirmation",
"subject": "We received your order",
"context": "all",
"body": "We'll get started on it right away",
"default": false,
"automated": false
}
},
"meta": {}
}
How to update a default email template:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/email_templates/a87c9ca6-6734-4064-a1b6-b6ac86bb0324' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "a87c9ca6-6734-4064-a1b6-b6ac86bb0324",
"type": "email_templates",
"attributes": {
"name": "Order confirmation"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "a87c9ca6-6734-4064-a1b6-b6ac86bb0324",
"type": "email_templates",
"attributes": {
"created_at": "2024-09-30T09:29:04.006861+00:00",
"updated_at": "2024-09-30T09:29:04.029053+00:00",
"name": "Order confirmation",
"identifier": "webshop_confirmation",
"subject": "We received your order",
"context": "all",
"body": "We'll get started on it right away",
"default": true,
"automated": false
}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/email_templates/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[email_templates]=created_at,updated_at,name |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the template |
data[attributes][subject] |
String Email subject line template |
data[attributes][context] |
String Which resource or process the template applies to. One of order , invoice , document , all , payment , user |
data[attributes][body] |
String Email body template |
Includes
This request does not accept any includes
Deleting an email template
How to delete a email template:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/email_templates/966644aa-90ad-4edc-9262-db1f67355cf0' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "966644aa-90ad-4edc-9262-db1f67355cf0",
"type": "email_templates",
"attributes": {
"created_at": "2024-09-30T09:29:06.338597+00:00",
"updated_at": "2024-09-30T09:29:06.338597+00:00",
"name": "Sales Tax",
"identifier": "sales_tax",
"subject": "This is a subject!",
"context": "all",
"body": "Hi there user!",
"default": false,
"automated": false
}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/email_templates/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[email_templates]=created_at,updated_at,name |
Includes
This request does not accept any includes
Emails
Emails allow you to easily communicate with your customers by using optional templates. Booqable keeps a history of e-mail being sent for orders or customers.
Endpoints
GET /api/boomerang/emails
POST /api/boomerang/emails
Fields
Every email has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
subject |
String Email subject |
body |
String Email body |
recipients |
String Comma seperated list of recipient email addresses, all addresses must be valid for the email to send. |
has_error |
Boolean readonly Whether any errors occur when sending this email |
sent |
Boolean readonly Whether the email was sent successfully |
document_ids |
Array Documents to send as attachments to the email |
order_id |
Uuid The associated Order |
customer_id |
Uuid The associated Customer |
email_template_id |
Uuid The associated Email template |
employee_id |
Uuid readonly The associated Employee |
Relationships
Emails have the following relationships:
Name | Description |
---|---|
customer |
Customers readonly Associated Customer |
email_template |
Email templates readonly Associated Email template |
employee |
Employees readonly Associated Employee |
order |
Orders readonly Associated Order |
Listing emails
How to fetch a list of emails:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/emails' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "b1fe2b0a-7219-4c42-a379-b9c8cafd6b0b",
"type": "emails",
"attributes": {
"created_at": "2024-09-30T09:23:03.743708+00:00",
"updated_at": "2024-09-30T09:23:03.743708+00:00",
"subject": "Order confirmation",
"body": "We hereby confirm your order with number #123",
"recipients": "[email protected]",
"has_error": false,
"sent": false,
"document_ids": [],
"order_id": null,
"customer_id": "ef871334-8b7f-44ce-8be1-e4d5214ea894",
"email_template_id": null,
"employee_id": null
},
"relationships": {}
}
],
"meta": {}
}
How to fetch a list of emails for a specific order:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/emails?filter%5Border_id%5D=3e34f6c9-1823-491a-9fc1-e3cc4d36ba48' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "946a1e67-b440-453f-bd0b-6fb691cb107f",
"type": "emails",
"attributes": {
"created_at": "2024-09-30T09:23:03.183886+00:00",
"updated_at": "2024-09-30T09:23:03.233606+00:00",
"subject": "Order confirmation",
"body": "We hereby confirm your order with number #123",
"recipients": "[email protected]",
"has_error": false,
"sent": false,
"document_ids": [],
"order_id": "3e34f6c9-1823-491a-9fc1-e3cc4d36ba48",
"customer_id": "71b6af7a-78a8-4d60-82cc-ec2a4c4f7655",
"email_template_id": null,
"employee_id": null
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/emails
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=customer,order |
fields[] |
Array List of comma seperated fields to include ?fields[emails]=created_at,updated_at,subject |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
has_error |
Boolean eq |
sent |
Boolean eq |
order_id |
Uuid eq , not_eq |
customer_id |
Uuid eq , not_eq |
email_template_id |
Uuid eq , not_eq |
employee_id |
Uuid eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
has_error |
Array count |
Includes
This request accepts the following includes:
customer
order
Creating and sending an email
How to create and send an email:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/emails' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "emails",
"attributes": {
"recipients": "[email protected],[email protected]",
"subject": "Order confirmation",
"body": "Hi {{customer.name}}",
"email_template_id": "95555b35-8b76-47fa-b7d2-821e0c0d14fb",
"order_id": "60031886-0747-4d78-8ce0-71221a8b6597",
"customer_id": "3a17d21f-e803-4de2-8a84-10e87b7ea7a8",
"document_ids": [
"ff435b6f-6797-4ab7-bc0a-b05d6feb7f7b"
]
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "3f8ffacd-7591-4813-8215-80dbc8b47108",
"type": "emails",
"attributes": {
"created_at": "2024-09-30T09:23:04.626245+00:00",
"updated_at": "2024-09-30T09:23:04.626245+00:00",
"subject": "Order confirmation",
"body": "Hi {{customer.name}}",
"recipients": "[email protected],[email protected]",
"has_error": false,
"sent": false,
"document_ids": [
"ff435b6f-6797-4ab7-bc0a-b05d6feb7f7b"
],
"order_id": "60031886-0747-4d78-8ce0-71221a8b6597",
"customer_id": "3a17d21f-e803-4de2-8a84-10e87b7ea7a8",
"email_template_id": "95555b35-8b76-47fa-b7d2-821e0c0d14fb",
"employee_id": "26d1130d-ce89-48db-a87e-57a88716c9f3"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/emails
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=customer,order,email_template |
fields[] |
Array List of comma seperated fields to include ?fields[emails]=created_at,updated_at,subject |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][subject] |
String Email subject |
data[attributes][body] |
String Email body |
data[attributes][recipients] |
String Comma seperated list of recipient email addresses, all addresses must be valid for the email to send. |
data[attributes][document_ids][] |
Array Documents to send as attachments to the email |
data[attributes][order_id] |
Uuid The associated Order |
data[attributes][customer_id] |
Uuid The associated Customer |
data[attributes][email_template_id] |
Uuid The associated Email template |
Includes
This request accepts the following includes:
customer
order
email_template
Employees
Employees give access to a Booqable account. You can set different permissions for each employee and let other people use Booqable without giving them access to sensitive information (or taking other unwanted actions).
Employees also allow you to streamline Booqable's interface for specific roles or use cases. For example, if you create an account for someone dedicated to looking after your financials and accounting, it wouldn't need to manage your products and stock levels.
Endpoints
GET /api/boomerang/employees
GET /api/boomerang/employees/{id}
PUT /api/boomerang/employees/{id}
Fields
Every employee has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
name |
String readonly Full name of the employee |
firstname |
String First name of the employee |
lastname |
String Last name of the employee |
locale |
String Locale of the employee, used as application locale |
email |
String Employee's e-mail address |
unconfirmed_email |
String readonly Unconfirmed e-mail address if present |
viewed_whats_new_at |
Datetime Date when this employee viewed product updates for the last time (Used internally by Booqable) |
current_password |
String writeonly Current password, needed to update password or email address |
password |
String writeonly Set a new password |
password_confirmation |
String writeonly Confirm new password |
active |
Boolean Whether this employee is active (counts towards billing) |
deactivated_at |
Datetime writeonly Employee deactivation date |
owner |
Boolean readonly Whether this employee is the account owner |
confirmed |
Boolean readonly Whether this employee confirmed it's email address |
time_to_confirm |
Integer readonly Time in days left to confirm |
permissions |
Array Any of: reports , products , settings , security_settings , account , exports , cancel_orders , revert_orders , delete_invoices , make_invoice_revisions , override_rental_period . All permissions are always returned when this feature is not included in the current pricing plan or if the employee is the account owner |
avatar_base64 |
String writeonly Base64 encoded avatar |
remove_avatar |
Boolean writeonly Remove current avatar |
has_two_factor_autentication |
Boolean readonly Whether two factor authentication is enabled |
avatar_url |
String readonly Url to avatar |
large_avatar_url |
String readonly Url to avatar (Large) |
third_party_id |
String readonly ID used for third party tools |
Listing employees
How to fetch a list of employees:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/employees' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "df0ab2a5-8dfb-4a33-b538-788dc6444d49",
"type": "employees",
"attributes": {
"created_at": "2024-09-30T09:25:32.266691+00:00",
"updated_at": "2024-09-30T09:25:32.271500+00:00",
"name": "John Doe",
"firstname": "John",
"lastname": "Doe",
"locale": null,
"email": "[email protected]",
"unconfirmed_email": null,
"viewed_whats_new_at": "2024-09-30T09:25:32.259406+00:00",
"active": true,
"owner": true,
"confirmed": true,
"time_to_confirm": 0,
"permissions": [
"reports",
"products",
"settings",
"security_settings",
"account",
"exports",
"cancel_orders",
"revert_orders",
"delete_invoices",
"make_invoice_revisions",
"override_rental_period"
],
"has_two_factor_autentication": false,
"avatar_url": "https://gravatar.com/avatar/6a6c19fea4a3676970167ce51f39e6ee.png?d=404",
"large_avatar_url": "https://gravatar.com/avatar/6a6c19fea4a3676970167ce51f39e6ee.png?d=mm&size=200"
}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/employees
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[employees]=created_at,updated_at,name |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
locale |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
email |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
active |
Boolean eq |
deactivated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
owner |
Boolean eq |
confirmed |
Boolean eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request does not accept any includes
Fetching an employee
How to fetch a employee:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/employees/9b291378-7327-413d-ba86-82290466155b' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "9b291378-7327-413d-ba86-82290466155b",
"type": "employees",
"attributes": {
"created_at": "2024-09-30T09:25:31.712382+00:00",
"updated_at": "2024-09-30T09:25:31.712382+00:00",
"name": "John Doe",
"firstname": "John",
"lastname": "Doe",
"locale": null,
"email": "[email protected]",
"unconfirmed_email": null,
"viewed_whats_new_at": "2024-09-30T09:25:31.704960+00:00",
"active": true,
"owner": true,
"confirmed": true,
"time_to_confirm": 0,
"permissions": [
"reports",
"products",
"settings",
"security_settings",
"account",
"exports",
"cancel_orders",
"revert_orders",
"delete_invoices",
"make_invoice_revisions",
"override_rental_period"
],
"has_two_factor_autentication": false,
"avatar_url": "https://gravatar.com/avatar/6a6c19fea4a3676970167ce51f39e6ee.png?d=404",
"large_avatar_url": "https://gravatar.com/avatar/6a6c19fea4a3676970167ce51f39e6ee.png?d=mm&size=200"
}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/employees/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[employees]=created_at,updated_at,name |
Includes
This request does not accept any includes
Updating an employee
How to update an employee:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/employees/cdef9f58-f02e-4fb8-af55-55ec36a61fcf' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "cdef9f58-f02e-4fb8-af55-55ec36a61fcf",
"type": "employees",
"attributes": {
"firstname": "Jane"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "cdef9f58-f02e-4fb8-af55-55ec36a61fcf",
"type": "employees",
"attributes": {
"created_at": "2024-09-30T09:25:31.063354+00:00",
"updated_at": "2024-09-30T09:25:31.109761+00:00",
"name": "Jane Doe",
"firstname": "Jane",
"lastname": "Doe",
"locale": null,
"email": "[email protected]",
"unconfirmed_email": null,
"viewed_whats_new_at": "2024-09-30T09:25:31.053561+00:00",
"active": true,
"owner": false,
"confirmed": true,
"time_to_confirm": 0,
"permissions": [
"reports",
"products",
"settings",
"security_settings",
"account",
"exports",
"cancel_orders",
"revert_orders",
"delete_invoices",
"make_invoice_revisions",
"override_rental_period"
],
"has_two_factor_autentication": false,
"avatar_url": "https://gravatar.com/avatar/35f5782642e9fa0f6cfff5a552e2ae97.png?d=404",
"large_avatar_url": "https://gravatar.com/avatar/35f5782642e9fa0f6cfff5a552e2ae97.png?d=mm&size=200"
}
},
"meta": {}
}
How to de-activate an employee:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/employees/75e7754e-2efa-42b8-94ad-2f90f6aca834' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "75e7754e-2efa-42b8-94ad-2f90f6aca834",
"type": "employees",
"attributes": {
"active": false
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "75e7754e-2efa-42b8-94ad-2f90f6aca834",
"type": "employees",
"attributes": {
"created_at": "2024-09-30T09:25:29.802441+00:00",
"updated_at": "2024-09-30T09:25:29.839004+00:00",
"name": "John Doe",
"firstname": "John",
"lastname": "Doe",
"locale": null,
"email": "[email protected]",
"unconfirmed_email": null,
"viewed_whats_new_at": "2024-09-30T09:25:29.794371+00:00",
"active": false,
"owner": false,
"confirmed": true,
"time_to_confirm": 0,
"permissions": [
"reports",
"products",
"settings",
"security_settings",
"account",
"exports",
"cancel_orders",
"revert_orders",
"delete_invoices",
"make_invoice_revisions",
"override_rental_period"
],
"has_two_factor_autentication": false,
"avatar_url": "https://gravatar.com/avatar/35f5782642e9fa0f6cfff5a552e2ae97.png?d=404",
"large_avatar_url": "https://gravatar.com/avatar/35f5782642e9fa0f6cfff5a552e2ae97.png?d=mm&size=200"
}
},
"meta": {}
}
How to set permissions:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/employees/4c861d5e-0953-42e2-90f3-69208732792b' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "4c861d5e-0953-42e2-90f3-69208732792b",
"type": "employees",
"attributes": {
"permissions": [
"reports",
"settings"
]
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "4c861d5e-0953-42e2-90f3-69208732792b",
"type": "employees",
"attributes": {
"created_at": "2024-09-30T09:25:30.447159+00:00",
"updated_at": "2024-09-30T09:25:30.493968+00:00",
"name": "John Doe",
"firstname": "John",
"lastname": "Doe",
"locale": null,
"email": "[email protected]",
"unconfirmed_email": null,
"viewed_whats_new_at": "2024-09-30T09:25:30.440300+00:00",
"active": true,
"owner": false,
"confirmed": true,
"time_to_confirm": 0,
"permissions": [
"reports",
"settings"
],
"has_two_factor_autentication": false,
"avatar_url": "https://gravatar.com/avatar/35f5782642e9fa0f6cfff5a552e2ae97.png?d=404",
"large_avatar_url": "https://gravatar.com/avatar/35f5782642e9fa0f6cfff5a552e2ae97.png?d=mm&size=200"
}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/employees/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[employees]=created_at,updated_at,name |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][firstname] |
String First name of the employee |
data[attributes][lastname] |
String Last name of the employee |
data[attributes][locale] |
String Locale of the employee, used as application locale |
data[attributes][email] |
String Employee's e-mail address |
data[attributes][viewed_whats_new_at] |
Datetime Date when this employee viewed product updates for the last time (Used internally by Booqable) |
data[attributes][current_password] |
String Current password, needed to update password or email address |
data[attributes][password] |
String Set a new password |
data[attributes][password_confirmation] |
String Confirm new password |
data[attributes][active] |
Boolean Whether this employee is active (counts towards billing) |
data[attributes][deactivated_at] |
Datetime Employee deactivation date |
data[attributes][permissions][] |
Array Any of: reports , products , settings , security_settings , account , exports , cancel_orders , revert_orders , delete_invoices , make_invoice_revisions , override_rental_period . All permissions are always returned when this feature is not included in the current pricing plan or if the employee is the account owner |
data[attributes][avatar_base64] |
String Base64 encoded avatar |
data[attributes][remove_avatar] |
Boolean Remove current avatar |
Includes
This request does not accept any includes
Inventory levels
Inventory levels provide information on item availability. It describes availability, stock counts, and planned quantities for given items.
Endpoints
GET /api/boomerang/inventory_levels
Fields
Every inventory level has the following fields:
Name | Description |
---|---|
id |
Uuid readonly |
item_id |
Uuid The associated Item |
order_id |
Uuid readonly Return data for all items on an order |
location_id |
Uuid The associated Location |
location_available |
Integer readonly The available quantity for the given location |
location_stock_count |
Integer readonly The quantity of stock present for the given the location |
location_plannable |
Integer readonly The number of products that can be planned for the given location |
location_planned |
Integer readonly The planned quantity for the given location |
location_needed |
Integer readonly The needed quantity for the given location. This quantity does not contain what has already been returned for an order ( planned - stopped ) |
cluster_available |
Integer readonly The available quantity for the cluster the given location is part of |
cluster_stock_count |
Integer readonly The stock count for the cluster the given location is part of |
cluster_plannable |
Integer readonly The planned quantity for the cluster the given location is part of |
cluster_planned |
Integer readonly The planned quantity for the cluster the given location is part of |
cluster_needed |
Integer readonly The needed quantity for the cluster the given location is part of. This quantity does not contain what has already been returned for an order ( planned - stopped ) |
Relationships
Inventory levels have the following relationships:
Name | Description |
---|---|
item |
Items readonly Associated Item |
location |
Locations readonly Associated Location |
Obtaining inventory levels for a product
How to fetch inventory levels for a product:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/inventory_levels?filter%5Bfrom%5D=2022-01-01+09%3A00%3A00&filter%5Bitem_id%5D=a0731c78-b29d-46cf-b469-1fece343923e&filter%5Btill%5D=2022-01-02+09%3A00%3A00' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "7f369cfe-0730-51c3-974b-cb2cc8f59871",
"type": "inventory_levels",
"attributes": {
"item_id": "a0731c78-b29d-46cf-b469-1fece343923e",
"order_id": null,
"location_id": "bd8f8672-33eb-47e1-b2f5-fedef5f2594d",
"location_available": 0,
"location_stock_count": 0,
"location_plannable": 0,
"location_planned": 0,
"location_needed": 0,
"cluster_available": 0,
"cluster_stock_count": 0,
"cluster_plannable": 0,
"cluster_planned": 0,
"cluster_needed": 0
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/inventory_levels
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=item,location |
fields[] |
Array List of comma seperated fields to include ?fields[inventory_levels]=item_id,order_id,location_id |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
item_id |
Uuid eq |
order_id |
Uuid eq |
location_id |
Uuid eq |
from |
Datetime required eq |
till |
Datetime required eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request accepts the following includes:
item
location
Obtaining inventory levels for a product for a specific location
How to fetch inventory levels for a product for a specific location:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/inventory_levels?filter%5Bfrom%5D=2022-01-01+09%3A00%3A00&filter%5Bitem_id%5D=3ae947fe-4056-4b06-ad91-a6fb3c4ddf3c&filter%5Blocation_id%5D=09ba8f90-86bc-458a-b881-9b974a195dc5&filter%5Btill%5D=2022-01-02+09%3A00%3A00' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "5b43e7cf-e0e9-5708-a1b5-9ff447e81724",
"type": "inventory_levels",
"attributes": {
"item_id": "3ae947fe-4056-4b06-ad91-a6fb3c4ddf3c",
"order_id": null,
"location_id": "09ba8f90-86bc-458a-b881-9b974a195dc5",
"location_available": 0,
"location_stock_count": 0,
"location_plannable": 0,
"location_planned": 0,
"location_needed": 0,
"cluster_available": 0,
"cluster_stock_count": 0,
"cluster_plannable": 0,
"cluster_planned": 0,
"cluster_needed": 0
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/inventory_levels
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=item,location |
fields[] |
Array List of comma seperated fields to include ?fields[inventory_levels]=item_id,order_id,location_id |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
item_id |
Uuid eq |
order_id |
Uuid eq |
location_id |
Uuid eq |
from |
Datetime required eq |
till |
Datetime required eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request accepts the following includes:
item
location
Invoice finalizations
Pro forma invoices are automatically generated and updated when changes
are made to an order. The InvoiceFinalizationResource
resource allows
to request the finalization of the current pro forma invoice.
Further changes to the order will trigger a new pro forma invoice to be
generated with prorated changes.
Fields
Every invoice finalization has the following fields:
Name | Description |
---|---|
id |
Uuid readonly |
document_id |
Uuid The associated Document |
Relationships
Invoice finalizations have the following relationships:
Name | Description |
---|---|
document |
Documents Associated Document |
Finalize invoice
Finalize a pro forma invoice:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/invoice_finalizations' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "invoice_finalization",
"attributes": {
"document_id": "2479f936-ce28-4d14-a016-a8596c822479"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "d3b41705-aabd-5cc4-83ee-df9b7bb21608",
"type": "invoice_finalizations",
"attributes": {
"document_id": "2479f936-ce28-4d14-a016-a8596c822479"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/invoice_finalizations
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=document |
fields[] |
Array List of comma seperated fields to include ?fields[invoice_finalizations]=document_id |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][document_id] |
Uuid The associated Document |
Includes
This request accepts the following includes:
document
=>
order
=>
documents
Invoice revisions
Revises the last finalized invoice for an order by combining it with the current pro forma invoice and creating a new finalized invoice.
Creating a revision requires that there is a finalized invoice, and that there is a pro forma invoice (i.e. changes must have been made to the order since the last finalized invoice).
Fields
Every invoice revision has the following fields:
Name | Description |
---|---|
id |
Uuid readonly |
order_id |
Uuid The associated Order |
revised_invoice_id |
Uuid readonly The associated Revised invoice |
revision_invoice_id |
Uuid readonly The associated Revision invoice |
Relationships
Invoice revisions have the following relationships:
Name | Description |
---|---|
order |
Orders Associated Order |
revised_invoice |
Documents readonly Associated Revised invoice |
revision_invoice |
Documents readonly Associated Revision invoice |
Revise invoice
Revise a finalized invoice:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/invoice_revisions' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "invoice_revisions",
"attributes": {
"order_id": "c176037c-558e-4fef-8345-b5fc954cba5d"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "1cbf4460-f925-56f1-a63c-899aceb2e923",
"type": "invoice_revisions",
"attributes": {
"order_id": "c176037c-558e-4fef-8345-b5fc954cba5d",
"revised_invoice_id": "f0dbcc57-0a69-4c86-9d10-833d56c61ba7",
"revision_invoice_id": "3189aabc-e6b2-4c51-9a33-4f7e0f9af18c"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/invoice_revisions
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=order,revised_invoice,revision_invoice |
fields[] |
Array List of comma seperated fields to include ?fields[invoice_revisions]=order_id,revised_invoice_id,revision_invoice_id |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][order_id] |
Uuid The associated Order |
Includes
This request accepts the following includes:
order
revised_invoice
revision_invoice
Items
The Item resource gives the ability to fetch the following resources:
- Product groups
- Products
- Bundles
The description of the behavior for these resources can be found in their respective sections
Endpoints
GET /api/boomerang/items
POST api/boomerang/items/search
GET /api/boomerang/items/{id}
Fields
For this resource fields are described in the following resources:
- Product groups
- Products
- Bundles
Relationships
For this resource relationships are described in the following resources:
- Product groups
- Products
- Bundles
Listing items
How to fetch a list of items:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/items' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "f534cfd8-4765-4533-84f4-ed4ecb67da84",
"type": "bundles",
"attributes": {
"created_at": "2024-09-30T09:25:17.967577+00:00",
"updated_at": "2024-09-30T09:25:17.967577+00:00",
"archived": false,
"archived_at": null,
"type": "bundles",
"name": "iPad Bundle",
"slug": "ipad-bundle",
"product_type": "bundle",
"extra_information": null,
"photo_url": null,
"description": null,
"excerpt": null,
"show_in_store": true,
"sorting_weight": 0,
"discountable": true,
"taxable": true,
"seo_title": null,
"seo_description": null,
"tag_list": [
"tablets",
"apple"
],
"photo_id": null,
"tax_category_id": null
},
"relationships": {}
},
{
"id": "fa61b841-b39a-4558-92bd-ae4dba915a99",
"type": "product_groups",
"attributes": {
"created_at": "2024-09-30T09:25:18.086107+00:00",
"updated_at": "2024-09-30T09:25:18.102349+00:00",
"archived": false,
"archived_at": null,
"type": "product_groups",
"name": "iPad Pro",
"group_name": null,
"slug": "ipad-pro",
"sku": "SKU",
"lead_time": 0,
"lag_time": 0,
"product_type": "rental",
"tracking_type": "trackable",
"trackable": true,
"has_variations": false,
"variation": false,
"extra_information": "Charging cable and case included",
"photo_url": null,
"description": "The Apple iPad Pro (2021) 12.9 inches 128GB Space Gray is one of the most powerful and fastest tablets of this moment thanks to the new M1 chip. This chip ensures that demanding apps from Adobe or 3D games run smoothly",
"excerpt": null,
"show_in_store": true,
"sorting_weight": 0,
"base_price_in_cents": 1995,
"price_type": "simple",
"price_period": "day",
"deposit_in_cents": 10000,
"discountable": true,
"taxable": true,
"seo_title": null,
"seo_description": null,
"tag_list": [
"tablets",
"apple"
],
"properties": {},
"photo_id": null,
"tax_category_id": "743833a9-66b6-4c2d-8746-bc2298965c89",
"price_ruleset_id": null,
"price_structure_id": null,
"allow_shortage": true,
"shortage_limit": 3,
"variation_fields": [],
"flat_fee_price_in_cents": 1995,
"structure_price_in_cents": 0,
"stock_item_properties": []
},
"relationships": {}
},
{
"id": "33318b9c-8cf0-4b97-a70a-f3efd4e678f7",
"type": "products",
"attributes": {
"created_at": "2024-09-30T09:25:18.092035+00:00",
"updated_at": "2024-09-30T09:25:18.092035+00:00",
"archived": false,
"archived_at": null,
"type": "products",
"name": "iPad Pro",
"group_name": "iPad Pro",
"slug": "ipad-pro",
"sku": "SKU",
"lead_time": 0,
"lag_time": 0,
"product_type": "rental",
"tracking_type": "trackable",
"trackable": true,
"has_variations": false,
"variation": false,
"extra_information": "Charging cable and case included",
"photo_url": null,
"description": "The Apple iPad Pro (2021) 12.9 inches 128GB Space Gray is one of the most powerful and fastest tablets of this moment thanks to the new M1 chip. This chip ensures that demanding apps from Adobe or 3D games run smoothly",
"excerpt": null,
"show_in_store": true,
"sorting_weight": 1,
"base_price_in_cents": 1995,
"price_type": "simple",
"price_period": "day",
"deposit_in_cents": 10000,
"discountable": true,
"taxable": true,
"seo_title": null,
"seo_description": null,
"tag_list": [
"tablets",
"apple"
],
"properties": {},
"photo_id": null,
"tax_category_id": "743833a9-66b6-4c2d-8746-bc2298965c89",
"price_ruleset_id": null,
"price_structure_id": null,
"variation_values": [],
"allow_shortage": true,
"shortage_limit": 3,
"product_group_id": "fa61b841-b39a-4558-92bd-ae4dba915a99"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/items
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=bundle_items,inventory_levels,photo |
fields[] |
Array List of comma seperated fields to include ?fields[items]=created_at,updated_at,archived |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq , gt |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
archived |
Boolean eq |
archived_at |
Datetime eq , not_eq , gt , gte , lt , lte |
type |
String eq , not_eq |
name |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
group_name |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
slug |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
sku |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
lead_time |
Integer eq , not_eq , gt , gte , lt , lte |
lag_time |
Integer eq , not_eq , gt , gte , lt , lte |
product_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
tracking_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
trackable |
Boolean eq |
has_variations |
Boolean eq |
variation |
Boolean eq |
extra_information |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
description |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
excerpt |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
show_in_store |
Boolean eq |
sorting_weight |
Integer eq , not_eq , gt , gte , lt , lte |
base_price_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
price_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
price_period |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
deposit_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
discountable |
Boolean eq |
taxable |
Boolean eq |
seo_title |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
seo_description |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
tag_list |
String eq |
tax_category_id |
Uuid eq , not_eq |
price_ruleset_id |
Uuid eq , not_eq |
price_structure_id |
Uuid eq , not_eq |
q |
String eq |
collection_id |
Uuid eq , not_eq |
product_group_id |
Uuid eq |
conditions |
Hash eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
archived |
Array count |
tag_list |
Array count |
taxable |
Array count |
discountable |
Array count |
product_type |
Array count |
tracking_type |
Array count |
show_in_store |
Array count |
price_type |
Array count |
price_period |
Array count |
tax_category_id |
Array count |
deposit_in_cents |
Array sum , maximum , minimum , average |
base_price_in_cents |
Array sum , maximum , minimum , average |
Includes
This request accepts the following includes:
bundle_items
inventory_levels
photo
Searching items
Use advanced search to make logical filter groups with and/or operators.
How to search for items:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/items/search' \
--header 'content-type: application/json' \
--data '{
"fields": {
"items": "id"
},
"filter": {
"conditions": {
"operator": "or",
"attributes": [
{
"operator": "and",
"attributes": [
{
"discountable": true
},
{
"taxable": true
}
]
},
{
"operator": "and",
"attributes": [
{
"show_in_store": true
},
{
"taxable": true
}
]
}
]
}
}
}'
A 200 status response looks like this:
{
"data": [
{
"id": "db3f220f-235e-48c0-a8ae-e3921fa8b82e"
},
{
"id": "7d7dc8e9-9c52-4789-9565-6f0bc3350165"
},
{
"id": "05424bd4-1065-42bb-8442-622f2b559ae7"
},
{
"id": "ce48f429-e754-4e0f-8a7d-d7d68d3941c5"
},
{
"id": "e7ab0e86-f3b1-4ff2-92fc-c3fb3230977c"
}
]
}
HTTP Request
POST api/boomerang/items/search
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=bundle_items,inventory_levels,photo |
fields[] |
Array List of comma seperated fields to include ?fields[items]=created_at,updated_at,archived |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq , gt |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
archived |
Boolean eq |
archived_at |
Datetime eq , not_eq , gt , gte , lt , lte |
type |
String eq , not_eq |
name |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
group_name |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
slug |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
sku |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
lead_time |
Integer eq , not_eq , gt , gte , lt , lte |
lag_time |
Integer eq , not_eq , gt , gte , lt , lte |
product_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
tracking_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
trackable |
Boolean eq |
has_variations |
Boolean eq |
variation |
Boolean eq |
extra_information |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
description |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
excerpt |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
show_in_store |
Boolean eq |
sorting_weight |
Integer eq , not_eq , gt , gte , lt , lte |
base_price_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
price_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
price_period |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
deposit_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
discountable |
Boolean eq |
taxable |
Boolean eq |
seo_title |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
seo_description |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
tag_list |
String eq |
tax_category_id |
Uuid eq , not_eq |
price_ruleset_id |
Uuid eq , not_eq |
price_structure_id |
Uuid eq , not_eq |
q |
String eq |
collection_id |
Uuid eq , not_eq |
product_group_id |
Uuid eq |
conditions |
Hash eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
archived |
Array count |
tag_list |
Array count |
taxable |
Array count |
discountable |
Array count |
product_type |
Array count |
tracking_type |
Array count |
show_in_store |
Array count |
price_type |
Array count |
price_period |
Array count |
tax_category_id |
Array count |
deposit_in_cents |
Array sum , maximum , minimum , average |
base_price_in_cents |
Array sum , maximum , minimum , average |
Includes
This request accepts the following includes:
bundle_items
inventory_levels
photo
Fetching an item
How to fetch an item:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/items/3503638f-c8d1-4c18-b3d9-e5b1ee13f931' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "3503638f-c8d1-4c18-b3d9-e5b1ee13f931",
"type": "product_groups",
"attributes": {
"created_at": "2024-09-30T09:25:21.076628+00:00",
"updated_at": "2024-09-30T09:25:21.088065+00:00",
"archived": false,
"archived_at": null,
"type": "product_groups",
"name": "iPad Pro",
"group_name": null,
"slug": "ipad-pro",
"sku": "SKU",
"lead_time": 0,
"lag_time": 0,
"product_type": "rental",
"tracking_type": "trackable",
"trackable": true,
"has_variations": false,
"variation": false,
"extra_information": "Charging cable and case included",
"photo_url": null,
"description": "The Apple iPad Pro (2021) 12.9 inches 128GB Space Gray is one of the most powerful and fastest tablets of this moment thanks to the new M1 chip. This chip ensures that demanding apps from Adobe or 3D games run smoothly",
"excerpt": null,
"show_in_store": true,
"sorting_weight": 0,
"base_price_in_cents": 1995,
"price_type": "simple",
"price_period": "day",
"deposit_in_cents": 10000,
"discountable": true,
"taxable": true,
"seo_title": null,
"seo_description": null,
"tag_list": [
"tablets",
"apple"
],
"properties": {},
"photo_id": null,
"tax_category_id": "f9ed42fd-e776-4924-8e35-0ceac6b0c924",
"price_ruleset_id": null,
"price_structure_id": null,
"allow_shortage": true,
"shortage_limit": 3,
"variation_fields": [],
"flat_fee_price_in_cents": 1995,
"structure_price_in_cents": 0,
"stock_item_properties": []
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/items/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=bundle_items,inventory_levels,photo |
fields[] |
Array List of comma seperated fields to include ?fields[items]=created_at,updated_at,archived |
Includes
This request accepts the following includes:
bundle_items
inventory_levels
photo
Item prices
Allows you to calculate pricing for an item based on parameters.
You can calculate a price in a couple ways:
- Providing a
from
andtill
, charge label and length will be derived from the dates provided - Providing a
charge_length
Fields
Every item price has the following fields:
Name | Description |
---|---|
id |
Uuid readonly |
item_id |
Uuid The associated Item |
from |
Datetime Start of charge period |
till |
Datetime End of charge period |
original_charge_length |
Integer readonly Length of charge period before charge rules are applied |
charge_length |
Integer Length of charge period in seconds |
original_charge_label |
String readonly Label of charge period before charge rules are applied |
charge_label |
String readonly Label for the charge period |
original_price_each_in_cents |
Integer readonly Price per item before charge rules are applied |
price_each_in_cents |
Integer readonly Final price per item |
price_rule_values |
Hash readonly What price rules were applied |
price_structure_id |
Uuid The associated Price structure |
price_ruleset_id |
Uuid The associated Price ruleset |
price_tile_id |
Uuid readonly The associated Price tile |
Relationships
Item prices have the following relationships:
Name | Description |
---|---|
item |
Items readonly Associated Item |
price_ruleset |
Price rulesets readonly Associated Price ruleset |
price_structure |
Price structures readonly Associated Price structure |
price_tile |
Price tiles readonly Associated Price tile |
Calcuating the price of products and/or bundles
Calculating price for a period:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/item_prices?filter%5Bfrom%5D=2030-01-01+12%3A00%3A00+UTC&filter%5Bitem_id%5D%5B%5D=45905bf3-bf37-4803-9506-9cc474f012ef&filter%5Bitem_id%5D%5B%5D=b309da20-982e-46a5-953a-3fc124ebd36d&filter%5Btill%5D=2030-01-14+12%3A00%3A00+UTC&include=item' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "d62aa140-b7ec-4b3f-a149-9d7c334f0da7",
"type": "item_prices",
"attributes": {
"item_id": "45905bf3-bf37-4803-9506-9cc474f012ef",
"from": "2030-01-01T12:00:00.000000+00:00",
"till": "2030-01-14T12:00:00.000000+00:00",
"original_charge_length": 1123200,
"charge_length": 1123200,
"original_charge_label": "13 days",
"charge_label": "13 days",
"original_price_each_in_cents": 0,
"price_each_in_cents": 0,
"price_rule_values": null,
"price_structure_id": null,
"price_ruleset_id": null,
"price_tile_id": null
},
"relationships": {
"item": {
"data": {
"type": "products",
"id": "45905bf3-bf37-4803-9506-9cc474f012ef"
}
}
}
},
{
"id": "42e1acf2-3866-49e0-801d-e979238456e2",
"type": "item_prices",
"attributes": {
"item_id": "b309da20-982e-46a5-953a-3fc124ebd36d",
"from": "2030-01-01T12:00:00.000000+00:00",
"till": "2030-01-14T12:00:00.000000+00:00",
"original_charge_length": 1123200,
"charge_length": 1123200,
"original_charge_label": "13 days",
"charge_label": "13 days",
"original_price_each_in_cents": 0,
"price_each_in_cents": 0,
"price_rule_values": null,
"price_structure_id": null,
"price_ruleset_id": null,
"price_tile_id": null
},
"relationships": {
"item": {
"data": {
"type": "products",
"id": "b309da20-982e-46a5-953a-3fc124ebd36d"
}
}
}
}
],
"included": [
{
"id": "45905bf3-bf37-4803-9506-9cc474f012ef",
"type": "products",
"attributes": {
"created_at": "2024-09-30T09:29:23.235457+00:00",
"updated_at": "2024-09-30T09:29:23.235457+00:00",
"archived": false,
"archived_at": null,
"type": "products",
"name": "Product 1000072",
"group_name": "Product 1000072",
"slug": "product-1000072",
"sku": "PRODUCT 1000075",
"lead_time": 0,
"lag_time": 0,
"product_type": "rental",
"tracking_type": "bulk",
"trackable": false,
"has_variations": false,
"variation": false,
"extra_information": null,
"photo_url": null,
"description": null,
"excerpt": null,
"show_in_store": true,
"sorting_weight": 1,
"base_price_in_cents": 0,
"price_type": "simple",
"price_period": "hour",
"deposit_in_cents": 0,
"discountable": true,
"taxable": true,
"seo_title": null,
"seo_description": null,
"tag_list": [],
"properties": {},
"photo_id": null,
"tax_category_id": null,
"price_ruleset_id": null,
"price_structure_id": null,
"variation_values": [],
"allow_shortage": false,
"shortage_limit": 0,
"product_group_id": "35f097e1-d60d-4bae-a0d4-8fbbea550034"
},
"relationships": {}
},
{
"id": "b309da20-982e-46a5-953a-3fc124ebd36d",
"type": "products",
"attributes": {
"created_at": "2024-09-30T09:29:23.561657+00:00",
"updated_at": "2024-09-30T09:29:23.561657+00:00",
"archived": false,
"archived_at": null,
"type": "products",
"name": "Product 1000073",
"group_name": "Product 1000073",
"slug": "product-1000073",
"sku": "PRODUCT 1000076",
"lead_time": 0,
"lag_time": 0,
"product_type": "rental",
"tracking_type": "bulk",
"trackable": false,
"has_variations": false,
"variation": false,
"extra_information": null,
"photo_url": null,
"description": null,
"excerpt": null,
"show_in_store": true,
"sorting_weight": 1,
"base_price_in_cents": 0,
"price_type": "simple",
"price_period": "day",
"deposit_in_cents": 0,
"discountable": true,
"taxable": true,
"seo_title": null,
"seo_description": null,
"tag_list": [],
"properties": {},
"photo_id": null,
"tax_category_id": null,
"price_ruleset_id": null,
"price_structure_id": null,
"variation_values": [],
"allow_shortage": false,
"shortage_limit": 0,
"product_group_id": "61a77056-eea0-4b28-b475-7b08bd2590f8"
},
"relationships": {}
}
],
"meta": {}
}
Calculating price charge length:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/item_prices?filter%5Bcharge_length%5D=36000&filter%5Bitem_id%5D=0c21a80a-672f-48aa-aeeb-0b39fa506c62&include=item' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "ea04156b-d576-49bc-9e13-1129ff49008b",
"type": "item_prices",
"attributes": {
"item_id": "0c21a80a-672f-48aa-aeeb-0b39fa506c62",
"from": null,
"till": null,
"original_charge_length": 36000,
"charge_length": 36000,
"original_charge_label": "10 hours",
"charge_label": "10 hours",
"original_price_each_in_cents": null,
"price_each_in_cents": 0,
"price_rule_values": null,
"price_structure_id": null,
"price_ruleset_id": null,
"price_tile_id": null
},
"relationships": {
"item": {
"data": {
"type": "products",
"id": "0c21a80a-672f-48aa-aeeb-0b39fa506c62"
}
}
}
}
],
"included": [
{
"id": "0c21a80a-672f-48aa-aeeb-0b39fa506c62",
"type": "products",
"attributes": {
"created_at": "2024-09-30T09:29:22.196812+00:00",
"updated_at": "2024-09-30T09:29:22.196812+00:00",
"archived": false,
"archived_at": null,
"type": "products",
"name": "Product 1000070",
"group_name": "Product 1000070",
"slug": "product-1000070",
"sku": "PRODUCT 1000073",
"lead_time": 0,
"lag_time": 0,
"product_type": "rental",
"tracking_type": "bulk",
"trackable": false,
"has_variations": false,
"variation": false,
"extra_information": null,
"photo_url": null,
"description": null,
"excerpt": null,
"show_in_store": true,
"sorting_weight": 1,
"base_price_in_cents": 0,
"price_type": "simple",
"price_period": "hour",
"deposit_in_cents": 0,
"discountable": true,
"taxable": true,
"seo_title": null,
"seo_description": null,
"tag_list": [],
"properties": {},
"photo_id": null,
"tax_category_id": null,
"price_ruleset_id": null,
"price_structure_id": null,
"variation_values": [],
"allow_shortage": false,
"shortage_limit": 0,
"product_group_id": "433e56c1-87c7-4383-9533-f3ac72528023"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/item_prices
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=price_tile,price_structure,item |
fields[] |
Array List of comma seperated fields to include ?fields[item_prices]=item_id,from,till |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
item_id |
Uuid eq |
from |
Datetime eq |
till |
Datetime eq |
original_charge_length |
Integer eq |
charge_length |
Integer eq |
price_structure_id |
Uuid eq |
price_ruleset_id |
Uuid eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request accepts the following includes:
price_tile
price_structure
item
Lines
Lines make up the individual elements of an order, document, or cart. They contain information about pricing, planning, or markup. A key concept about lines is that there are two kinds:
Custom lines Lines created through the resource that don't have a planning associated with it. Can be of one of type
charge
,section
.Planning lines Lines that have a planning associated with it, these lines can not be created through the Line resource but are created by submitting a
book_*
action to OrderFulfilments. Updating or destroying a line linked to a planning will also destroy the planning.
Note that lines can only be created for orders. On invoices, lines are automatically generated based on price changes of the order. For quotes and contracts, lines are generated through the Document resource.
A line can have one of the following types:
section
Behaves as a (visual) section on orders and documents.charge
Regular charge line which contains price information.deposit_charge
A deposit charge line generated by a deposit hold action. This line is always calculated from a price including taxes.proration
Whether this line is a proration, these lines only appear on invoices and can't be updated or destroyed by the resource; they are automatically synced.refund
This line was created due to a refund.legacy_migration
Proration bundled as one line. This lines appear on invoices that were made before Booqable was able to sync invoices automatically.
Nested lines contain information about individual items in a bundle; for these lines, the quantity and price information can not be updated directly but should be updated through the parent line instead.
Endpoints
GET /api/boomerang/lines
GET /api/boomerang/lines/{id}
POST /api/boomerang/lines
PUT /api/boomerang/lines/{id}
DELETE /api/boomerang/lines/{id}
Fields
Every line has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
archived |
Boolean readonly Whether line is archived |
archived_at |
Datetime nullable readonly When the line was archived |
title |
String nullable Title of the line |
extra_information |
String nullable Extra information about the line |
quantity |
Integer The quantity to calculate with. When updating quantity of a line with an associated planning, the planning also gets updated, which may lead to a shortage error |
original_price_each_in_cents |
Integer readonly The original price of the product (without price rule adjustments) |
original_charge_length |
Integer readonly The original charge length of the product (without price rule adjustments) |
original_charge_label |
String nullable The original charge label of the product (without price rule adjustments) |
price_each_in_cents |
Integer Price of each line |
price_in_cents |
Integer readonly Price of each line x quantity |
display_price_in_cents |
Integer readonly Price of this line to display based on the tax setting of the company (inclusive vs. exclusive) |
position |
Integer nullable Which position the line has |
charge_label |
String nullable Charge label |
charge_length |
Integer nullable The charge length in seconds. It can be different than the time planned. Set to null to recalculate pricing based on order period and apply price rules. |
price_rule_values |
Hash nullable readonly Breakdown of applied price rules |
discountable |
Boolean Whether line is discountable |
taxable |
Boolean Whether line is taxable |
line_type |
String One of section , deposit_charge , proration , charge , legacy_migration , delivery_rate |
relevant |
Boolean readonly Whether line is relevant. If not, line has no visible change, it's only used for reporting |
confirm_shortage |
Boolean writeonly Whether to confirm a shortage when updating quantity on a line |
order_id |
Uuid The associated Order |
item_id |
Uuid nullable The associated Item |
tax_category_id |
Uuid nullable The associated Tax category |
price_structure_id |
Uuid The associated Price structure |
price_tile_id |
Uuid The associated Price tile |
planning_id |
Uuid The associated Planning |
parent_line_id |
Uuid The associated Parent line |
owner_id |
Uuid ID of its owner |
owner_type |
String One of orders , documents , carts |
Relationships
Lines have the following relationships:
Name | Description |
---|---|
item |
Items readonly Associated Item |
nested_lines |
Lines readonly Associated Nested lines |
order |
Orders readonly Associated Order |
owner |
Order Associated Owner |
parent_line |
Lines readonly Associated Parent line |
planning |
Plannings readonly Associated Planning |
price_structure |
Price structures readonly Associated Price structure |
price_tile |
Price tiles readonly Associated Price tile |
tax_category |
Tax categories readonly Associated Tax category |
Listing lines
How to fetch a list of lines:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/lines' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "28369102-95fa-440e-81e1-fbc6b909c34a",
"type": "lines",
"attributes": {
"created_at": "2024-09-30T09:25:04.502380+00:00",
"updated_at": "2024-09-30T09:25:04.577708+00:00",
"archived": false,
"archived_at": null,
"title": "Macbook Pro",
"extra_information": "Comes with a mouse",
"quantity": 1,
"original_price_each_in_cents": 72500,
"original_charge_length": null,
"original_charge_label": null,
"price_each_in_cents": 80250,
"price_in_cents": 80250,
"display_price_in_cents": 80250,
"position": 1,
"charge_label": "29 days",
"charge_length": 2505600,
"price_rule_values": {
"charge": {
"from": "1980-04-02T00:00:00.000Z",
"till": "1980-05-01T00:00:00.000Z",
"adjustments": [
{
"name": "Pickup day"
},
{
"name": "Return day"
}
]
},
"price": [
{
"name": "High-Season",
"charge_length": 1339200,
"multiplier": "0.2",
"price_in_cents": 7750,
"adjustments": [
{
"from": "1980-04-15T12:00:00.000Z",
"till": "1980-05-01T00:00:00.000Z",
"charge_length": 1339200,
"charge_label": "372 hours",
"price_in_cents": 7750
}
],
"stacked": false
}
]
},
"discountable": true,
"taxable": true,
"line_type": "charge",
"relevant": true,
"order_id": "621ad458-9c6c-4389-853e-dad8e584c57e",
"item_id": "f6cfdf39-1193-4661-88ed-48470cd0494e",
"tax_category_id": "cc87d760-cdbd-4c78-85e1-619383fee7dc",
"price_structure_id": null,
"price_tile_id": null,
"planning_id": "92ae4c7d-26c4-40f5-992a-b8b554b65766",
"parent_line_id": null,
"owner_id": "621ad458-9c6c-4389-853e-dad8e584c57e",
"owner_type": "orders"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/lines
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=order,owner,tax_category |
fields[] |
Array List of comma seperated fields to include ?fields[lines]=created_at,updated_at,archived |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
archived |
Boolean eq |
archived_at |
Datetime eq , not_eq , gt , gte , lt , lte |
title |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
quantity |
Integer eq , not_eq , gt , gte , lt , lte |
discountable |
Boolean eq |
taxable |
Boolean eq |
line_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
relevant |
Boolean eq |
order_id |
Uuid eq |
item_id |
Uuid eq , not_eq |
tax_category_id |
Uuid eq , not_eq |
price_structure_id |
Uuid eq , not_eq |
price_tile_id |
Uuid eq , not_eq |
planning_id |
Uuid eq , not_eq |
parent_line_id |
Uuid eq , not_eq |
owner_id |
Uuid eq , not_eq |
owner_type |
String eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request accepts the following includes:
order
owner
tax_category
planning
=>
item
=>
photo
Fetching a line
How to fetch a line:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/lines/651ca37e-3cf5-4b2e-8fe0-65c3d5354c72' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "651ca37e-3cf5-4b2e-8fe0-65c3d5354c72",
"type": "lines",
"attributes": {
"created_at": "2024-09-30T09:25:11.163914+00:00",
"updated_at": "2024-09-30T09:25:11.220136+00:00",
"archived": false,
"archived_at": null,
"title": "Macbook Pro",
"extra_information": "Comes with a mouse",
"quantity": 1,
"original_price_each_in_cents": 72500,
"original_charge_length": null,
"original_charge_label": null,
"price_each_in_cents": 80250,
"price_in_cents": 80250,
"display_price_in_cents": 80250,
"position": 1,
"charge_label": "29 days",
"charge_length": 2505600,
"price_rule_values": {
"charge": {
"from": "1980-04-02T00:00:00.000Z",
"till": "1980-05-01T00:00:00.000Z",
"adjustments": [
{
"name": "Pickup day"
},
{
"name": "Return day"
}
]
},
"price": [
{
"name": "High-Season",
"charge_length": 1339200,
"multiplier": "0.2",
"price_in_cents": 7750,
"adjustments": [
{
"from": "1980-04-15T12:00:00.000Z",
"till": "1980-05-01T00:00:00.000Z",
"charge_length": 1339200,
"charge_label": "372 hours",
"price_in_cents": 7750
}
],
"stacked": false
}
]
},
"discountable": true,
"taxable": true,
"line_type": "charge",
"relevant": true,
"order_id": "9a399886-257e-45f0-a4e3-ebcadb22f548",
"item_id": "ea9ae945-e25b-40de-85cd-30d3ea190c79",
"tax_category_id": "40c5083d-c1ac-4b81-853f-e817079d3dc5",
"price_structure_id": null,
"price_tile_id": null,
"planning_id": "d624b4f2-c9b6-42c5-acb8-d5583811f842",
"parent_line_id": null,
"owner_id": "9a399886-257e-45f0-a4e3-ebcadb22f548",
"owner_type": "orders"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/lines/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=order,owner,tax_category |
fields[] |
Array List of comma seperated fields to include ?fields[lines]=created_at,updated_at,archived |
Includes
This request accepts the following includes:
order
=>
tax_values
owner
=>
tax_values
tax_category
parent_line
nested_lines
=>
planning
planning
=>
item
=>
photo
Creating a line
Lines created through this endpoint, so-called custom lines, can only have the type charge
or section
.
Custom charge
lines enable you to add charges not (directly) connected to a product to an order.
Sections allow to add some organization to orders.
Order totals are automatically re-calculated after the creation of a new line and an invoice sync will be triggered if changes are relevant.
How to create a line:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/lines' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "lines",
"attributes": {
"owner_id": "1d1bd313-c1ff-42d3-b04b-002a6351ce20",
"owner_type": "orders",
"price_each_in_cents": 1000
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "63c9c13a-19cb-41f8-829d-ef72f3a542c2",
"type": "lines",
"attributes": {
"created_at": "2024-09-30T09:24:59.381875+00:00",
"updated_at": "2024-09-30T09:24:59.393583+00:00",
"archived": false,
"archived_at": null,
"title": null,
"extra_information": null,
"quantity": 1,
"original_price_each_in_cents": null,
"original_charge_length": null,
"original_charge_label": null,
"price_each_in_cents": 1000,
"price_in_cents": 1000,
"display_price_in_cents": 1000,
"position": 1,
"charge_label": null,
"charge_length": null,
"price_rule_values": null,
"discountable": true,
"taxable": true,
"line_type": "charge",
"relevant": true,
"order_id": "1d1bd313-c1ff-42d3-b04b-002a6351ce20",
"item_id": null,
"tax_category_id": null,
"price_structure_id": null,
"price_tile_id": null,
"planning_id": null,
"parent_line_id": null,
"owner_id": "1d1bd313-c1ff-42d3-b04b-002a6351ce20",
"owner_type": "orders"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/lines
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=order,owner,tax_category |
fields[] |
Array List of comma seperated fields to include ?fields[lines]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][title] |
String Title of the line |
data[attributes][extra_information] |
String Extra information about the line |
data[attributes][quantity] |
Integer The quantity to calculate with. When updating quantity of a line with an associated planning, the planning also gets updated, which may lead to a shortage error |
data[attributes][original_charge_label] |
String The original charge label of the product (without price rule adjustments) |
data[attributes][price_each_in_cents] |
Integer Price of each line |
data[attributes][position] |
Integer Which position the line has |
data[attributes][charge_label] |
String Charge label |
data[attributes][charge_length] |
Integer The charge length in seconds. It can be different than the time planned. Set to null to recalculate pricing based on order period and apply price rules. |
data[attributes][discountable] |
Boolean Whether line is discountable |
data[attributes][taxable] |
Boolean Whether line is taxable |
data[attributes][line_type] |
String One of section , deposit_charge , proration , charge , legacy_migration , delivery_rate |
data[attributes][confirm_shortage] |
Boolean Whether to confirm a shortage when updating quantity on a line |
data[attributes][order_id] |
Uuid The associated Order |
data[attributes][item_id] |
Uuid The associated Item |
data[attributes][tax_category_id] |
Uuid The associated Tax category |
data[attributes][price_structure_id] |
Uuid The associated Price structure |
data[attributes][price_tile_id] |
Uuid The associated Price tile |
data[attributes][planning_id] |
Uuid The associated Planning |
data[attributes][parent_line_id] |
Uuid The associated Parent line |
data[attributes][owner_id] |
Uuid ID of its owner |
data[attributes][owner_type] |
String One of orders , documents , carts |
Includes
This request accepts the following includes:
order
=>
tax_values
owner
=>
tax_values
tax_category
parent_line
nested_lines
=>
planning
planning
=>
item
=>
photo
Updating a line
Change information, pricing, or increase the quantity of a line. Note that when updating the quantity of a line associated with a planning, the quantity of the planninig will also be updated, which may result in a shortage error.
Order totals are automatically re-calculated after updating a line and an invoice sync will be triggered if changes are relevant.
How to update a line:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/lines/626734d5-2830-4452-8751-ce96f27eece8' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "626734d5-2830-4452-8751-ce96f27eece8",
"type": "lines",
"attributes": {
"price_each_in_cents": 1000
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "626734d5-2830-4452-8751-ce96f27eece8",
"type": "lines",
"attributes": {
"created_at": "2024-09-30T09:25:01.145738+00:00",
"updated_at": "2024-09-30T09:25:02.256500+00:00",
"archived": false,
"archived_at": null,
"title": "Macbook Pro",
"extra_information": "Comes with a mouse",
"quantity": 1,
"original_price_each_in_cents": 72500,
"original_charge_length": null,
"original_charge_label": null,
"price_each_in_cents": 1000,
"price_in_cents": 1000,
"display_price_in_cents": 1000,
"position": 1,
"charge_label": "29 days",
"charge_length": 2505600,
"price_rule_values": null,
"discountable": true,
"taxable": true,
"line_type": "charge",
"relevant": true,
"order_id": "6524f601-d60b-4074-8ab8-6c1a48278b0e",
"item_id": "ba0a418b-d48a-4388-8a46-1e13cc83dae8",
"tax_category_id": "f3c3e690-7b9d-4c3d-bbe9-864c53a4c76d",
"price_structure_id": null,
"price_tile_id": null,
"planning_id": "4b014fc8-6df3-44c0-88f4-d4b5f84e45bc",
"parent_line_id": null,
"owner_id": "6524f601-d60b-4074-8ab8-6c1a48278b0e",
"owner_type": "orders"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/lines/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=order,owner,tax_category |
fields[] |
Array List of comma seperated fields to include ?fields[lines]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][title] |
String Title of the line |
data[attributes][extra_information] |
String Extra information about the line |
data[attributes][quantity] |
Integer The quantity to calculate with. When updating quantity of a line with an associated planning, the planning also gets updated, which may lead to a shortage error |
data[attributes][original_charge_label] |
String The original charge label of the product (without price rule adjustments) |
data[attributes][price_each_in_cents] |
Integer Price of each line |
data[attributes][position] |
Integer Which position the line has |
data[attributes][charge_label] |
String Charge label |
data[attributes][charge_length] |
Integer The charge length in seconds. It can be different than the time planned. Set to null to recalculate pricing based on order period and apply price rules. |
data[attributes][discountable] |
Boolean Whether line is discountable |
data[attributes][taxable] |
Boolean Whether line is taxable |
data[attributes][line_type] |
String One of section , deposit_charge , proration , charge , legacy_migration , delivery_rate |
data[attributes][confirm_shortage] |
Boolean Whether to confirm a shortage when updating quantity on a line |
data[attributes][order_id] |
Uuid The associated Order |
data[attributes][item_id] |
Uuid The associated Item |
data[attributes][tax_category_id] |
Uuid The associated Tax category |
data[attributes][price_structure_id] |
Uuid The associated Price structure |
data[attributes][price_tile_id] |
Uuid The associated Price tile |
data[attributes][planning_id] |
Uuid The associated Planning |
data[attributes][parent_line_id] |
Uuid The associated Parent line |
data[attributes][owner_id] |
Uuid ID of its owner |
data[attributes][owner_type] |
String One of orders , documents , carts |
Includes
This request accepts the following includes:
order
=>
tax_values
owner
=>
tax_values
tax_category
parent_line
nested_lines
=>
planning
planning
=>
item
=>
photo
Archiving a line
How to delete a line:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/lines/d6bbbb7e-64e5-4dec-a0f2-b8b8a595de8c' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "d6bbbb7e-64e5-4dec-a0f2-b8b8a595de8c",
"type": "lines",
"attributes": {
"created_at": "2024-09-30T09:25:07.231321+00:00",
"updated_at": "2024-09-30T09:25:08.326344+00:00",
"archived": true,
"archived_at": "2024-09-30T09:25:08.326344+00:00",
"title": "Macbook Pro",
"extra_information": "Comes with a mouse",
"quantity": 1,
"original_price_each_in_cents": 72500,
"original_charge_length": null,
"original_charge_label": null,
"price_each_in_cents": 80250,
"price_in_cents": 80250,
"display_price_in_cents": 80250,
"position": 1,
"charge_label": "29 days",
"charge_length": 2505600,
"price_rule_values": {
"charge": {
"from": "1980-04-02T00:00:00.000Z",
"till": "1980-05-01T00:00:00.000Z",
"adjustments": [
{
"name": "Pickup day"
},
{
"name": "Return day"
}
]
},
"price": [
{
"name": "High-Season",
"charge_length": 1339200,
"multiplier": "0.2",
"price_in_cents": 7750,
"adjustments": [
{
"from": "1980-04-15T12:00:00.000Z",
"till": "1980-05-01T00:00:00.000Z",
"charge_length": 1339200,
"charge_label": "372 hours",
"price_in_cents": 7750
}
],
"stacked": false
}
]
},
"discountable": true,
"taxable": true,
"line_type": "charge",
"relevant": true,
"order_id": "c55c8d3f-fc57-4323-807e-5bdeacae3cda",
"item_id": "4a85d4f4-8cff-4d49-8a6e-cd1e0dd547bc",
"tax_category_id": "d2e78742-6181-4de9-911c-e84fb4c4c22a",
"price_structure_id": null,
"price_tile_id": null,
"planning_id": "13d9ba76-c728-4cd9-8cdd-f3ccc821168c",
"parent_line_id": null,
"owner_id": "c55c8d3f-fc57-4323-807e-5bdeacae3cda",
"owner_type": "orders"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/lines/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=order,owner,tax_category |
fields[] |
Array List of comma seperated fields to include ?fields[lines]=created_at,updated_at,archived |
Includes
This request accepts the following includes:
order
=>
tax_values
owner
=>
tax_values
tax_category
Locations
A location is a place (like a store) where customers pick up and return orders or a warehouse that only stocks inventory.
Endpoints
GET /api/boomerang/locations
GET /api/boomerang/locations/{id}
POST /api/boomerang/locations
PUT /api/boomerang/locations/{id}
DELETE /api/boomerang/locations/{id}
Fields
Every location has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
archived |
Boolean readonly Whether location is archived |
archived_at |
Datetime nullable readonly When the location was archived |
name |
String Name of the location |
code |
String Code used to identify the location |
location_type |
String Determines if the location can be seen in the online webshop. One of rental , internal |
address_line_1 |
String First address line |
address_line_2 |
String Second address line |
zipcode |
String Address zipcode |
city |
String Address city |
region |
String Address region |
country |
String Address country |
cluster_ids |
Array Clusters this location belongs to |
main_address_attributes |
Hash writeonly A hash with the address fields. Use it when creating or updating a location. See address property type for more information |
pickup_enabled |
Boolean Whether the location supports pickup |
confirm_has_orders |
Boolean writeonly A flag to confirm an address update when the location has orders |
main_address |
Hash A hash with the address fields. Use it when fetching a location. See address property type for more information |
Relationships
Locations have the following relationships:
Name | Description |
---|---|
carriers |
Carriers readonly Associated Carriers |
clusters |
Clusters readonly Associated Clusters |
Listing locations
How to fetch locations:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/locations' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "3d50c150-92da-453d-af2d-835870a0269f",
"type": "locations",
"attributes": {
"created_at": "2024-09-30T09:26:28.228184+00:00",
"updated_at": "2024-09-30T09:26:28.231856+00:00",
"archived": false,
"archived_at": null,
"name": "Warehouse",
"code": "LOC1000032",
"location_type": "rental",
"address_line_1": "Blokhuisplein 40",
"address_line_2": "Department II",
"zipcode": "8911LJ",
"city": "Leeuwarden",
"region": "Friesland",
"country": "Netherlands",
"cluster_ids": [],
"pickup_enabled": true,
"main_address": {
"meets_validation_requirements": false,
"first_name": null,
"last_name": null,
"address1": "Blokhuisplein 40",
"address2": "Department II",
"city": "Leeuwarden",
"region": "Friesland",
"zipcode": "8911LJ",
"country": "Netherlands",
"country_id": null,
"province_id": null,
"latitude": null,
"longitude": null,
"value": "Blokhuisplein 40\nDepartment II\n8911LJ Leeuwarden Friesland\nNetherlands"
}
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/locations
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=main_address,clusters,carriers |
fields[] |
Array List of comma seperated fields to include ?fields[locations]=created_at,updated_at,archived |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
archived |
Boolean eq |
archived_at |
Datetime eq , not_eq , gt , gte , lt , lte |
name |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
code |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
location_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
main_address |
Hash eq |
cluster_id |
Uuid eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request accepts the following includes:
main_address
clusters
carriers
Fetching a location
How to fetch a single location:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/locations/ab89a996-9931-4a22-bcd8-2949796da6a6' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "ab89a996-9931-4a22-bcd8-2949796da6a6",
"type": "locations",
"attributes": {
"created_at": "2024-09-30T09:26:28.771837+00:00",
"updated_at": "2024-09-30T09:26:28.775847+00:00",
"archived": false,
"archived_at": null,
"name": "Warehouse",
"code": "LOC1000033",
"location_type": "rental",
"address_line_1": "Blokhuisplein 40",
"address_line_2": "Department II",
"zipcode": "8911LJ",
"city": "Leeuwarden",
"region": "Friesland",
"country": "Netherlands",
"cluster_ids": [],
"pickup_enabled": true,
"main_address": {
"meets_validation_requirements": false,
"first_name": null,
"last_name": null,
"address1": "Blokhuisplein 40",
"address2": "Department II",
"city": "Leeuwarden",
"region": "Friesland",
"zipcode": "8911LJ",
"country": "Netherlands",
"country_id": null,
"province_id": null,
"latitude": null,
"longitude": null,
"value": "Blokhuisplein 40\nDepartment II\n8911LJ Leeuwarden Friesland\nNetherlands"
}
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/locations/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=main_address,clusters,carriers |
fields[] |
Array List of comma seperated fields to include ?fields[locations]=created_at,updated_at,archived |
Includes
This request accepts the following includes:
main_address
clusters
carriers
Creating a location
How to create a location and assign it to a cluster:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/locations' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "locations",
"attributes": {
"name": "Store",
"code": "STR",
"location_type": "rental",
"address_line_1": "Blokhuisplein 40",
"address_line_2": "Department II",
"zipcode": "8911LJ",
"city": "Leeuwarden",
"region": "Friesland",
"country": "Netherlands",
"cluster_ids": [
"561ff91e-929b-43ff-8eac-c80f8b8eb802"
]
}
},
"include": "clusters"
}'
A 201 status response looks like this:
{
"data": {
"id": "cd61a6d2-9a4a-4a89-a4fd-0a009ec7bf70",
"type": "locations",
"attributes": {
"created_at": "2024-09-30T09:26:32.809006+00:00",
"updated_at": "2024-09-30T09:26:32.817796+00:00",
"archived": false,
"archived_at": null,
"name": "Store",
"code": "STR",
"location_type": "rental",
"address_line_1": "Blokhuisplein 40",
"address_line_2": "Department II",
"zipcode": "8911LJ",
"city": "Leeuwarden",
"region": "Friesland",
"country": "Netherlands",
"cluster_ids": [
"561ff91e-929b-43ff-8eac-c80f8b8eb802"
],
"pickup_enabled": true,
"main_address": {
"meets_validation_requirements": false,
"first_name": null,
"last_name": null,
"address1": "Blokhuisplein 40",
"address2": "Department II",
"city": "Leeuwarden",
"region": "Friesland",
"zipcode": "8911LJ",
"country": "Netherlands",
"country_id": null,
"province_id": null,
"latitude": null,
"longitude": null,
"value": "Blokhuisplein 40\nDepartment II\n8911LJ Leeuwarden Friesland\nNetherlands"
}
},
"relationships": {
"clusters": {
"data": [
{
"type": "clusters",
"id": "561ff91e-929b-43ff-8eac-c80f8b8eb802"
}
]
}
}
},
"included": [
{
"id": "561ff91e-929b-43ff-8eac-c80f8b8eb802",
"type": "clusters",
"attributes": {
"created_at": "2024-09-30T09:26:32.762955+00:00",
"updated_at": "2024-09-30T09:26:32.762955+00:00",
"name": "North",
"location_ids": [
"cd61a6d2-9a4a-4a89-a4fd-0a009ec7bf70"
]
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
POST /api/boomerang/locations
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=main_address,clusters,carriers |
fields[] |
Array List of comma seperated fields to include ?fields[locations]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the location |
data[attributes][code] |
String Code used to identify the location |
data[attributes][location_type] |
String Determines if the location can be seen in the online webshop. One of rental , internal |
data[attributes][address_line_1] |
String First address line |
data[attributes][address_line_2] |
String Second address line |
data[attributes][zipcode] |
String Address zipcode |
data[attributes][city] |
String Address city |
data[attributes][region] |
String Address region |
data[attributes][country] |
String Address country |
data[attributes][cluster_ids][] |
Array Clusters this location belongs to |
data[attributes][main_address_attributes] |
Hash A hash with the address fields. Use it when creating or updating a location. See address property type for more information |
data[attributes][pickup_enabled] |
Boolean Whether the location supports pickup |
data[attributes][confirm_has_orders] |
Boolean A flag to confirm an address update when the location has orders |
data[attributes][main_address] |
Hash A hash with the address fields. Use it when fetching a location. See address property type for more information |
Includes
This request accepts the following includes:
main_address
clusters
carriers
Updating a location
Note that disassociating clusters may result in a shortage error.
How to update a location and assign it to multiple clusters:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/locations/1bba20de-c8f8-4d31-a883-7bbffadb0cab' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "1bba20de-c8f8-4d31-a883-7bbffadb0cab",
"type": "locations",
"attributes": {
"name": "Old warehouse",
"cluster_ids": [
"940bd184-4ad5-43a3-ae70-b60c59c9dbb0",
"b770345c-a4cf-4f20-a518-53bfc54d8cdd"
]
}
},
"include": "clusters"
}'
A 200 status response looks like this:
{
"data": {
"id": "1bba20de-c8f8-4d31-a883-7bbffadb0cab",
"type": "locations",
"attributes": {
"created_at": "2024-09-30T09:26:29.325957+00:00",
"updated_at": "2024-09-30T09:26:29.394129+00:00",
"archived": false,
"archived_at": null,
"name": "Old warehouse",
"code": "LOC1000034",
"location_type": "rental",
"address_line_1": "Blokhuisplein 40",
"address_line_2": "Department II",
"zipcode": "8911LJ",
"city": "Leeuwarden",
"region": "Friesland",
"country": "Netherlands",
"cluster_ids": [
"940bd184-4ad5-43a3-ae70-b60c59c9dbb0",
"b770345c-a4cf-4f20-a518-53bfc54d8cdd"
],
"pickup_enabled": true,
"main_address": {
"meets_validation_requirements": false,
"first_name": null,
"last_name": null,
"address1": "Blokhuisplein 40",
"address2": "Department II",
"city": "Leeuwarden",
"region": "Friesland",
"zipcode": "8911LJ",
"country": "Netherlands",
"country_id": null,
"province_id": null,
"latitude": null,
"longitude": null,
"value": "Blokhuisplein 40\nDepartment II\n8911LJ Leeuwarden Friesland\nNetherlands"
}
},
"relationships": {
"clusters": {
"data": [
{
"type": "clusters",
"id": "940bd184-4ad5-43a3-ae70-b60c59c9dbb0"
},
{
"type": "clusters",
"id": "b770345c-a4cf-4f20-a518-53bfc54d8cdd"
}
]
}
}
},
"included": [
{
"id": "940bd184-4ad5-43a3-ae70-b60c59c9dbb0",
"type": "clusters",
"attributes": {
"created_at": "2024-09-30T09:26:29.337378+00:00",
"updated_at": "2024-09-30T09:26:29.337378+00:00",
"name": "North",
"location_ids": [
"1bba20de-c8f8-4d31-a883-7bbffadb0cab"
]
},
"relationships": {}
},
{
"id": "b770345c-a4cf-4f20-a518-53bfc54d8cdd",
"type": "clusters",
"attributes": {
"created_at": "2024-09-30T09:26:29.343821+00:00",
"updated_at": "2024-09-30T09:26:29.343821+00:00",
"name": "Central",
"location_ids": [
"1bba20de-c8f8-4d31-a883-7bbffadb0cab"
]
},
"relationships": {}
}
],
"meta": {}
}
Disassociating cluster resulting in shortage error:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/locations/3114bfef-a463-40b8-96a6-89c68752ef0d' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "3114bfef-a463-40b8-96a6-89c68752ef0d",
"type": "locations",
"attributes": {
"name": "Old warehouse",
"cluster_ids": []
}
},
"include": "clusters"
}'
A 422 status response looks like this:
{
"errors": [
{
"code": "shortage",
"status": "422",
"title": "Shortage",
"detail": "This will create shortage for running or future orders",
"meta": {
"warning": [],
"blocking": [
{
"reason": "shortage",
"shortage": 2,
"item_id": "6211231a-ba54-476a-b52d-655ae1f11596",
"mutation": 0,
"order_ids": [
"231964a8-3e07-4cd1-bbdc-02e239764ffe"
],
"location_id": "3114bfef-a463-40b8-96a6-89c68752ef0d",
"available": -2,
"plannable": -2,
"stock_count": 0,
"planned": 2,
"needed": 2,
"cluster_available": -2,
"cluster_plannable": -2,
"cluster_stock_count": 0,
"cluster_planned": 2,
"cluster_needed": 2
}
]
}
}
]
}
HTTP Request
PUT /api/boomerang/locations/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=main_address,clusters,carriers |
fields[] |
Array List of comma seperated fields to include ?fields[locations]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the location |
data[attributes][code] |
String Code used to identify the location |
data[attributes][location_type] |
String Determines if the location can be seen in the online webshop. One of rental , internal |
data[attributes][address_line_1] |
String First address line |
data[attributes][address_line_2] |
String Second address line |
data[attributes][zipcode] |
String Address zipcode |
data[attributes][city] |
String Address city |
data[attributes][region] |
String Address region |
data[attributes][country] |
String Address country |
data[attributes][cluster_ids][] |
Array Clusters this location belongs to |
data[attributes][main_address_attributes] |
Hash A hash with the address fields. Use it when creating or updating a location. See address property type for more information |
data[attributes][pickup_enabled] |
Boolean Whether the location supports pickup |
data[attributes][confirm_has_orders] |
Boolean A flag to confirm an address update when the location has orders |
data[attributes][main_address] |
Hash A hash with the address fields. Use it when fetching a location. See address property type for more information |
Includes
This request accepts the following includes:
main_address
clusters
carriers
Archiving a location
To archive a location make sure that:
- There is no active stock at the location
- There are no running or future orders for this location
- This is not the last active location
How to archive a location:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/locations/bc407573-0825-4ce4-a984-6b0973351c0c' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "bc407573-0825-4ce4-a984-6b0973351c0c",
"type": "locations",
"attributes": {
"created_at": "2024-09-30T09:26:26.999153+00:00",
"updated_at": "2024-09-30T09:26:27.051040+00:00",
"archived": true,
"archived_at": "2024-09-30T09:26:27.051040+00:00",
"name": "Warehouse",
"code": "LOC1000029",
"location_type": "rental",
"address_line_1": "Blokhuisplein 40",
"address_line_2": "Department II",
"zipcode": "8911LJ",
"city": "Leeuwarden",
"region": "Friesland",
"country": "Netherlands",
"cluster_ids": [],
"pickup_enabled": true,
"main_address": {
"meets_validation_requirements": false,
"first_name": null,
"last_name": null,
"address1": "Blokhuisplein 40",
"address2": "Department II",
"city": "Leeuwarden",
"region": "Friesland",
"zipcode": "8911LJ",
"country": "Netherlands",
"country_id": null,
"province_id": null,
"latitude": null,
"longitude": null,
"value": "Blokhuisplein 40\nDepartment II\n8911LJ Leeuwarden Friesland\nNetherlands"
}
},
"relationships": {}
},
"meta": {}
}
Failure due to a future order:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/locations/c38bc602-6e45-4e89-b745-c86975a3e031' \
--header 'content-type: application/json' \
--data '{}'
A 422 status response looks like this:
{
"errors": [
{
"code": "location_has_orders",
"status": "422",
"title": "Location has orders",
"detail": "This location has running or future orders",
"meta": {
"order_ids": [
"7ff73b91-1d02-44e0-92b3-3ec84bd2b06e"
]
}
}
]
}
Failure due to active stock at location:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/locations/ef09c035-ad82-4cfd-a7df-1e45fd4c3934' \
--header 'content-type: application/json' \
A 422 status response looks like this:
{
"errors": [
{
"code": "location_has_stock",
"status": "422",
"title": "Location has stock",
"detail": "This location has active stock",
"meta": {
"item_ids": [
"70a02602-42f6-409f-b84c-50f4df8f1d79"
]
}
}
]
}
HTTP Request
DELETE /api/boomerang/locations/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[locations]=created_at,updated_at,archived |
Includes
This request does not accept any includes
Notes
Allows you to leave notes attached to other resources.
Endpoints
GET /api/boomerang/notes
GET /api/boomerang/notes/{id}
POST /api/boomerang/notes
DELETE /api/boomerang/notes/{id}
Fields
Every note has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
body |
String The content of the note |
owner_id |
Uuid ID of the resource the note is attached to |
owner_type |
String The resource type of the owner. One of orders , documents , product_groups , bundles , products , customers , stock_items , users |
employee_id |
Uuid readonly The associated Employee |
Relationships
Notes have the following relationships:
Name | Description |
---|---|
employee |
Employees readonly Associated Employee |
owner |
Customer, Product, Product group, Stock item, Bundle, Order, Document Associated Owner |
Listing notes
How to fetch a list of notes:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/notes' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "f7d10821-d66a-4ae5-9da0-0ab59921e21e",
"type": "notes",
"attributes": {
"created_at": "2024-09-30T09:24:50.879276+00:00",
"updated_at": "2024-09-30T09:24:50.879276+00:00",
"body": "Agreed to give this customer a 20% discount on the next order",
"owner_id": "bf5d1e49-8731-416c-b3a1-aec60b42b640",
"owner_type": "customers",
"employee_id": "f7b96ae2-9794-4c69-bbd9-b4beb05c4de6"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/notes
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=employee,owner |
fields[] |
Array List of comma seperated fields to include ?fields[notes]=created_at,updated_at,body |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
owner_id |
Uuid eq , not_eq |
owner_type |
String eq , not_eq |
employee_id |
Uuid eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request accepts the following includes:
employee
owner
Fetching a note
How to fetch a note:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/notes/072f3aae-526c-4bcf-a3ac-7ebb707ab0c7' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "072f3aae-526c-4bcf-a3ac-7ebb707ab0c7",
"type": "notes",
"attributes": {
"created_at": "2024-09-30T09:24:49.628276+00:00",
"updated_at": "2024-09-30T09:24:49.628276+00:00",
"body": "Agreed to give this customer a 20% discount on the next order",
"owner_id": "27227af7-73cf-4520-828c-63df70ccf0f5",
"owner_type": "customers",
"employee_id": "56fe6529-b13e-43bc-bb6c-776dcfb93700"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/notes/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=employee,owner |
fields[] |
Array List of comma seperated fields to include ?fields[notes]=created_at,updated_at,body |
Includes
This request accepts the following includes:
employee
owner
Creating a note
How to create a note:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/notes' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "notes",
"attributes": {
"body": "Agreed to give this customer a 20% discount on the next order",
"owner_id": "3d5d874d-cf05-4750-a505-5006f8a35645",
"owner_type": "customers"
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "516bc9e7-057d-4a9f-8eb9-08a376f22783",
"type": "notes",
"attributes": {
"created_at": "2024-09-30T09:24:48.916746+00:00",
"updated_at": "2024-09-30T09:24:48.916746+00:00",
"body": "Agreed to give this customer a 20% discount on the next order",
"owner_id": "3d5d874d-cf05-4750-a505-5006f8a35645",
"owner_type": "customers",
"employee_id": "9acd5866-aed5-4da8-8c77-6b09183371ea"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/notes
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=employee,owner |
fields[] |
Array List of comma seperated fields to include ?fields[notes]=created_at,updated_at,body |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][body] |
String The content of the note |
data[attributes][owner_id] |
Uuid ID of the resource the note is attached to |
data[attributes][owner_type] |
String The resource type of the owner. One of orders , documents , product_groups , bundles , products , customers , stock_items , users |
Includes
This request accepts the following includes:
employee
owner
Deleting a note
How to delete a note:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/notes/6d7646bf-3921-4f31-a14c-04ec0eae1d93' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "6d7646bf-3921-4f31-a14c-04ec0eae1d93",
"type": "notes",
"attributes": {
"created_at": "2024-09-30T09:24:50.254702+00:00",
"updated_at": "2024-09-30T09:24:50.254702+00:00",
"body": "Agreed to give this customer a 20% discount on the next order",
"owner_id": "321faef0-726f-4aac-b2ba-d5783873e07f",
"owner_type": "customers",
"employee_id": "6346995f-3958-4f66-b021-cba92bdd97a4"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/notes/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=employee,owner |
fields[] |
Array List of comma seperated fields to include ?fields[notes]=created_at,updated_at,body |
Includes
This request accepts the following includes:
employee
owner
Operations
Operations are long running tasks that are used to mutate data in bulk or to generate artifacts like exports or documents. Once an operation has been started it cannot be paused or cancelled. However, the status of an operation status can be requested.
An operation requires the operation_data
object to be set during creation.
It contains the parameters required for initiating the operation and is validated
strictly. The structure of the object is as follows:
"operation_data": {
"type": "<operation_type>",
"data": { ... }
}
The operation type determines what kind of operation is started. The nested data object has required keys, depending on the type of the operation.
The following operation types are supported:
archive
generate_barcode
generate_document
update_category
update_tag
export
update
Archive
Only orders that have the status stopped
can be archived.
Orders with any other status will be ignored.
Params
"operation_data": {
"type": "archive",
"data": {
"target_type": "customers",
"target_ids": [
"123",
"456"
]
}
}
Key | Type | Possible values | Description |
---|---|---|---|
type |
String | archive |
Required to start this specific operation. |
data.target_type |
String | customers , orders |
The type of resource that should be archived. Only one resource per operation is supported. |
data.target_ids |
Array<Uuid> | [{id}, {id}] |
An array of primary keys for the entities that should be archived. |
Artifact
No artifacts are generated when archiving.
Generate Barcode
Generates a barcode for all entities that do not have a barcode. Entities that already have a barcode are skipped.
Params
"operation_data": {
"type": "generate_barcode",
"data": {
"target_type": "customers",
"target_ids": [
"123",
"456"
],
"barcode_type": "code128"
}
}
Key | Type | Possible values | Description |
---|---|---|---|
type |
String | generate_barcode |
Required to start this specific operation. |
data.target_type |
String | customers , product_groups |
The type of resource that barcodes should be generated for. |
data.for |
String | stock_items , products |
For product_groups only, this indicates whether to add barcodes to either products or stock_items . |
data.target_ids |
Array<Uuid> | [{id}, {id}] |
An array of primary keys for the entities that should have its barcodes generated. |
data.barcode_type |
String | code39 , code93 , code128 , ean8 , ean13 , qr_code |
The barcode type that should be generated for all entities. |
Artifact
No artifacts are generated when generating barcodes.
Generate Document
Generates documents in bulk, either by a list of documents or all documents for specific orders.
Params
"operation_data":{
"type": "generate_document",
"data": {
"target_type": "documents",
"target_ids": [
"123",
"456"
],
"document_type": "invoice",
"document_extension": "pdf"
}
}
Key | Type | Possible values | Description |
---|---|---|---|
type |
String | generate_document |
Required to start this specific operation. |
data.target_type |
String | orders , documents |
The type of resource that should have its documents generated. Only one resource per operation is supported. |
data.target_ids |
Array<Uuid> | [{id}, {id}] |
An array of primary keys for the entities that should have its documents generated. |
data.document_type |
String | packing_slip , invoice , quote , contract |
The document type that should be generated for all entities. Only one document type per operation is supported. |
data.document_extension |
String | "pdf" |
The filetype for the generated document. |
Artifact
A zip file with the generated documents of type
Update Category
Updates the categories associated to the entities by mutating them with the action. Other categories already associated to the entity are not modified.
Params
"operation_data": {
"type": "update_category",
"data": {
"target_type": "product_groups",
"target_ids": [
"123",
"456"
],
"action": "add_entities",
"category_ids": [
"789",
"101"
]
}
}
Key | Type | Possible values | Description |
---|---|---|---|
type |
String | update_category |
Required to start this specific operation. |
data.target_type |
String | product_groups |
The type of resource that should have the associated categories updated. Only one resource per operation is supported. |
data.target_ids |
Array<Uuid> | [{id}, {id}] |
An array of primary keys for the entities that should have the associated categories updated. |
data.action |
String | add_entities , remove_entities |
The action that should be executed on the categories of the entities. |
data.category_ids |
Array<Uuid> | [{id}, {id}] |
The primary keys of the categories that should be used with the action. |
Artifact
No artifacts are generated when updating categories.
Update Tag
Updates the tags associated to the entities by mutating them with the action.
Params
"operation_data": {
"type": "update_tag",
"data": {
"target_type": "customers",
"target_ids": [
"123",
"456"
],
"action": "replace",
"tags": [
"Tag A",
"Tag B"
]
}
}
Key | Type | Possible values | Description |
---|---|---|---|
type |
String | update_tag |
Required to start this specific operation. |
data.target_type |
String | product_groups , customers , orders |
The type of resource that should have the associated tags updated. Only one resource per operation is supported. |
data.target_ids |
Array<Uuid> | [{id}, {id}] |
An array of primary keys for the entities that should have the associated tags updated. |
data.action |
String | add , replace , remove , remove_all |
The action that should be executed on the tags of the entities. |
data.tags |
Array |
[{tag}, {tag}] |
The tags that should be used with the action. |
Artifact
No artifacts are generated when updating tags.
Export
Exports data as CSV.
Params
"operation_data": {
"type": "export",
"data": {
"target_type": "customers",
"target_ids": [
"123",
"456"
]
}
}
Key | Type | Possible values | Description |
---|---|---|---|
type |
String | export |
Required to start this specific operation. |
data.target_type |
String | product_groups , bundles , customers , orders , documents , report_rentals , report_consumables , 'report_stock_items' |
The type of resource that should have the associated tags updated. Only one resource per operation is supported. |
data.target_ids |
Array<Uuid> | [{id}, {id}] |
An array of primary keys for the entities that should have the associated tags updated. |
Artifact
A CSV file containing the exported data.
Update
Updates the attribute of all the entities with the new value(s).
Params
"operation_data": {
"type": "update",
"data": {
"target_type": "customers",
"target_ids": [
"123",
"456"
],
"attributes": {
"discount_percentage": 50,
"tax_region_id": "789"
}
}
}
Key | Type | Possible values | Description |
---|---|---|---|
type |
String | update |
Required to start this specific operation. |
data.target_type |
String | product_groups , customers |
The type of resource that should be updated. Only one resource per operation is supported. |
data.target_ids |
Array<Uuid> | [{id}, {id}] |
An array of primary keys for the entities that should be updated. |
data.attributes |
Object | {} |
The allowed keys for the attributes are listed below. |
Allowed attribute keys:
Product group
taxable
tax_category_id
lag_time
lead_time
price_type
price_period
flat_fee_price_in_cents
structure_price_in_cents
base_price_in_cents
price_structure_id
show_in_store
discountable
price_ruleset_id
Customer
deposit_type
deposit_value
tax_region_id
discount_percentage
Artifacts
No artifacts are generated when bullk updating resources.
Endpoints
GET /api/boomerang/operations
GET /api/boomerang/operations/{id}
POST /api/boomerang/operations
Fields
Every operation has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
status |
String readonly One of scheduled , in_progress , finished , failed |
status_message |
String readonly A UI-friendly string explaining the status & progress of the operation for the user. |
finished_at |
Datetime readonly The moment when the operation is finished executing. |
description |
String readonly Explains what the operation is doing in a short sentence. |
artifact |
Hash readonly An object that returns an optional artifact of the operation. E.g. a file if the operation generates a report. |
error_data |
Array readonly An array of strings with errors that happened during execution of the operation. |
error_count |
Integer readonly The number of errors that happened during the execution. See error_data . |
employee_id |
Uuid readonly The associated Employee |
operation_data |
Hash An object with the params used to initiate the operation. See the description of the operation. |
Relationships
Operations have the following relationships:
Name | Description |
---|---|
employee |
Employees readonly Associated Employee |
Listing operations
How to fetch a list of operations:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/operations' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "78b70250-f63d-476c-8842-c28951b1cfb0",
"type": "operations",
"attributes": {
"created_at": "2024-09-30T09:24:04.038532+00:00",
"updated_at": "2024-09-30T09:24:04.038532+00:00",
"status": "scheduled",
"status_message": null,
"finished_at": null,
"description": null,
"artifact": {
"url": null
},
"error_data": [],
"error_count": 0,
"employee_id": "514f299e-a057-43d5-b0d2-7c5d72fd55e5"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/operations
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=employee |
fields[] |
Array List of comma seperated fields to include ?fields[operations]=created_at,updated_at,status |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
status |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
finished_at |
Datetime eq , not_eq , gt , gte , lt , lte |
employee_id |
Uuid eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request accepts the following includes:
employee
Fetching an operation
How to fetch an operation:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/operations/fba2bdaa-140a-405d-bb1a-4529aa21a54c' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "fba2bdaa-140a-405d-bb1a-4529aa21a54c",
"type": "operations",
"attributes": {
"created_at": "2024-09-30T09:24:03.526953+00:00",
"updated_at": "2024-09-30T09:24:03.526953+00:00",
"status": "scheduled",
"status_message": null,
"finished_at": null,
"description": null,
"artifact": {
"url": null
},
"error_data": [],
"error_count": 0,
"employee_id": "579b46fa-1f52-4366-966a-aebf4bf1c76e"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/operations/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=employee |
fields[] |
Array List of comma seperated fields to include ?fields[operations]=created_at,updated_at,status |
Includes
This request accepts the following includes:
employee
Creating an operation
How to create an operation:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/operations' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "operations",
"attributes": {
"operation_data": {
"type": "archive",
"data": {
"target_type": "customers",
"target_ids": [
"123"
]
}
}
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "b422b0c9-62b3-4505-be34-efd0495ba359",
"type": "operations",
"attributes": {
"created_at": "2024-09-30T09:24:04.588168+00:00",
"updated_at": "2024-09-30T09:24:04.588168+00:00",
"status": "scheduled",
"status_message": null,
"finished_at": null,
"description": "Archiving customers",
"artifact": {
"url": null
},
"error_data": [],
"error_count": 0,
"employee_id": "598e6fe3-1190-401e-b36e-3ac7a1a0477f"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/operations
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=employee |
fields[] |
Array List of comma seperated fields to include ?fields[operations]=created_at,updated_at,status |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][operation_data] |
Hash An object with the params used to initiate the operation. See the description of the operation. |
Includes
This request accepts the following includes:
employee
Orders
Orders are the heart of every rental operation. They hold configuration and information about:
- The customer
- Pricing and taxes
- Deposits
- Rental period and location
- Shortages
- (Payment) status
- Additional information
An order can have multiple of the following statuses:
new
Means it's in new state.concept
Does not influence availability.reserved
Items on the order will be reserved and not available for other orders.started
Means that the rental has started. In most cases this means items are out with a customer.stopped
Items are available for other rentals again.canceled
The order is canceled. Items will be available for other rentals.archived
The order won't show up in default search results.
To transition an Order to the next status, create an OrderStatusTransition.
The actual status of items and stock items can be found in their respective resource (Planning, StockItemPlanning).
When assigning a customer to an order the following settings will be persisted to the order:
tax_region_id
deposit_type
deposit_value
Changing one of the following values can lead to shortages:
starts_at
stops_at
start_location_id
stop_location_id
A shortage error can be confirmed by setting the confirm_shortage
attribute to true
. Only if the shortage is within the limit configured in the product group(s). See the Product group resource for more information.
Endpoints
GET api/boomerang/orders
POST api/boomerang/orders/search
GET api/boomerang/orders/new
GET api/boomerang/orders/{id}
POST /api/boomerang/orders
PUT api/boomerang/orders/{id}
Fields
Every order has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
created_at |
Datetime readonly When the resource was created |
updated_at |
Datetime readonly When the resource was last updated |
number |
Integer readonly The unique order number |
status |
String readonly One of new , concept , reserved , started , stopped , archived , canceled |
statuses |
Array readonly Status(es) of planned products |
status_counts |
Hash readonly An object containing the status counts of planned products { "concept": 0, "reserved": 2, "started": 5, "stopped": 10 } |
starts_at |
Datetime nullable When the items on the order become unavailable |
stops_at |
Datetime nullable When the items on the order become available again |
deposit_type |
String nullable One of none , percentage_total , percentage , fixed |
deposit_value |
Float The value to use for deposit_type |
entirely_started |
Boolean readonly Whether all items on the order are started |
entirely_stopped |
Boolean readonly Whether all items on the order are stopped |
location_shortage |
Boolean readonly Whether there is a shortage on the pickup location |
shortage |
Boolean readonly Whether there is a shortage for this order |
payment_status |
String readonly One of paid , partially_paid , overpaid , payment_due , process_deposit |
override_period_restrictions |
Boolean Force free period selection when there are restrictions enabled for the order period picker |
confirm_shortage |
Boolean writeonly Confirm shortage on update |
has_signed_contract |
Boolean readonly Whether the order has a signed contract |
tag_list |
Array Case insensitive tag list |
properties |
Hash readonly A hash containing all basic property values (include properties if you need more detailed information about properties) |
properties_attributes |
Array writeonly The properties of the order |
price_in_cents |
Integer readonly Subtotal excl. taxes (excl. deposit) |
grand_total_in_cents |
Integer readonly Total excl. taxes (excl. deposit) |
grand_total_with_tax_in_cents |
Integer readonly Amount incl. taxes (excl. deposit) |
tax_in_cents |
Integer readonly Total tax |
discount_in_cents |
Integer readonly Discount (incl. or excl. taxes based on tax_strategy ) |
coupon_discount_in_cents |
Integer readonly Coupon discount (incl. or excl. taxes based on tax_strategy |
total_discount_in_cents |
Integer readonly Total discount (incl. or excl. taxes based on tax_strategy |
deposit_in_cents |
Integer readonly Deposit |
deposit_paid_in_cents |
Integer readonly How much of the deposit is paid |
deposit_refunded_in_cents |
Integer readonly How much of the deposit is refunded |
deposit_held_in_cents |
Integer readonly Amount of deposit held |
deposit_to_refund_in_cents |
Integer readonly Amount of deposit (still) to be refunded |
to_be_paid_in_cents |
Integer readonly Amount that (still) has to be paid |
paid_in_cents |
Integer readonly How much was paid |
discount_value |
Float writeonly The value to use for discount_type |
discount_type |
String One of percentage , fixed |
discount_percentage |
Float readonly The discount percentage applied to this order. May update if order amount changes and type is fixed |
delivery_address_property_id |
Uuid The property id of the delivery address |
delivery_billing_address_property_id |
Uuid The property id of the delivery billing address |
fulfillment_type |
String One of pickup , delivery |
customer_id |
Uuid nullable The associated Customer |
tax_region_id |
Uuid nullable The associated Tax region |
coupon_id |
Uuid nullable The associated Coupon |
start_location_id |
Uuid The associated Start location |
stop_location_id |
Uuid The associated Stop location |
Relationships
Orders have the following relationships:
Name | Description |
---|---|
barcode |
Barcodes Associated Barcode |
coupon |
Coupons Associated Coupon |
customer |
Customers The associated customer |
documents |
Documents readonly Associated Documents |
lines |
Lines readonly Associated Lines |
notes |
Notes readonly Associated Notes |
order_delivery_rate |
Order delivery rates Associated Order delivery rate |
plannings |
Plannings readonly Associated Plannings |
properties |
Properties readonly Associated Properties |
start_location |
Locations readonly The location where the customer will pick up the items. |
stock_item_plannings |
Stock item plannings readonly Associated Stock item plannings |
stop_location |
Locations readonly The location where the customer will return the items. When the clusters feature is in use, the stop location needs to be in the same cluster as the start location. |
tax_region |
Tax regions Associated Tax region |
tax_values |
Tax values readonly Associated Tax values |
transfers |
Transfers readonly Associated Transfers |
Listing orders
How to fetch a list of orders:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/orders' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "e37d35be-1011-4f59-ba0d-7adec70743c8",
"type": "orders",
"attributes": {
"created_at": "2024-09-30T09:28:06.858976+00:00",
"updated_at": "2024-09-30T09:28:08.782903+00:00",
"number": 1,
"status": "reserved",
"statuses": [
"reserved"
],
"status_counts": {
"concept": 0,
"new": 0,
"reserved": 1,
"started": 0,
"stopped": 0
},
"starts_at": "1980-04-01T12:00:00.000000+00:00",
"stops_at": "1980-05-01T12:00:00.000000+00:00",
"deposit_type": "percentage",
"deposit_value": 10.0,
"entirely_started": false,
"entirely_stopped": false,
"location_shortage": false,
"shortage": false,
"payment_status": "payment_due",
"override_period_restrictions": false,
"has_signed_contract": false,
"tag_list": [
"webshop"
],
"properties": {},
"price_in_cents": 80250,
"grand_total_in_cents": 72225,
"grand_total_with_tax_in_cents": 87392,
"tax_in_cents": 15167,
"discount_in_cents": 8025,
"coupon_discount_in_cents": 0,
"total_discount_in_cents": 8025,
"deposit_in_cents": 10000,
"deposit_paid_in_cents": 0,
"deposit_refunded_in_cents": 0,
"deposit_held_in_cents": 0,
"deposit_to_refund_in_cents": 0,
"to_be_paid_in_cents": 97392,
"paid_in_cents": 0,
"discount_type": "percentage",
"discount_percentage": 10.0,
"delivery_address_property_id": null,
"delivery_billing_address_property_id": null,
"fulfillment_type": "pickup",
"customer_id": "aa36bca4-2bbc-46fe-bcb8-3025c175e0f5",
"tax_region_id": null,
"coupon_id": null,
"start_location_id": "a1acc3ef-0487-4fb2-aa9d-7e91b8eb846d",
"stop_location_id": "a1acc3ef-0487-4fb2-aa9d-7e91b8eb846d"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET api/boomerang/orders
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=customer,coupon,start_location |
fields[] |
Array List of comma seperated fields to include ?fields[orders]=created_at,updated_at,number |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq , gt |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
number |
Integer eq , not_eq , gt , gte , lt , lte |
status |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
statuses |
Array eq , not_eq |
status_counts |
Hash eq |
starts_at |
Datetime eq , not_eq , gt , gte , lt , lte |
stops_at |
Datetime eq , not_eq , gt , gte , lt , lte |
deposit_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
location_shortage |
Boolean eq |
shortage |
Boolean eq |
payment_status |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
has_signed_contract |
Boolean eq |
tag_list |
String eq |
price_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
grand_total_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
grand_total_with_tax_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
tax_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
discount_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
coupon_discount_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
total_discount_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_paid_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_refunded_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_held_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_to_refund_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
to_be_paid_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
paid_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
discount_value |
Float eq , not_eq , gt , gte , lt , lte |
discount_percentage |
Float eq , not_eq , gt , gte , lt , lte |
delivery_address_property_id |
Uuid eq , not_eq |
delivery_billing_address_property_id |
Uuid eq , not_eq |
fulfillment_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
customer_id |
Uuid eq , not_eq |
tax_region_id |
Uuid eq , not_eq |
coupon_id |
Uuid eq , not_eq |
start_location_id |
Uuid eq , not_eq |
stop_location_id |
Uuid eq , not_eq |
q |
String eq |
item_id |
Uuid eq |
stock_item_id |
Uuid eq |
start_or_stop_time |
Datetime eq , not_eq , gt , gte , lt , lte , between |
any_shortage |
Boolean eq |
conditions |
Hash eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
payment_status |
Array count |
tag_list |
Array count |
status |
Array count |
statuses |
Array count |
shortage |
Array count |
location_shortage |
Array count |
deposit_type |
Array count |
price_in_cents |
Array sum , maximum , minimum , average |
grand_total_in_cents |
Array sum , maximum , minimum , average |
grand_total_with_tax_in_cents |
Array sum , maximum , minimum , average |
tax_in_cents |
Array sum , maximum , minimum , average |
discount_in_cents |
Array sum , maximum , minimum , average |
coupon_discount_in_cents |
Array sum , maximum , minimum , average |
total_discount_in_cents |
Array sum , maximum , minimum , average |
deposit_in_cents |
Array sum , maximum , minimum , average |
deposit_paid_in_cents |
Array sum , maximum , minimum , average |
deposit_refunded_in_cents |
Array sum , maximum , minimum , average |
deposit_held_in_cents |
Array sum , maximum , minimum , average |
deposit_to_refund_in_cents |
Array sum , maximum , minimum , average |
to_be_paid_in_cents |
Array sum , maximum , minimum , average |
paid_in_cents |
Array sum , maximum , minimum , average |
discount_percentage |
Array maximum , minimum , average |
Includes
This request accepts the following includes:
customer
coupon
start_location
stop_location
properties
Searching orders
Use advanced search to make logical filter groups with and/or operators.
How to search for orders:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/orders/search' \
--header 'content-type: application/json' \
--data '{
"fields": {
"orders": "id"
},
"filter": {
"conditions": {
"operator": "and",
"attributes": [
{
"operator": "or",
"attributes": [
{
"starts_at": {
"gte": "2024-10-01T09:28:17Z",
"lte": "2024-10-04T09:28:17Z"
}
},
{
"stops_at": {
"gte": "2024-10-01T09:28:17Z",
"lte": "2024-10-04T09:28:17Z"
}
}
]
},
{
"operator": "and",
"attributes": [
{
"deposit_type": "none"
},
{
"payment_status": "paid"
}
]
}
]
}
}
}'
A 200 status response looks like this:
{
"data": [
{
"id": "482a6f51-448f-4ea6-9224-a0d17c7b74d5"
},
{
"id": "c55dd6bf-6aa5-4537-b574-b1a60e6bb8fe"
}
]
}
HTTP Request
POST api/boomerang/orders/search
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=customer,coupon,start_location |
fields[] |
Array List of comma seperated fields to include ?fields[orders]=created_at,updated_at,number |
filter |
Hash The filters to apply ?filter[attribute][eq]=value |
sort |
String How to sort the data ?sort=attribute1,-attribute2 |
meta |
Hash Metadata to send along ?meta[total][]=count |
page[number] |
String The page to request |
page[size] |
String The amount of items per page (max 100) |
Filters
This request can be filtered on:
Name | Description |
---|---|
id |
Uuid eq , not_eq , gt |
created_at |
Datetime eq , not_eq , gt , gte , lt , lte |
updated_at |
Datetime eq , not_eq , gt , gte , lt , lte |
number |
Integer eq , not_eq , gt , gte , lt , lte |
status |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
statuses |
Array eq , not_eq |
status_counts |
Hash eq |
starts_at |
Datetime eq , not_eq , gt , gte , lt , lte |
stops_at |
Datetime eq , not_eq , gt , gte , lt , lte |
deposit_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
location_shortage |
Boolean eq |
shortage |
Boolean eq |
payment_status |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
has_signed_contract |
Boolean eq |
tag_list |
String eq |
price_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
grand_total_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
grand_total_with_tax_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
tax_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
discount_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
coupon_discount_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
total_discount_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_paid_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_refunded_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_held_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
deposit_to_refund_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
to_be_paid_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
paid_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
discount_value |
Float eq , not_eq , gt , gte , lt , lte |
discount_percentage |
Float eq , not_eq , gt , gte , lt , lte |
delivery_address_property_id |
Uuid eq , not_eq |
delivery_billing_address_property_id |
Uuid eq , not_eq |
fulfillment_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
customer_id |
Uuid eq , not_eq |
tax_region_id |
Uuid eq , not_eq |
coupon_id |
Uuid eq , not_eq |
start_location_id |
Uuid eq , not_eq |
stop_location_id |
Uuid eq , not_eq |
q |
String eq |
item_id |
Uuid eq |
stock_item_id |
Uuid eq |
start_or_stop_time |
Datetime eq , not_eq , gt , gte , lt , lte , between |
any_shortage |
Boolean eq |
conditions |
Hash eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
payment_status |
Array count |
tag_list |
Array count |
status |
Array count |
statuses |
Array count |
shortage |
Array count |
location_shortage |
Array count |
deposit_type |
Array count |
price_in_cents |
Array sum , maximum , minimum , average |
grand_total_in_cents |
Array sum , maximum , minimum , average |
grand_total_with_tax_in_cents |
Array sum , maximum , minimum , average |
tax_in_cents |
Array sum , maximum , minimum , average |
discount_in_cents |
Array sum , maximum , minimum , average |
coupon_discount_in_cents |
Array sum , maximum , minimum , average |
total_discount_in_cents |
Array sum , maximum , minimum , average |
deposit_in_cents |
Array sum , maximum , minimum , average |
deposit_paid_in_cents |
Array sum , maximum , minimum , average |
deposit_refunded_in_cents |
Array sum , maximum , minimum , average |
deposit_held_in_cents |
Array sum , maximum , minimum , average |
deposit_to_refund_in_cents |
Array sum , maximum , minimum , average |
to_be_paid_in_cents |
Array sum , maximum , minimum , average |
paid_in_cents |
Array sum , maximum , minimum , average |
discount_percentage |
Array maximum , minimum , average |
Includes
This request accepts the following includes:
customer
coupon
start_location
stop_location
properties
New order
Returns an existing or new order for the current employee.
How to fetch a new order:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/orders/new' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "becacb5d-9148-416d-9542-75c5e39c589b",
"type": "orders",
"attributes": {
"created_at": "2024-09-30T09:27:53.364284+00:00",
"updated_at": "2024-09-30T09:27:53.386025+00:00",
"number": null,
"status": "new",
"statuses": [
"new"
],
"status_counts": {
"new": 0,
"concept": 0,
"reserved": 0,
"started": 0,
"stopped": 0
},
"starts_at": null,
"stops_at": null,
"deposit_type": "percentage",
"deposit_value": 100.0,
"entirely_started": true,
"entirely_stopped": false,
"location_shortage": false,
"shortage": false,
"payment_status": "paid",
"override_period_restrictions": false,
"has_signed_contract": false,
"tag_list": [],
"properties": {},
"price_in_cents": 0,
"grand_total_in_cents": 0,
"grand_total_with_tax_in_cents": 0,
"tax_in_cents": 0,
"discount_in_cents": 0,
"coupon_discount_in_cents": 0,
"total_discount_in_cents": 0,
"deposit_in_cents": 0,
"deposit_paid_in_cents": 0,
"deposit_refunded_in_cents": 0,
"deposit_held_in_cents": 0,
"deposit_to_refund_in_cents": 0,
"to_be_paid_in_cents": 0,
"paid_in_cents": 0,
"discount_type": "percentage",
"discount_percentage": 0.0,
"delivery_address_property_id": null,
"delivery_billing_address_property_id": null,
"fulfillment_type": "pickup",
"customer_id": null,
"tax_region_id": null,
"coupon_id": null,
"start_location_id": "bc8be074-ef73-4c6c-995f-9cc89f33b319",
"stop_location_id": "bc8be074-ef73-4c6c-995f-9cc89f33b319"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET api/boomerang/orders/new
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=barcode,coupon,customer |
fields[] |
Array List of comma seperated fields to include ?fields[orders]=created_at,updated_at,number |
Includes
This request accepts the following includes:
barcode
coupon
customer
=>
merge_suggestion_customer
properties
documents
lines
=>
item
=>
photo
planning
=>
stock_item_plannings
=>
stock_item
tax_category
notes
properties
start_location
stop_location
tax_region
tax_values
transfers
order_delivery_rate
Fetching an order
How to fetch an order:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/orders/bddf761b-a3f5-4a83-b132-2cd50dda055c' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "bddf761b-a3f5-4a83-b132-2cd50dda055c",
"type": "orders",
"attributes": {
"created_at": "2024-09-30T09:27:47.330908+00:00",
"updated_at": "2024-09-30T09:27:49.248794+00:00",
"number": 1,
"status": "reserved",
"statuses": [
"reserved"
],
"status_counts": {
"concept": 0,
"new": 0,
"reserved": 1,
"started": 0,
"stopped": 0
},
"starts_at": "1980-04-01T12:00:00.000000+00:00",
"stops_at": "1980-05-01T12:00:00.000000+00:00",
"deposit_type": "percentage",
"deposit_value": 10.0,
"entirely_started": false,
"entirely_stopped": false,
"location_shortage": false,
"shortage": false,
"payment_status": "payment_due",
"override_period_restrictions": false,
"has_signed_contract": false,
"tag_list": [
"webshop"
],
"properties": {},
"price_in_cents": 80250,
"grand_total_in_cents": 72225,
"grand_total_with_tax_in_cents": 87392,
"tax_in_cents": 15167,
"discount_in_cents": 8025,
"coupon_discount_in_cents": 0,
"total_discount_in_cents": 8025,
"deposit_in_cents": 10000,
"deposit_paid_in_cents": 0,
"deposit_refunded_in_cents": 0,
"deposit_held_in_cents": 0,
"deposit_to_refund_in_cents": 0,
"to_be_paid_in_cents": 97392,
"paid_in_cents": 0,
"discount_type": "percentage",
"discount_percentage": 10.0,
"delivery_address_property_id": null,
"delivery_billing_address_property_id": null,
"fulfillment_type": "pickup",
"customer_id": "726ed4df-e6cc-4299-b361-e14ade181ebf",
"tax_region_id": null,
"coupon_id": null,
"start_location_id": "a84663d9-ae46-4a66-a5dc-830452a13781",
"stop_location_id": "a84663d9-ae46-4a66-a5dc-830452a13781"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET api/boomerang/orders/{id}