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": "25b49e65-07a5-4798-b8d8-82d31c2657df",
"type": "barcodes",
"attributes": {
"created_at": "2024-11-18T09:26:07.415744+00:00",
"updated_at": "2024-11-18T09:26:07.415744+00:00",
"number": "http://bqbl.it/25b49e65-07a5-4798-b8d8-82d31c2657df",
"barcode_type": "qr_code",
"image_url": "http://company-name-155.lvh.me:/barcodes/25b49e65-07a5-4798-b8d8-82d31c2657df/image",
"owner_id": "99cf4e58-dff8-4c43-9f4a-6448ed787c94",
"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%2F67119cf3-f53b-42d4-bbc6-777e49b08e7a&include=owner' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "67119cf3-f53b-42d4-bbc6-777e49b08e7a",
"type": "barcodes",
"attributes": {
"created_at": "2024-11-18T09:26:07.894103+00:00",
"updated_at": "2024-11-18T09:26:07.894103+00:00",
"number": "http://bqbl.it/67119cf3-f53b-42d4-bbc6-777e49b08e7a",
"barcode_type": "qr_code",
"image_url": "http://company-name-156.lvh.me:/barcodes/67119cf3-f53b-42d4-bbc6-777e49b08e7a/image",
"owner_id": "a382b761-c5b8-4a1c-b4f3-f464b22ed4c8",
"owner_type": "customers"
},
"relationships": {
"owner": {
"data": {
"type": "customers",
"id": "a382b761-c5b8-4a1c-b4f3-f464b22ed4c8"
}
}
}
}
],
"included": [
{
"id": "a382b761-c5b8-4a1c-b4f3-f464b22ed4c8",
"type": "customers",
"attributes": {
"created_at": "2024-11-18T09:26:07.857357+00:00",
"updated_at": "2024-11-18T09:26:07.895673+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=aHR0cDovL2JxYmwuaXQvNWExM2NkNGItY2UyYi00ZGNjLTg2MTItMmU3ZmE3NTNlZTFm&include=owner' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "5a13cd4b-ce2b-4dcc-8612-2e7fa753ee1f",
"type": "barcodes",
"attributes": {
"created_at": "2024-11-18T09:26:08.441539+00:00",
"updated_at": "2024-11-18T09:26:08.441539+00:00",
"number": "http://bqbl.it/5a13cd4b-ce2b-4dcc-8612-2e7fa753ee1f",
"barcode_type": "qr_code",
"image_url": "http://company-name-157.lvh.me:/barcodes/5a13cd4b-ce2b-4dcc-8612-2e7fa753ee1f/image",
"owner_id": "cab274f6-b49d-4e9b-91f7-03fd8ced276b",
"owner_type": "customers"
},
"relationships": {
"owner": {
"data": {
"type": "customers",
"id": "cab274f6-b49d-4e9b-91f7-03fd8ced276b"
}
}
}
}
],
"included": [
{
"id": "cab274f6-b49d-4e9b-91f7-03fd8ced276b",
"type": "customers",
"attributes": {
"created_at": "2024-11-18T09:26:08.409630+00:00",
"updated_at": "2024-11-18T09:26:08.442935+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/6cf8d024-4f3a-4fb0-a988-99c4a53eb47a?include=owner' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "6cf8d024-4f3a-4fb0-a988-99c4a53eb47a",
"type": "barcodes",
"attributes": {
"created_at": "2024-11-18T09:26:06.917405+00:00",
"updated_at": "2024-11-18T09:26:06.917405+00:00",
"number": "http://bqbl.it/6cf8d024-4f3a-4fb0-a988-99c4a53eb47a",
"barcode_type": "qr_code",
"image_url": "http://company-name-154.lvh.me:/barcodes/6cf8d024-4f3a-4fb0-a988-99c4a53eb47a/image",
"owner_id": "9472a3f1-48cd-45ce-bb81-7d2b502b7dab",
"owner_type": "customers"
},
"relationships": {
"owner": {
"data": {
"type": "customers",
"id": "9472a3f1-48cd-45ce-bb81-7d2b502b7dab"
}
}
}
},
"included": [
{
"id": "9472a3f1-48cd-45ce-bb81-7d2b502b7dab",
"type": "customers",
"attributes": {
"created_at": "2024-11-18T09:26:06.883946+00:00",
"updated_at": "2024-11-18T09:26:06.919076+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": "a1caffac-b479-4b13-a1a0-986eaf5f4c01",
"owner_type": "customers"
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "0b4a7b6c-448e-4c1f-9e7d-a9df21b1c529",
"type": "barcodes",
"attributes": {
"created_at": "2024-11-18T09:26:05.919316+00:00",
"updated_at": "2024-11-18T09:26:05.919316+00:00",
"number": "http://bqbl.it/0b4a7b6c-448e-4c1f-9e7d-a9df21b1c529",
"barcode_type": "qr_code",
"image_url": "http://company-name-152.lvh.me:/barcodes/0b4a7b6c-448e-4c1f-9e7d-a9df21b1c529/image",
"owner_id": "a1caffac-b479-4b13-a1a0-986eaf5f4c01",
"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/255a1d4c-e635-40af-b6ad-3a59437f3c5a' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "255a1d4c-e635-40af-b6ad-3a59437f3c5a",
"type": "barcodes",
"attributes": {
"number": "https://myfancysite.com"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "255a1d4c-e635-40af-b6ad-3a59437f3c5a",
"type": "barcodes",
"attributes": {
"created_at": "2024-11-18T09:26:06.392684+00:00",
"updated_at": "2024-11-18T09:26:06.446291+00:00",
"number": "https://myfancysite.com",
"barcode_type": "qr_code",
"image_url": "http://company-name-153.lvh.me:/barcodes/255a1d4c-e635-40af-b6ad-3a59437f3c5a/image",
"owner_id": "a97d4cb9-c2b7-4b18-a3fc-a8de386b0a57",
"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/a286df08-bebc-4369-9520-e73f490b1f9b' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "a286df08-bebc-4369-9520-e73f490b1f9b",
"type": "barcodes",
"attributes": {
"created_at": "2024-11-18T09:26:05.289955+00:00",
"updated_at": "2024-11-18T09:26:05.289955+00:00",
"number": "http://bqbl.it/a286df08-bebc-4369-9520-e73f490b1f9b",
"barcode_type": "qr_code",
"image_url": "http://company-name-151.lvh.me:/barcodes/a286df08-bebc-4369-9520-e73f490b1f9b/image",
"owner_id": "9a026ff4-f2c7-4c58-95f2-721265c1845c",
"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 Associated Bundle |
product_group_id |
Uuid Associated Product group |
product_id |
Uuid nullable 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=388062f6-cad1-42dd-93e6-9db91605de1b' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "4991982a-64f7-4bac-99db-5a97851b163f",
"type": "bundle_items",
"attributes": {
"created_at": "2024-11-18T09:27:15.826483+00:00",
"updated_at": "2024-11-18T09:27:15.826483+00:00",
"quantity": 2,
"discount_percentage": 15.0,
"position": 1,
"bundle_id": "388062f6-cad1-42dd-93e6-9db91605de1b",
"product_group_id": "3ad0e0da-2448-4789-b289-0b9c98a16c30",
"product_id": "2e8d020f-b072-4916-9804-e848687fe820"
},
"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/2e22fba6-9218-4ade-85a7-894b5b48924e' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "2e22fba6-9218-4ade-85a7-894b5b48924e",
"type": "bundle_items",
"attributes": {
"created_at": "2024-11-18T09:27:15.141954+00:00",
"updated_at": "2024-11-18T09:27:15.141954+00:00",
"quantity": 2,
"discount_percentage": 15.0,
"position": 1,
"bundle_id": "414ebd9f-d0b3-4e93-b414-aa25bab0f380",
"product_group_id": "1f75c2af-f16c-4c24-9eae-0744525b6cfa",
"product_id": "b5946531-44fa-417a-862a-8a57803bc4f7"
},
"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": "05d7efd1-5d69-431e-9f9a-10c47386b929",
"product_group_id": "1464dcf7-5168-42dc-92bf-059f3bb6568b",
"product_id": "9325221e-5fb4-4646-b630-96de85920214",
"quantity": 2,
"discount_percentage": 15
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "284f4473-d818-41e0-96fa-1ba3d491b682",
"type": "bundle_items",
"attributes": {
"created_at": "2024-11-18T09:27:14.462255+00:00",
"updated_at": "2024-11-18T09:27:14.462255+00:00",
"quantity": 2,
"discount_percentage": 15.0,
"position": 2,
"bundle_id": "05d7efd1-5d69-431e-9f9a-10c47386b929",
"product_group_id": "1464dcf7-5168-42dc-92bf-059f3bb6568b",
"product_id": "9325221e-5fb4-4646-b630-96de85920214"
},
"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 Associated Bundle |
data[attributes][product_group_id] |
Uuid Associated Product group |
data[attributes][product_id] |
Uuid 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/cab1a835-7171-4fc5-b53a-222e1b56d861' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "cab1a835-7171-4fc5-b53a-222e1b56d861",
"type": "bundle_items",
"attributes": {
"quantity": 3,
"discount_percentage": 20
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "cab1a835-7171-4fc5-b53a-222e1b56d861",
"type": "bundle_items",
"attributes": {
"created_at": "2024-11-18T09:27:12.731149+00:00",
"updated_at": "2024-11-18T09:27:12.801609+00:00",
"quantity": 3,
"discount_percentage": 20.0,
"position": 1,
"bundle_id": "48d48dd9-1fde-4569-b0d5-5b53da7bdb6b",
"product_group_id": "9f5f0c65-9552-425d-9b77-47ae2b12b84c",
"product_id": "33f82774-62e3-426e-adee-0489ccf37b7b"
},
"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 Associated Bundle |
data[attributes][product_group_id] |
Uuid Associated Product group |
data[attributes][product_id] |
Uuid 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/55044316-637b-4cff-80d3-d0cbdd2ab2e5' \
--header 'content-type: application/json' \
--data '{}'
A 200 status response looks like this:
{
"data": {
"id": "55044316-637b-4cff-80d3-d0cbdd2ab2e5",
"type": "bundle_items",
"attributes": {
"created_at": "2024-11-18T09:27:13.489104+00:00",
"updated_at": "2024-11-18T09:27:13.489104+00:00",
"quantity": 2,
"discount_percentage": 15.0,
"position": 1,
"bundle_id": "c63c635d-1b07-4c6d-b167-67eaa6f94e97",
"product_group_id": "4df548ad-ef45-44b0-b8d6-0bf49675cab5",
"product_id": "1523f4be-fc02-4225-a908-2e3472c6ae8d"
},
"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 Associated Photo |
tax_category_id |
Uuid 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": "b0353bb8-739c-4618-bbd5-d957c998725f",
"type": "bundles",
"attributes": {
"created_at": "2024-11-18T09:27:32.591296+00:00",
"updated_at": "2024-11-18T09:27:32.591296+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": "bdbba3e1-d05f-488f-9c29-43244fd8ef11"
},
{
"id": "1c752d34-d30f-4a37-b8db-a7858bbb59a1"
},
{
"id": "4df58387-8bd7-4bc2-afa5-1522bdb44cd4"
}
]
}
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/8fd7a566-6ae2-4635-ab0b-74c1b8f23d38' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "8fd7a566-6ae2-4635-ab0b-74c1b8f23d38",
"type": "bundles",
"attributes": {
"created_at": "2024-11-18T09:27:34.191925+00:00",
"updated_at": "2024-11-18T09:27:34.191925+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": "74548794-3d0f-4e02-bae2-75409dc296bb",
"product_id": "2c6a10e2-5155-4dc1-9b61-3ef62ac5abf0"
},
{
"quantity": 2,
"discount_percentage": 15,
"product_group_id": "1504ef1a-e032-47be-b271-c9738d20864f",
"product_id": "a5223ca9-0a61-4302-a2c7-b2c10cbd91d1"
}
]
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "8de9f53b-d988-457b-a131-eae9ca48e294",
"type": "bundles",
"attributes": {
"created_at": "2024-11-18T09:27:33.502243+00:00",
"updated_at": "2024-11-18T09:27:33.714539+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": "905ecfe6-b2bd-4be2-8b9e-5b02c5b4c678"
},
{
"type": "bundle_items",
"id": "fdf78886-9f98-4f91-97a2-1b4c9ad7f6d9"
},
{
"type": "bundle_items",
"id": "ca887ae9-8d60-4aba-bd43-ace2860602b4"
},
{
"type": "bundle_items",
"id": "92b36c77-6484-43f9-981c-66b38fd93617"
}
]
}
}
},
"included": [
{
"id": "905ecfe6-b2bd-4be2-8b9e-5b02c5b4c678",
"type": "bundle_items",
"attributes": {
"created_at": "2024-11-18T09:27:33.505420+00:00",
"updated_at": "2024-11-18T09:27:33.505420+00:00",
"quantity": 2,
"discount_percentage": 10.0,
"position": 1,
"bundle_id": "8de9f53b-d988-457b-a131-eae9ca48e294",
"product_group_id": "74548794-3d0f-4e02-bae2-75409dc296bb",
"product_id": "2c6a10e2-5155-4dc1-9b61-3ef62ac5abf0"
},
"relationships": {}
},
{
"id": "fdf78886-9f98-4f91-97a2-1b4c9ad7f6d9",
"type": "bundle_items",
"attributes": {
"created_at": "2024-11-18T09:27:33.507043+00:00",
"updated_at": "2024-11-18T09:27:33.507043+00:00",
"quantity": 2,
"discount_percentage": 15.0,
"position": 2,
"bundle_id": "8de9f53b-d988-457b-a131-eae9ca48e294",
"product_group_id": "1504ef1a-e032-47be-b271-c9738d20864f",
"product_id": "a5223ca9-0a61-4302-a2c7-b2c10cbd91d1"
},
"relationships": {}
},
{
"id": "ca887ae9-8d60-4aba-bd43-ace2860602b4",
"type": "bundle_items",
"attributes": {
"created_at": "2024-11-18T09:27:33.508436+00:00",
"updated_at": "2024-11-18T09:27:33.508436+00:00",
"quantity": 2,
"discount_percentage": 10.0,
"position": 3,
"bundle_id": "8de9f53b-d988-457b-a131-eae9ca48e294",
"product_group_id": "74548794-3d0f-4e02-bae2-75409dc296bb",
"product_id": "2c6a10e2-5155-4dc1-9b61-3ef62ac5abf0"
},
"relationships": {}
},
{
"id": "92b36c77-6484-43f9-981c-66b38fd93617",
"type": "bundle_items",
"attributes": {
"created_at": "2024-11-18T09:27:33.509767+00:00",
"updated_at": "2024-11-18T09:27:33.509767+00:00",
"quantity": 2,
"discount_percentage": 15.0,
"position": 4,
"bundle_id": "8de9f53b-d988-457b-a131-eae9ca48e294",
"product_group_id": "1504ef1a-e032-47be-b271-c9738d20864f",
"product_id": "a5223ca9-0a61-4302-a2c7-b2c10cbd91d1"
},
"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 Associated Photo |
data[attributes][tax_category_id] |
Uuid 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/21c10127-fe14-4257-9e28-36fcb5f2889b' \
--header 'content-type: application/json' \
--data '{
"include": "bundle_items",
"data": {
"id": "21c10127-fe14-4257-9e28-36fcb5f2889b",
"type": "bundles",
"attributes": {
"name": "iPad Pro Bundle",
"bundle_items_attributes": [
{
"id": "29f204df-5d21-40f0-b11d-01cc32953a69",
"_destroy": true
},
{
"quantity": 2,
"discount_percentage": 15,
"product_group_id": "911cc08b-ad27-4c46-8b6e-1181dac68cac",
"product_id": "8e11c11b-78e2-4c90-81df-229cfbd524a5"
}
]
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "21c10127-fe14-4257-9e28-36fcb5f2889b",
"type": "bundles",
"attributes": {
"created_at": "2024-11-18T09:27:30.930456+00:00",
"updated_at": "2024-11-18T09:27:31.601203+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": "1680bd15-0964-4027-87bd-4002fa099939"
},
{
"type": "bundle_items",
"id": "f86cea2f-3c23-4d7c-a87e-3b035bbf7ad5"
}
]
}
}
},
"included": [
{
"id": "1680bd15-0964-4027-87bd-4002fa099939",
"type": "bundle_items",
"attributes": {
"created_at": "2024-11-18T09:27:31.458309+00:00",
"updated_at": "2024-11-18T09:27:31.458309+00:00",
"quantity": 2,
"discount_percentage": 15.0,
"position": 2,
"bundle_id": "21c10127-fe14-4257-9e28-36fcb5f2889b",
"product_group_id": "911cc08b-ad27-4c46-8b6e-1181dac68cac",
"product_id": "8e11c11b-78e2-4c90-81df-229cfbd524a5"
},
"relationships": {}
},
{
"id": "f86cea2f-3c23-4d7c-a87e-3b035bbf7ad5",
"type": "bundle_items",
"attributes": {
"created_at": "2024-11-18T09:27:31.459817+00:00",
"updated_at": "2024-11-18T09:27:31.459817+00:00",
"quantity": 2,
"discount_percentage": 15.0,
"position": 3,
"bundle_id": "21c10127-fe14-4257-9e28-36fcb5f2889b",
"product_group_id": "911cc08b-ad27-4c46-8b6e-1181dac68cac",
"product_id": "8e11c11b-78e2-4c90-81df-229cfbd524a5"
},
"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 Associated Photo |
data[attributes][tax_category_id] |
Uuid 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/ba4a4110-5007-48a9-bdec-0d9b70ca274e' \
--header 'content-type: application/json' \
--data '{}'
A 200 status response looks like this:
{
"data": {
"id": "ba4a4110-5007-48a9-bdec-0d9b70ca274e",
"type": "bundles",
"attributes": {
"created_at": "2024-11-18T09:27:32.079640+00:00",
"updated_at": "2024-11-18T09:27:32.142218+00:00",
"archived": true,
"archived_at": "2024-11-18T09:27:32.142218+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 |
custom_domain_validation |
Hash Validation details for the custom domain |
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 |
year_business_start |
String readonly Year when company started, 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": "a1f7cf71-f008-49df-8a15-734ba9420280",
"type": "companies",
"attributes": {
"created_at": "2024-11-18T09:24:27.865681+00:00",
"updated_at": "2024-11-18T09:24:27.881598+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,
"custom_domain_validation": null,
"development": false,
"shop_theme_id": null,
"installed_online_store": false,
"source": null,
"medium": null,
"tenant_token": "c7b0d7d18102fc4b6500dda1e81dbbf8",
"pending_subscription": false,
"team_size": null,
"projected_revenue": null,
"year_business_start": 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": "c3920ceb-09bf-4577-85e4-60bda3d2c752",
"type": "companies",
"attributes": {
"subscription": {
"trial_ends_at": "2024-12-02T09:24:28.273Z",
"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",
"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": "b3edd09d-8c49-4c07-b1be-0abbaf58a4f7",
"type": "companies",
"attributes": {
"name": "iRent LLC"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "b3edd09d-8c49-4c07-b1be-0abbaf58a4f7",
"type": "companies",
"attributes": {
"created_at": "2024-11-18T09:24:27.427109+00:00",
"updated_at": "2024-11-18T09:24:27.484231+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,
"custom_domain_validation": null,
"development": false,
"shop_theme_id": null,
"installed_online_store": false,
"source": null,
"medium": null,
"tenant_token": "3a3bc661f2cfef523c2788aca7718954",
"pending_subscription": false,
"team_size": null,
"projected_revenue": null,
"year_business_start": 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][custom_domain_validation] |
Hash Validation details for the custom domain |
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 |
Relationships
Countries have the following relationships:
Name | Description |
---|---|
provinces |
Provinces readonly Associated Provinces |
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": "5b2ee373-aa50-4628-a635-71f462318e3f",
"type": "countries",
"attributes": {
"created_at": "2024-11-18T09:28:11.063134+00:00",
"updated_at": "2024-11-18T09:28:11.063134+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
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/countries
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=provinces |
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 accepts the following includes:
provinces
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": "97bc7585-22ff-48d0-97cb-d1cfd14eea9e",
"type": "coupons",
"attributes": {
"created_at": "2024-11-18T09:25:37.498947+00:00",
"updated_at": "2024-11-18T09:25:37.498947+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/a2266625-ad7e-40af-8c7c-64ea1b19da27' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "a2266625-ad7e-40af-8c7c-64ea1b19da27",
"type": "coupons",
"attributes": {
"created_at": "2024-11-18T09:25:36.611347+00:00",
"updated_at": "2024-11-18T09:25:36.611347+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": "627f55c8-656c-4264-b255-3da1422cc955",
"type": "coupons",
"attributes": {
"created_at": "2024-11-18T09:25:36.184857+00:00",
"updated_at": "2024-11-18T09:25:36.184857+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/db9dfb8d-632f-406a-81d6-a9a4270e6282' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "db9dfb8d-632f-406a-81d6-a9a4270e6282",
"type": "coupons",
"attributes": {
"identifier": "SUMMER30OFF",
"coupon_type": "percentage",
"value": 30
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "8852d420-c25d-4018-8ea0-bac7a29a0ab5",
"type": "coupons",
"attributes": {
"created_at": "2024-11-18T09:25:35.711822+00:00",
"updated_at": "2024-11-18T09:25:35.731980+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/32afbf7d-b559-4309-99cd-70d0f3f6550d' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "32afbf7d-b559-4309-99cd-70d0f3f6550d",
"type": "coupons",
"attributes": {
"active": false
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "c775e016-8140-445a-86fa-387807ae6f56",
"type": "coupons",
"attributes": {
"created_at": "2024-11-18T09:25:35.258130+00:00",
"updated_at": "2024-11-18T09:25:35.279689+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/10d811d4-300e-4e75-bfcc-00de4fbd2d8f' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "10d811d4-300e-4e75-bfcc-00de4fbd2d8f",
"type": "coupons",
"attributes": {
"created_at": "2024-11-18T09:25:37.058647+00:00",
"updated_at": "2024-11-18T09:25:37.071494+00:00",
"archived": true,
"archived_at": "2024-11-18T09:25:37.071494+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 Associated Merge suggestion customer |
tax_region_id |
Uuid nullable 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": "426b878d-e680-4002-8069-493cc89f2f4c",
"type": "customers",
"attributes": {
"created_at": "2024-11-18T09:25:52.358919+00:00",
"updated_at": "2024-11-18T09:25:52.358919+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": "7c37ff2f-d2b3-47c4-8969-f5661df164d2"
},
{
"id": "04b130ec-ff38-46e6-8c67-1c36542e0ab4"
}
]
}
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/e4a4664b-fda8-48a1-a7ca-3e4d1ade64e8?include=barcode%2Cproperties' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "e4a4664b-fda8-48a1-a7ca-3e4d1ade64e8",
"type": "customers",
"attributes": {
"created_at": "2024-11-18T09:25:47.819935+00:00",
"updated_at": "2024-11-18T09:25:47.819935+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": "ae77c22f-fe76-40ed-8bdd-b96801be9b44",
"type": "customers",
"attributes": {
"created_at": "2024-11-18T09:25:50.593549+00:00",
"updated_at": "2024-11-18T09:25:50.593549+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 Associated Merge suggestion customer |
data[attributes][tax_region_id] |
Uuid 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/fbf904ac-3550-4276-8beb-60e6b98395b5' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "fbf904ac-3550-4276-8beb-60e6b98395b5",
"type": "customers",
"attributes": {
"name": "Jane Doe"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "fbf904ac-3550-4276-8beb-60e6b98395b5",
"type": "customers",
"attributes": {
"created_at": "2024-11-18T09:25:51.477474+00:00",
"updated_at": "2024-11-18T09:25:51.540752+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 Associated Merge suggestion customer |
data[attributes][tax_region_id] |
Uuid 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/1f63c9b6-3a5d-4d2f-8791-8ad60eed97e2' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "1f63c9b6-3a5d-4d2f-8791-8ad60eed97e2",
"type": "customers",
"attributes": {
"created_at": "2024-11-18T09:25:49.629777+00:00",
"updated_at": "2024-11-18T09:25:49.696143+00:00",
"archived": true,
"archived_at": "2024-11-18T09:25:49.696143+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": "46f30c3c-3d7a-4e4f-b7e1-d3cbbef07356",
"type": "default_properties",
"attributes": {
"created_at": "2024-11-18T09:28:11.920201+00:00",
"updated_at": "2024-11-18T09:28:11.920201+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/32f343af-8c07-4f7f-8e85-32380143879e?include=owner' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "32f343af-8c07-4f7f-8e85-32380143879e",
"type": "default_properties",
"attributes": {
"created_at": "2024-11-18T09:28:12.803812+00:00",
"updated_at": "2024-11-18T09:28:12.803812+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": "596a7a1f-1e78-42fc-b4ef-6956d69ae71d",
"type": "default_properties",
"attributes": {
"created_at": "2024-11-18T09:28:13.243347+00:00",
"updated_at": "2024-11-18T09:28:13.243347+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/fe38bfc6-c36a-468d-8108-076330dbb4f1' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "fe38bfc6-c36a-468d-8108-076330dbb4f1",
"type": "default_properties",
"attributes": {
"property_type": "text_field"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "fe38bfc6-c36a-468d-8108-076330dbb4f1",
"type": "default_properties",
"attributes": {
"created_at": "2024-11-18T09:28:11.483635+00:00",
"updated_at": "2024-11-18T09:28:11.504558+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/598542e6-7c5b-433c-80d7-5e345147420f' \
--header 'content-type: application/json' \
--data '{}'
A 200 status response looks like this:
{
"data": {
"id": "598542e6-7c5b-433c-80d7-5e345147420f",
"type": "default_properties",
"attributes": {
"created_at": "2024-11-18T09:28:12.351031+00:00",
"updated_at": "2024-11-18T09:28:12.351031+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 Associated Order |
customer_id |
Uuid nullable Associated Customer |
tax_region_id |
Uuid nullable Associated Tax region |
coupon_id |
Uuid nullable 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": "11ff3f1e-fbe4-4a32-8b19-4494802b111a",
"type": "documents",
"attributes": {
"created_at": "2024-11-18T09:22:40.328524+00:00",
"updated_at": "2024-11-18T09:22:40.370462+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": "0d54da2e-139c-4559-a362-9f8fa3e6168c",
"customer_id": "d1f21921-e866-4717-91c1-427d3d4c0d10",
"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-11-15T09:22:49.766Z"
}
},
{
"date": {
"lte": "2024-11-21T09:22:49.767Z"
}
}
]
}
]
}
}
}'
A 200 status response looks like this:
{
"data": [
{
"id": "10264790-6e8f-4ac6-bd03-172f160b30af"
},
{
"id": "51863522-12f1-43ec-8d44-c2ab15dc1962"
}
]
}
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/97a3f965-aaa4-4a68-bfd2-564a53b798e0' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "97a3f965-aaa4-4a68-bfd2-564a53b798e0",
"type": "documents",
"attributes": {
"created_at": "2024-11-18T09:22:37.088068+00:00",
"updated_at": "2024-11-18T09:22:37.129851+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": "8030192f-ff16-4b14-a1e0-ff1550bc246c",
"customer_id": "40a363f1-c9a9-49e5-8e51-379656357939",
"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": "fad366e0-be1c-474c-ac8d-a701144b20d1"
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "ce2629d6-57fb-4b61-a0c5-23b3b0cee6ba",
"type": "documents",
"attributes": {
"created_at": "2024-11-18T09:22:53.190064+00:00",
"updated_at": "2024-11-18T09:22:53.200443+00:00",
"archived": false,
"archived_at": null,
"document_type": "contract",
"number": 1,
"prefix": null,
"prefix_with_number": "1",
"date": "2024-11-18",
"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": "fad366e0-be1c-474c-ac8d-a701144b20d1",
"customer_id": "2808ad2c-682b-4192-a646-90e2177c35d0",
"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 Associated Order |
data[attributes][customer_id] |
Uuid Associated Customer |
data[attributes][tax_region_id] |
Uuid Associated Tax region |
data[attributes][coupon_id] |
Uuid 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/7a92c678-2710-4480-886e-26e386731a9a' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "7a92c678-2710-4480-886e-26e386731a9a",
"type": "documents",
"attributes": {
"name": "Jane Doe"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "7a92c678-2710-4480-886e-26e386731a9a",
"type": "documents",
"attributes": {
"created_at": "2024-11-18T09:22:32.940922+00:00",
"updated_at": "2024-11-18T09:22:33.870466+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": "0d8ff387-a1a7-4d16-bc64-9a528981ada7",
"customer_id": "ec3857e3-be29-4510-9fe3-3467d33208c5",
"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 Associated Order |
data[attributes][customer_id] |
Uuid Associated Customer |
data[attributes][tax_region_id] |
Uuid Associated Tax region |
data[attributes][coupon_id] |
Uuid 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/2086dfe0-1e76-4aee-a6eb-0980a25c5db6' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "2086dfe0-1e76-4aee-a6eb-0980a25c5db6",
"type": "documents",
"attributes": {
"created_at": "2024-11-18T09:22:43.501609+00:00",
"updated_at": "2024-11-18T09:22:44.347570+00:00",
"archived": true,
"archived_at": "2024-11-18T09:22:44.347570+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": "a920249f-97bb-4061-a238-717837f751f2",
"customer_id": "89b7eaff-6361-467b-ae74-41dfc31a80d3",
"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": "37092548-5c64-42cd-b57b-de0abacff3ed",
"type": "email_templates",
"attributes": {
"created_at": "2024-11-18T09:26:04.817973+00:00",
"updated_at": "2024-11-18T09:26:04.817973+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/47fe8a8b-84de-4535-b2b9-8bd902bfbafd' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "47fe8a8b-84de-4535-b2b9-8bd902bfbafd",
"type": "email_templates",
"attributes": {
"created_at": "2024-11-18T09:26:03.482844+00:00",
"updated_at": "2024-11-18T09:26:03.482844+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": "fa4dff43-bd40-49cc-8b30-941786e297b9",
"type": "email_templates",
"attributes": {
"created_at": "2024-11-18T09:26:04.338810+00:00",
"updated_at": "2024-11-18T09:26:04.338810+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/dc289c47-d737-447a-bde7-6f19b2e7f0ef' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "dc289c47-d737-447a-bde7-6f19b2e7f0ef",
"type": "email_templates",
"attributes": {
"name": "Order confirmation"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "dc289c47-d737-447a-bde7-6f19b2e7f0ef",
"type": "email_templates",
"attributes": {
"created_at": "2024-11-18T09:26:02.603849+00:00",
"updated_at": "2024-11-18T09:26:02.619850+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/b6bc6d4c-4055-4427-aad7-eb1eaf14ab52' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "b6bc6d4c-4055-4427-aad7-eb1eaf14ab52",
"type": "email_templates",
"attributes": {
"name": "Order confirmation"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "b6bc6d4c-4055-4427-aad7-eb1eaf14ab52",
"type": "email_templates",
"attributes": {
"created_at": "2024-11-18T09:26:03.043535+00:00",
"updated_at": "2024-11-18T09:26:03.061583+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/3f990a3b-f0f0-483c-9dfe-79eebff169d5' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "3f990a3b-f0f0-483c-9dfe-79eebff169d5",
"type": "email_templates",
"attributes": {
"created_at": "2024-11-18T09:26:03.894505+00:00",
"updated_at": "2024-11-18T09:26:03.894505+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 email was created by the user, or automatically by Booqable. At this time, the email has not been sent yet. |
updated_at |
Datetime readonly The last time the email was updated. Typically this is updated after a delivery attempt has failed. |
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 Order the email is associated with, will be used to fill template data |
customer_id |
Uuid Customer the email is associated with, will be used to fill template data |
email_template_id |
Uuid Which email template to use |
employee_id |
Uuid readonly Employee who sent the email |
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": "83bc50bb-d429-418a-b9cd-36157e0cadcf",
"type": "emails",
"attributes": {
"created_at": "2024-11-18T09:24:36.598633+00:00",
"updated_at": "2024-11-18T09:24:36.598633+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": "8e6aa32d-1435-4a70-bbef-501228f00bd0",
"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=7842da1b-991d-4c37-aae7-6a520653c9a6' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "8788daef-9728-4ff7-9486-a9210f1fb1ba",
"type": "emails",
"attributes": {
"created_at": "2024-11-18T09:24:36.012151+00:00",
"updated_at": "2024-11-18T09:24:36.069583+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": "7842da1b-991d-4c37-aae7-6a520653c9a6",
"customer_id": "647bc1a0-2617-451e-885b-c295065bc207",
"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": "dc972425-c1d6-4ebf-b82d-c7fe8a5218ce",
"order_id": "f46d4ab2-fbfe-4792-b97e-62738d1abb94",
"customer_id": "1e1ade55-39c2-4f3f-b47e-b5c597320262",
"document_ids": [
"f543d51d-4ef0-49d8-9ae0-f1571fd9169b"
]
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "f3ef879c-d1ce-4fe9-85bb-a6958e301f2f",
"type": "emails",
"attributes": {
"created_at": "2024-11-18T09:24:37.344876+00:00",
"updated_at": "2024-11-18T09:24:37.344876+00:00",
"subject": "Order confirmation",
"body": "Hi {{customer.name}}",
"recipients": "[email protected],[email protected]",
"has_error": false,
"sent": false,
"document_ids": [
"f543d51d-4ef0-49d8-9ae0-f1571fd9169b"
],
"order_id": "f46d4ab2-fbfe-4792-b97e-62738d1abb94",
"customer_id": "1e1ade55-39c2-4f3f-b47e-b5c597320262",
"email_template_id": "dc972425-c1d6-4ebf-b82d-c7fe8a5218ce",
"employee_id": "0489674e-9a2b-4185-a060-c780a3dd7df2"
},
"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 Order the email is associated with, will be used to fill template data |
data[attributes][customer_id] |
Uuid Customer the email is associated with, will be used to fill template data |
data[attributes][email_template_id] |
Uuid Which email template to use |
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": "5aa2f064-74f3-46cd-b662-d1bd54e7f8eb",
"type": "employees",
"attributes": {
"created_at": "2024-11-18T09:24:25.163452+00:00",
"updated_at": "2024-11-18T09:24:25.166948+00:00",
"name": "John Doe",
"firstname": "John",
"lastname": "Doe",
"locale": null,
"email": "[email protected]",
"unconfirmed_email": null,
"viewed_whats_new_at": "2024-11-18T09:24:25.158591+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/6e4d3c0b-8001-4576-848e-d4411010b8e7' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "6e4d3c0b-8001-4576-848e-d4411010b8e7",
"type": "employees",
"attributes": {
"created_at": "2024-11-18T09:24:25.604353+00:00",
"updated_at": "2024-11-18T09:24:25.604353+00:00",
"name": "John Doe",
"firstname": "John",
"lastname": "Doe",
"locale": null,
"email": "[email protected]",
"unconfirmed_email": null,
"viewed_whats_new_at": "2024-11-18T09:24:25.599422+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/0b202bdc-80a5-48be-bd99-072857cf930a' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "0b202bdc-80a5-48be-bd99-072857cf930a",
"type": "employees",
"attributes": {
"firstname": "Jane"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "0b202bdc-80a5-48be-bd99-072857cf930a",
"type": "employees",
"attributes": {
"created_at": "2024-11-18T09:24:27.013583+00:00",
"updated_at": "2024-11-18T09:24:27.040407+00:00",
"name": "Jane Doe",
"firstname": "Jane",
"lastname": "Doe",
"locale": null,
"email": "[email protected]",
"unconfirmed_email": null,
"viewed_whats_new_at": "2024-11-18T09:24:27.008326+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/909a2efe-3a1d-4b6c-9193-e31b84d40453' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "909a2efe-3a1d-4b6c-9193-e31b84d40453",
"type": "employees",
"attributes": {
"active": false
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "909a2efe-3a1d-4b6c-9193-e31b84d40453",
"type": "employees",
"attributes": {
"created_at": "2024-11-18T09:24:26.507428+00:00",
"updated_at": "2024-11-18T09:24:26.532265+00:00",
"name": "John Doe",
"firstname": "John",
"lastname": "Doe",
"locale": null,
"email": "[email protected]",
"unconfirmed_email": null,
"viewed_whats_new_at": "2024-11-18T09:24:26.503196+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/f0fd8fa5-e4b4-4b3e-bca3-f8a1fe55f2fe' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "f0fd8fa5-e4b4-4b3e-bca3-f8a1fe55f2fe",
"type": "employees",
"attributes": {
"permissions": [
"reports",
"settings"
]
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "f0fd8fa5-e4b4-4b3e-bca3-f8a1fe55f2fe",
"type": "employees",
"attributes": {
"created_at": "2024-11-18T09:24:26.030031+00:00",
"updated_at": "2024-11-18T09:24:26.060940+00:00",
"name": "John Doe",
"firstname": "John",
"lastname": "Doe",
"locale": null,
"email": "[email protected]",
"unconfirmed_email": null,
"viewed_whats_new_at": "2024-11-18T09:24:26.025874+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 Primary key |
item_id |
Uuid ID of the item to return data for, this can be a single ID or an array of multiple IDs |
order_id |
Uuid readonly Return data for all items on an order |
location_id |
Uuid ID of the location to filter for |
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=a03e4620-e8e0-437f-b9a0-96127061323e&filter%5Btill%5D=2022-01-02+09%3A00%3A00' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "05034a0f-58e0-50a4-807e-4366e96a9a39",
"type": "inventory_levels",
"attributes": {
"item_id": "a03e4620-e8e0-437f-b9a0-96127061323e",
"order_id": null,
"location_id": "cf55d954-2575-4f32-8dd1-fcb74047315e",
"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=0d67a100-8165-4d05-a716-198cb24f95a1&filter%5Blocation_id%5D=e6255162-f185-4952-9f2a-bfc999b77750&filter%5Btill%5D=2022-01-02+09%3A00%3A00' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "1d04d639-bd64-5d25-aa65-63dd4b3507fb",
"type": "inventory_levels",
"attributes": {
"item_id": "0d67a100-8165-4d05-a716-198cb24f95a1",
"order_id": null,
"location_id": "e6255162-f185-4952-9f2a-bfc999b77750",
"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 Primary key |
document_id |
Uuid ID of the invoice that needs to be finalized. |
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": "20fd22d6-d71e-4b85-bd3f-38c00c9aa08f"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "a397344b-3089-56a2-b290-798457c48c5c",
"type": "invoice_finalizations",
"attributes": {
"document_id": "20fd22d6-d71e-4b85-bd3f-38c00c9aa08f"
},
"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 ID of the invoice that needs to be finalized. |
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 Primary key |
order_id |
Uuid ID of the order for which the invoice needs to be revised. |
revised_invoice_id |
Uuid readonly Document ID of the finalized invoice that was revised. |
revision_invoice_id |
Uuid readonly 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": "ecc950c7-9258-4c8a-af11-c113ebc28032"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "41aa4c36-6001-5548-9857-c5298c7754f3",
"type": "invoice_revisions",
"attributes": {
"order_id": "ecc950c7-9258-4c8a-af11-c113ebc28032",
"revised_invoice_id": "6359c520-13ba-4042-b791-3bf1484419aa",
"revision_invoice_id": "e533c378-ce00-414f-a53b-6ba3400135c9"
},
"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 ID of the order for which the invoice needs to be revised. |
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": "eb22e997-f3b7-4b12-9697-91b59e857b13",
"type": "bundles",
"attributes": {
"created_at": "2024-11-18T09:24:08.370245+00:00",
"updated_at": "2024-11-18T09:24:08.370245+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": "b9bc75ff-ca2b-446a-9ca5-f31ffa08677a",
"type": "product_groups",
"attributes": {
"created_at": "2024-11-18T09:24:08.466257+00:00",
"updated_at": "2024-11-18T09:24:08.476242+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": "1e38ee70-9384-4ab3-b818-4479c59c153c",
"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": "847eb76e-4659-4371-91e8-b5de144f3dc5",
"type": "products",
"attributes": {
"created_at": "2024-11-18T09:24:08.469859+00:00",
"updated_at": "2024-11-18T09:24:08.469859+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": "1e38ee70-9384-4ab3-b818-4479c59c153c",
"price_ruleset_id": null,
"price_structure_id": null,
"variation_values": [],
"allow_shortage": true,
"shortage_limit": 3,
"product_group_id": "b9bc75ff-ca2b-446a-9ca5-f31ffa08677a"
},
"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": "b68f91f0-d8f2-4edd-8c4f-c391ae87bda1"
},
{
"id": "79f62971-d29c-4514-bae4-e67f728254f3"
},
{
"id": "cde3c719-0049-4c9d-a652-6e402745471e"
},
{
"id": "f2572e78-1ff3-465c-b073-ee55af737156"
},
{
"id": "41d0f735-d012-4a91-ac38-f405ae98ce35"
}
]
}
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/f22b6d42-76ab-45df-845e-b2065134dce6' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "f22b6d42-76ab-45df-845e-b2065134dce6",
"type": "product_groups",
"attributes": {
"created_at": "2024-11-18T09:24:09.290815+00:00",
"updated_at": "2024-11-18T09:24:09.300806+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": "73eed787-582c-4dca-9915-6986bd964d5f",
"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 Primary key |
item_id |
Uuid Required, the item or items to calculate price for |
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 Optional price structure to use, if the item has a price structure associated with it that will be used by default |
price_ruleset_id |
Uuid Associated Price ruleset |
price_tile_id |
Uuid readonly 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=7bc82df7-652c-4d49-b614-5ed4e4fd37b9&filter%5Bitem_id%5D%5B%5D=a33ee4e9-8de5-4dca-b794-9219cb9ac81f&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": "953344df-0eb1-4933-abcd-82a6d26ed57b",
"type": "item_prices",
"attributes": {
"item_id": "7bc82df7-652c-4d49-b614-5ed4e4fd37b9",
"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": "7bc82df7-652c-4d49-b614-5ed4e4fd37b9"
}
}
}
},
{
"id": "a48b41f4-c5ed-4a86-9e7f-5733710ea152",
"type": "item_prices",
"attributes": {
"item_id": "a33ee4e9-8de5-4dca-b794-9219cb9ac81f",
"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": "a33ee4e9-8de5-4dca-b794-9219cb9ac81f"
}
}
}
}
],
"included": [
{
"id": "7bc82df7-652c-4d49-b614-5ed4e4fd37b9",
"type": "products",
"attributes": {
"created_at": "2024-11-18T09:23:36.944682+00:00",
"updated_at": "2024-11-18T09:23:36.944682+00:00",
"archived": false,
"archived_at": null,
"type": "products",
"name": "Product 1000006",
"group_name": "Product 1000006",
"slug": "product-1000006",
"sku": "PRODUCT 1000006",
"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": "7150e5fc-1f68-4059-902f-f93b9f430747"
},
"relationships": {}
},
{
"id": "a33ee4e9-8de5-4dca-b794-9219cb9ac81f",
"type": "products",
"attributes": {
"created_at": "2024-11-18T09:23:37.194104+00:00",
"updated_at": "2024-11-18T09:23:37.194104+00:00",
"archived": false,
"archived_at": null,
"type": "products",
"name": "Product 1000007",
"group_name": "Product 1000007",
"slug": "product-1000007",
"sku": "PRODUCT 1000007",
"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": "5bd48a2b-409b-4cfe-b525-05bd8a7e5734"
},
"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=e3bc89d2-7264-4cd9-818d-645f0e7b6ff4&include=item' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "c1f098b8-7971-4588-9926-bc6800c2e66f",
"type": "item_prices",
"attributes": {
"item_id": "e3bc89d2-7264-4cd9-818d-645f0e7b6ff4",
"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": "e3bc89d2-7264-4cd9-818d-645f0e7b6ff4"
}
}
}
}
],
"included": [
{
"id": "e3bc89d2-7264-4cd9-818d-645f0e7b6ff4",
"type": "products",
"attributes": {
"created_at": "2024-11-18T09:23:35.866061+00:00",
"updated_at": "2024-11-18T09:23:35.866061+00:00",
"archived": false,
"archived_at": null,
"type": "products",
"name": "Product 1000004",
"group_name": "Product 1000004",
"slug": "product-1000004",
"sku": "PRODUCT 1000004",
"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": "80f75fa7-7eb5-47eb-8dd9-85858af0a8d6"
},
"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 Associated Order |
item_id |
Uuid nullable Associated Item |
tax_category_id |
Uuid nullable Associated Tax category |
price_structure_id |
Uuid Associated Price structure |
price_tile_id |
Uuid Associated Price tile |
planning_id |
Uuid Associated Planning |
parent_line_id |
Uuid 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": "2f69ac2f-4550-4b8c-b3ed-3f9ecfeae76c",
"type": "lines",
"attributes": {
"created_at": "2024-11-18T09:23:21.906775+00:00",
"updated_at": "2024-11-18T09:23:21.941932+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": "f9d3488d-f283-4dc2-b5c0-df7d89588b50",
"item_id": "9ca651d9-9fdb-45d2-85a0-e01357d49451",
"tax_category_id": "1cd1ee55-0aad-4677-b3f7-b3e1447323fb",
"price_structure_id": null,
"price_tile_id": null,
"planning_id": "b7c7b02e-33cf-4b53-80e0-97dcd471cc4c",
"parent_line_id": null,
"owner_id": "f9d3488d-f283-4dc2-b5c0-df7d89588b50",
"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/e4f7fb3b-3a2f-43ec-9826-222a3f27cd9a' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "e4f7fb3b-3a2f-43ec-9826-222a3f27cd9a",
"type": "lines",
"attributes": {
"created_at": "2024-11-18T09:23:28.692579+00:00",
"updated_at": "2024-11-18T09:23:28.723304+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": "15585fa9-fcb6-4d4a-b924-d6c9d59375b5",
"item_id": "01a1909a-50df-4e6c-996c-680d3d8762a6",
"tax_category_id": "661c1397-e0c8-43f6-9e52-90ca632a7e4b",
"price_structure_id": null,
"price_tile_id": null,
"planning_id": "10c985b6-f194-4ade-ac0e-ef47be459c8b",
"parent_line_id": null,
"owner_id": "15585fa9-fcb6-4d4a-b924-d6c9d59375b5",
"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": "2d1d6d1e-b13b-42e1-bd6b-c1e055ac0137",
"owner_type": "orders",
"price_each_in_cents": 1000
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "92b7eb18-a1fd-42d5-8dc7-0d8d52ec7f3b",
"type": "lines",
"attributes": {
"created_at": "2024-11-18T09:23:24.469952+00:00",
"updated_at": "2024-11-18T09:23:24.477979+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": "2d1d6d1e-b13b-42e1-bd6b-c1e055ac0137",
"item_id": null,
"tax_category_id": null,
"price_structure_id": null,
"price_tile_id": null,
"planning_id": null,
"parent_line_id": null,
"owner_id": "2d1d6d1e-b13b-42e1-bd6b-c1e055ac0137",
"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 Associated Order |
data[attributes][item_id] |
Uuid Associated Item |
data[attributes][tax_category_id] |
Uuid Associated Tax category |
data[attributes][price_structure_id] |
Uuid Associated Price structure |
data[attributes][price_tile_id] |
Uuid Associated Price tile |
data[attributes][planning_id] |
Uuid Associated Planning |
data[attributes][parent_line_id] |
Uuid 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/ab82f7bd-3868-4a96-9098-3ccc4e5abd51' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "ab82f7bd-3868-4a96-9098-3ccc4e5abd51",
"type": "lines",
"attributes": {
"price_each_in_cents": 1000
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "ab82f7bd-3868-4a96-9098-3ccc4e5abd51",
"type": "lines",
"attributes": {
"created_at": "2024-11-18T09:23:25.823222+00:00",
"updated_at": "2024-11-18T09:23:26.568642+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": "51848705-191b-4d2b-8d14-4b2f79f342f6",
"item_id": "1b7ada3a-3493-4bf9-b682-46c5f351aed5",
"tax_category_id": "3d1b2296-c165-4a25-99fe-1a902899fc99",
"price_structure_id": null,
"price_tile_id": null,
"planning_id": "fa4bec97-decf-4d84-9afb-bd350dc881d1",
"parent_line_id": null,
"owner_id": "51848705-191b-4d2b-8d14-4b2f79f342f6",
"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 Associated Order |
data[attributes][item_id] |
Uuid Associated Item |
data[attributes][tax_category_id] |
Uuid Associated Tax category |
data[attributes][price_structure_id] |
Uuid Associated Price structure |
data[attributes][price_tile_id] |
Uuid Associated Price tile |
data[attributes][planning_id] |
Uuid Associated Planning |
data[attributes][parent_line_id] |
Uuid 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/ef6ee9b9-b831-4d28-a4a8-94406d762d5d' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "ef6ee9b9-b831-4d28-a4a8-94406d762d5d",
"type": "lines",
"attributes": {
"created_at": "2024-11-18T09:23:30.704333+00:00",
"updated_at": "2024-11-18T09:23:31.473366+00:00",
"archived": true,
"archived_at": "2024-11-18T09:23:31.473366+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": "25b59ac0-ea96-4990-8bb6-dcb74ed4aef7",
"item_id": "2a8a7bf2-6d22-481f-9c59-363ad27f89ab",
"tax_category_id": "1dd4ea6a-ff66-4ac1-859d-528501925443",
"price_structure_id": null,
"price_tile_id": null,
"planning_id": "b79e33e5-1007-4e32-bdef-966174bd9642",
"parent_line_id": null,
"owner_id": "25b59ac0-ea96-4990-8bb6-dcb74ed4aef7",
"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 |
fulfillment_capabilities |
Array readonly An array of fulfillment capabilities (available values: pickup , delivery ) |
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": "ad48628e-736d-4833-b246-e50915ea1303",
"type": "locations",
"attributes": {
"created_at": "2024-11-18T09:26:36.083548+00:00",
"updated_at": "2024-11-18T09:26:36.086939+00:00",
"archived": false,
"archived_at": null,
"name": "Warehouse",
"code": "LOC1000055",
"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,
"fulfillment_capabilities": [
"pickup"
],
"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/82520aaf-c640-4dd9-9ea0-a12a7a20f107' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "82520aaf-c640-4dd9-9ea0-a12a7a20f107",
"type": "locations",
"attributes": {
"created_at": "2024-11-18T09:26:41.214405+00:00",
"updated_at": "2024-11-18T09:26:41.217804+00:00",
"archived": false,
"archived_at": null,
"name": "Warehouse",
"code": "LOC1000064",
"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,
"fulfillment_capabilities": [
"pickup"
],
"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": [
"ee4880f8-6d3c-4b45-88f5-dfe4176a21c7"
]
}
},
"include": "clusters"
}'
A 201 status response looks like this:
{
"data": {
"id": "301bba98-1401-4067-959a-c2609afdf896",
"type": "locations",
"attributes": {
"created_at": "2024-11-18T09:26:38.147186+00:00",
"updated_at": "2024-11-18T09:26:38.156245+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": [
"ee4880f8-6d3c-4b45-88f5-dfe4176a21c7"
],
"pickup_enabled": true,
"fulfillment_capabilities": [
"pickup"
],
"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": "ee4880f8-6d3c-4b45-88f5-dfe4176a21c7"
}
]
}
}
},
"included": [
{
"id": "ee4880f8-6d3c-4b45-88f5-dfe4176a21c7",
"type": "clusters",
"attributes": {
"created_at": "2024-11-18T09:26:38.066215+00:00",
"updated_at": "2024-11-18T09:26:38.066215+00:00",
"name": "North",
"location_ids": [
"301bba98-1401-4067-959a-c2609afdf896"
]
},
"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/461f0f9b-4690-4e7b-9a18-f5c7f3498df2' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "461f0f9b-4690-4e7b-9a18-f5c7f3498df2",
"type": "locations",
"attributes": {
"name": "Old warehouse",
"cluster_ids": [
"042dffc7-f634-46b7-9b95-c9fe5da1615d",
"e8a3fdc6-aa74-4e0e-ade0-2b06f2b7a9ed"
]
}
},
"include": "clusters"
}'
A 200 status response looks like this:
{
"data": {
"id": "461f0f9b-4690-4e7b-9a18-f5c7f3498df2",
"type": "locations",
"attributes": {
"created_at": "2024-11-18T09:26:40.729981+00:00",
"updated_at": "2024-11-18T09:26:40.780042+00:00",
"archived": false,
"archived_at": null,
"name": "Old warehouse",
"code": "LOC1000063",
"location_type": "rental",
"address_line_1": "Blokhuisplein 40",
"address_line_2": "Department II",
"zipcode": "8911LJ",
"city": "Leeuwarden",
"region": "Friesland",
"country": "Netherlands",
"cluster_ids": [
"042dffc7-f634-46b7-9b95-c9fe5da1615d",
"e8a3fdc6-aa74-4e0e-ade0-2b06f2b7a9ed"
],
"pickup_enabled": true,
"fulfillment_capabilities": [
"pickup"
],
"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": "042dffc7-f634-46b7-9b95-c9fe5da1615d"
},
{
"type": "clusters",
"id": "e8a3fdc6-aa74-4e0e-ade0-2b06f2b7a9ed"
}
]
}
}
},
"included": [
{
"id": "042dffc7-f634-46b7-9b95-c9fe5da1615d",
"type": "clusters",
"attributes": {
"created_at": "2024-11-18T09:26:40.738685+00:00",
"updated_at": "2024-11-18T09:26:40.738685+00:00",
"name": "North",
"location_ids": [
"461f0f9b-4690-4e7b-9a18-f5c7f3498df2"
]
},
"relationships": {}
},
{
"id": "e8a3fdc6-aa74-4e0e-ade0-2b06f2b7a9ed",
"type": "clusters",
"attributes": {
"created_at": "2024-11-18T09:26:40.742932+00:00",
"updated_at": "2024-11-18T09:26:40.742932+00:00",
"name": "Central",
"location_ids": [
"461f0f9b-4690-4e7b-9a18-f5c7f3498df2"
]
},
"relationships": {}
}
],
"meta": {}
}
Disassociating cluster resulting in shortage error:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/locations/b2a0b469-c424-4f01-8a15-d286c80b4395' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "b2a0b469-c424-4f01-8a15-d286c80b4395",
"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": "227b5cb0-0466-4fe2-b902-4daaaf862de2",
"mutation": 0,
"order_ids": [
"fae4a412-7513-455e-bdd8-a4f469dcfda9"
],
"location_id": "b2a0b469-c424-4f01-8a15-d286c80b4395",
"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/e5416bf9-3a9d-46e9-bd1e-23b3e924e5c7' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "e5416bf9-3a9d-46e9-bd1e-23b3e924e5c7",
"type": "locations",
"attributes": {
"created_at": "2024-11-18T09:26:36.957317+00:00",
"updated_at": "2024-11-18T09:26:36.987304+00:00",
"archived": true,
"archived_at": "2024-11-18T09:26:36.987304+00:00",
"name": "Warehouse",
"code": "LOC1000057",
"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,
"fulfillment_capabilities": [
"pickup"
],
"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/b247cbde-a094-44e9-a5fe-cef8210aa4d4' \
--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": [
"62f6d934-cb86-4b41-8ec2-a69433ad7720"
]
}
}
]
}
Failure due to active stock at location:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/locations/4d891a08-f27a-4aa4-bb22-d5f8ed7fddfd' \
--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": [
"b602d168-b023-4e4a-b12d-e954a390b75e"
]
}
}
]
}
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 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, User 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": "4e70afe0-d64d-44a3-be82-67caa50a31ae",
"type": "notes",
"attributes": {
"created_at": "2024-11-18T09:24:11.934255+00:00",
"updated_at": "2024-11-18T09:24:11.934255+00:00",
"body": "Agreed to give this customer a 20% discount on the next order",
"owner_id": "5ba5fce0-f22b-43ef-bb80-b01d526e5890",
"owner_type": "customers",
"employee_id": "dae77c25-1058-495b-9a6e-0eb911cab76e"
},
"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/bea00837-2ea9-4c47-8b64-d439b58185d4' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "bea00837-2ea9-4c47-8b64-d439b58185d4",
"type": "notes",
"attributes": {
"created_at": "2024-11-18T09:24:12.424661+00:00",
"updated_at": "2024-11-18T09:24:12.424661+00:00",
"body": "Agreed to give this customer a 20% discount on the next order",
"owner_id": "549d2a3b-a3b8-4d80-985e-74e52cde57a0",
"owner_type": "customers",
"employee_id": "327d8019-a25a-4b2f-96c8-e427e71f6cf7"
},
"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": "dc99232b-7ed7-46a3-b2d2-4e93ca869fe3",
"owner_type": "customers"
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "d2102349-d76a-4de7-854e-6ba4b51dc642",
"type": "notes",
"attributes": {
"created_at": "2024-11-18T09:24:13.473680+00:00",
"updated_at": "2024-11-18T09:24:13.473680+00:00",
"body": "Agreed to give this customer a 20% discount on the next order",
"owner_id": "dc99232b-7ed7-46a3-b2d2-4e93ca869fe3",
"owner_type": "customers",
"employee_id": "0d837f8c-a722-4683-81b3-e8bb5ea1824e"
},
"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/d5f437ca-3358-4129-8332-eb1a44659f9a' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "d5f437ca-3358-4129-8332-eb1a44659f9a",
"type": "notes",
"attributes": {
"created_at": "2024-11-18T09:24:12.941093+00:00",
"updated_at": "2024-11-18T09:24:12.941093+00:00",
"body": "Agreed to give this customer a 20% discount on the next order",
"owner_id": "ca6c3898-2ffe-47fe-aa3f-31f0a4cafe0b",
"owner_type": "customers",
"employee_id": "a563e0f5-fd26-4a86-b47b-f0760fccf7e4"
},
"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_collections
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 Collection
Updates the collections associated to the entities by mutating them with the action. Other collections already associated to the entity are not modified.
Params
"operation_data": {
"type": "update_collections",
"data": {
"target_type": "product_groups",
"target_ids": [
"123",
"456"
],
"action": "add_entities",
"collection_ids": [
"789",
"101"
]
}
}
Key | Type | Possible values | Description |
---|---|---|---|
type |
String | update_collections |
Required to start this specific operation. |
data.target_type |
String | product_groups |
The type of resource that should have the associated collections 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 collections updated. |
data.action |
String | add_entities , remove_entities |
The action that should be executed on the collections of the entities. |
data.collection_ids |
Array<Uuid> | [{id}, {id}] |
The primary keys of the collections that should be used with the action. |
Artifact
No artifacts are generated when updating collections.
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 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": "d3bcb092-3b57-4c9f-aa1f-37d229eac8eb",
"type": "operations",
"attributes": {
"created_at": "2024-11-18T09:26:31.494205+00:00",
"updated_at": "2024-11-18T09:26:31.494205+00:00",
"status": "scheduled",
"status_message": null,
"finished_at": null,
"description": null,
"artifact": {
"url": null
},
"error_data": [],
"error_count": 0,
"employee_id": "b18b4822-13eb-4bfd-84c2-9ee94f51ceba"
},
"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/c88a3c0f-658e-42dd-9d4e-3afa5324c618' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "c88a3c0f-658e-42dd-9d4e-3afa5324c618",
"type": "operations",
"attributes": {
"created_at": "2024-11-18T09:26:32.425764+00:00",
"updated_at": "2024-11-18T09:26:32.425764+00:00",
"status": "scheduled",
"status_message": null,
"finished_at": null,
"description": null,
"artifact": {
"url": null
},
"error_data": [],
"error_count": 0,
"employee_id": "126590e6-8999-418e-94c6-9dde3bbf4e85"
},
"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": "5e93d679-f316-4150-a9d5-7809a4affd0e",
"type": "operations",
"attributes": {
"created_at": "2024-11-18T09:26:31.947602+00:00",
"updated_at": "2024-11-18T09:26:31.947602+00:00",
"status": "scheduled",
"status_message": null,
"finished_at": null,
"description": "Archiving customers",
"artifact": {
"url": null
},
"error_data": [],
"error_count": 0,
"employee_id": "f406ba79-df32-40f3-95fe-f5237f630421"
},
"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 |
order_delivery_rate_attributes |
Hash writeonly The delivery rate 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 |
billing_address_property_id |
Uuid The property id of the billing address |
fulfillment_type |
String One of pickup , delivery |
customer_id |
Uuid nullable The associated customer |
tax_region_id |
Uuid nullable Associated Tax region |
coupon_id |
Uuid nullable Associated Coupon |
start_location_id |
Uuid The location where the customer will pick up the items. |
stop_location_id |
Uuid 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. |
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": "540b26bc-60ac-4a67-8193-e3a27e087108",
"type": "orders",
"attributes": {
"created_at": "2024-11-18T09:23:38.275275+00:00",
"updated_at": "2024-11-18T09:23:40.091486+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,
"billing_address_property_id": null,
"fulfillment_type": "pickup",
"customer_id": "2b0aea77-4b7b-443a-af8b-b2663e2afbc6",
"tax_region_id": null,
"coupon_id": null,
"start_location_id": "d249db42-c203-424d-b4ec-c157e28cc57b",
"stop_location_id": "d249db42-c203-424d-b4ec-c157e28cc57b"
},
"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 |
billing_address_property_id |
Uuid eq , not_eq |
fulfillment_type |
String eq |
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-11-19T09:23:51Z",
"lte": "2024-11-22T09:23:51Z"
}
},
{
"stops_at": {
"gte": "2024-11-19T09:23:51Z",
"lte": "2024-11-22T09:23:51Z"
}
}
]
},
{
"operator": "and",
"attributes": [
{
"deposit_type": "none"
},
{
"payment_status": "paid"
}
]
}
]
}
}
}'
A 200 status response looks like this:
{
"data": [
{
"id": "cf4f3d8b-9d7c-4be4-babe-65b356377277"
},
{
"id": "e0efd4c6-05bf-41bb-844d-ed920a4f7d6e"
}
]
}
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 |
billing_address_property_id |
Uuid eq , not_eq |
fulfillment_type |
String eq |
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": "343e6bd5-ca0b-4f2a-a1a5-52f3eff9f5e6",
"type": "orders",
"attributes": {
"created_at": "2024-11-18T09:23:42.872286+00:00",
"updated_at": "2024-11-18T09:23:42.882586+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,
"billing_address_property_id": null,
"fulfillment_type": "pickup",
"customer_id": null,
"tax_region_id": null,
"coupon_id": null,
"start_location_id": "994c5653-6a37-4633-b155-d6a1fb68d41d",
"stop_location_id": "994c5653-6a37-4633-b155-d6a1fb68d41d"
},
"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
=>
delivery_address
Fetching an order
How to fetch an order:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/orders/95a78074-c0a0-4a96-928c-1e83096a9cea' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "95a78074-c0a0-4a96-928c-1e83096a9cea",
"type": "orders",
"attributes": {
"created_at": "2024-11-18T09:23:43.518119+00:00",
"updated_at": "2024-11-18T09:23:45.271251+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,
"billing_address_property_id": null,
"fulfillment_type": "pickup",
"customer_id": "f435453e-d7e8-4dd0-ad56-cc139a8aa5a3",
"tax_region_id": null,
"coupon_id": null,
"start_location_id": "df87a91a-5b52-44ac-a44c-4c317b40e591",
"stop_location_id": "df87a91a-5b52-44ac-a44c-4c317b40e591"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET api/boomerang/orders/{id}
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
=>
delivery_address
Creating an order
When creating an order, and the following fields are left blank, a sensible default will be picked:
deposit_type
Default deposit type configured in settings.deposit_value
Default deposit value configured in settings.start_location_id
First location in account.stop_location_id
First location in account.
How to create an order:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/orders' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "orders",
"attributes": {
"starts_at": "2024-11-21T09:23:48.024Z",
"stops_at": "2024-12-30T09:23:48.024Z"
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "a4462d8e-8ed4-4f3b-9eaf-f6fa22f7794d",
"type": "orders",
"attributes": {
"created_at": "2024-11-18T09:23:48.048556+00:00",
"updated_at": "2024-11-18T09:23:48.059800+00:00",
"number": null,
"status": "new",
"statuses": [
"new"
],
"status_counts": {
"new": 0,
"concept": 0,
"reserved": 0,
"started": 0,
"stopped": 0
},
"starts_at": "2024-11-21T09:15:00.000000+00:00",
"stops_at": "2024-12-30T09:15:00.000000+00:00",
"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,
"billing_address_property_id": null,
"fulfillment_type": "pickup",
"customer_id": null,
"tax_region_id": null,
"coupon_id": null,
"start_location_id": "39a86548-0570-47bc-a21e-ee78fae96c01",
"stop_location_id": "39a86548-0570-47bc-a21e-ee78fae96c01"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/orders
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 |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][starts_at] |
Datetime When the items on the order become unavailable |
data[attributes][stops_at] |
Datetime When the items on the order become available again |
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][override_period_restrictions] |
Boolean Force free period selection when there are restrictions enabled for the order period picker |
data[attributes][confirm_shortage] |
Boolean Confirm shortage on update |
data[attributes][tag_list][] |
Array Case insensitive tag list |
data[attributes][properties_attributes][] |
Array The properties of the order |
data[attributes][order_delivery_rate_attributes] |
Hash The delivery rate of the order |
data[attributes][discount_value] |
Float The value to use for discount_type |
data[attributes][discount_type] |
String One of percentage , fixed |
data[attributes][billing_address_property_id] |
Uuid The property id of the billing address |
data[attributes][fulfillment_type] |
String One of pickup , delivery |
data[attributes][customer_id] |
Uuid The associated customer |
data[attributes][tax_region_id] |
Uuid Associated Tax region |
data[attributes][coupon_id] |
Uuid Associated Coupon |
data[attributes][start_location_id] |
Uuid The location where the customer will pick up the items. |
data[attributes][stop_location_id] |
Uuid 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. |
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
=>
delivery_address
Updating an order
When updating a customer on an order the following settings will be applied and prices will be calculated accordingly:
discount_percentage
deposit_type
deposit_value
tax_region_id
How to assign a (new) customer to an order:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/orders/72a63cdd-f1f0-4362-9644-3815c3f43603' \
--header 'content-type: application/json' \
--data '{
"fields": {
"orders": "customer_id,tax_region_id,price_in_cents,grand_total_with_tax_in_cents,to_be_paid_in_cents"
},
"data": {
"id": "72a63cdd-f1f0-4362-9644-3815c3f43603",
"type": "orders",
"attributes": {
"customer_id": "2198f51d-50cb-4af3-ad9a-5d7e2c496c12"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "72a63cdd-f1f0-4362-9644-3815c3f43603",
"type": "orders",
"attributes": {
"price_in_cents": 80250,
"grand_total_with_tax_in_cents": 97103,
"to_be_paid_in_cents": 197103,
"customer_id": "2198f51d-50cb-4af3-ad9a-5d7e2c496c12",
"tax_region_id": null
},
"relationships": {}
},
"meta": {}
}
How to update the deposit_type:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/orders/d2016c32-9a85-4ef0-905f-a7f2846629b3' \
--header 'content-type: application/json' \
--data '{
"fields": {
"orders": "deposit_type,deposit_in_cents,to_be_paid_in_cents,deposit_paid_in_cents"
},
"data": {
"id": "d2016c32-9a85-4ef0-905f-a7f2846629b3",
"type": "orders",
"attributes": {
"deposit_type": "percentage"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "d2016c32-9a85-4ef0-905f-a7f2846629b3",
"type": "orders",
"attributes": {
"deposit_type": "percentage",
"deposit_in_cents": 10000,
"deposit_paid_in_cents": 0,
"to_be_paid_in_cents": 97392
},
"relationships": {}
},
"meta": {}
}
Updating stops_at resulting in a shortage:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/orders/c1f39034-2055-4b39-bf44-6f0c6e650b37' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "c1f39034-2055-4b39-bf44-6f0c6e650b37",
"type": "orders",
"attributes": {
"stops_at": "1980-05-04T12:00:00.000Z"
}
}
}'
A 422 status response looks like this:
{
"errors": [
{
"code": "stock_item_specified",
"status": "422",
"title": "Stock item specified",
"detail": "One or more items are not available",
"meta": {
"warning": [],
"blocking": [
{
"reason": "stock_item_specified",
"item_id": "18af1eb2-a8be-41a8-9572-66d8c5911657",
"unavailable": [
"1ba66cd4-9fa8-4e45-8966-dea4f67a4f7e"
],
"available": [
"38079061-45ca-46d9-9d54-20af8072d36d"
]
}
]
}
}
]
}
HTTP Request
PUT api/boomerang/orders/{id}
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 |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][starts_at] |
Datetime When items become unavailable, changing this value may result in shortages |
data[attributes][stops_at] |
Datetime When items become available, changing this value may result in shortages |
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][override_period_restrictions] |
Boolean Force free period selection when there are restrictions enabled for the order period picker |
data[attributes][confirm_shortage] |
Boolean Confirm shortage on update |
data[attributes][tag_list][] |
Array Case insensitive tag list |
data[attributes][properties_attributes][] |
Array The properties of the order |
data[attributes][order_delivery_rate_attributes] |
Hash The delivery rate of the order |
data[attributes][discount_value] |
Float The value to use for discount_type |
data[attributes][discount_type] |
String One of percentage , fixed |
data[attributes][billing_address_property_id] |
Uuid The property id of the billing address |
data[attributes][fulfillment_type] |
String One of pickup , delivery |
data[attributes][customer_id] |
Uuid The associated customer |
data[attributes][tax_region_id] |
Uuid Associated Tax region |
data[attributes][coupon_id] |
Uuid Associated Coupon |
data[attributes][start_location_id] |
Uuid The location where the customer will pick up the items. |
data[attributes][stop_location_id] |
Uuid 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. |
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
=>
delivery_address
Order duplications
Duplicates an Order
with a selectable subset of fields and associations.
Fields
Every order duplication has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
custom_lines |
Boolean Indicates if custom Lines should be copied from the original Order. |
customer |
Boolean Indicates if the Customer should be copied from the original Order. |
dates |
Boolean Indicates if the rental dates should be copied from the original Order. |
discount |
Boolean Indicates if discounts should be copied from the original Order. |
properties |
Boolean Indicates if properties should be copied from the original Order. |
stock_item_plannings |
Boolean Indicates if planned stock items should be copied from the original Order. |
tags |
Boolean Indicates if tags should be copied from the original Order. |
deposit |
String current copies the desposit from the original Order, default resets the deposit to the default for the company or customer, none removes the deposit. |
original_order_id |
Uuid ID of the Order to be duplicated. |
new_order_id |
Uuid readonly ID of the newly created Order. |
Relationships
Order duplications have the following relationships:
Name | Description |
---|---|
new_order |
Orders readonly Associated New order |
original_order |
Orders Associated Original order |
Duplicate
Duplicate an Order:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_duplications' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_duplications",
"attributes": {
"original_order_id": "4d558118-762f-4db0-9acd-137bc6cb1b8f",
"custom_lines": true,
"customer": true,
"dates": true,
"deposit": "current",
"discount": true,
"properties": true,
"stock_item_plannings": true,
"tags": true
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "52c9b1c3-9708-5df4-bb92-26718f06d29a",
"type": "order_duplications",
"attributes": {
"custom_lines": true,
"customer": true,
"dates": true,
"discount": true,
"properties": true,
"stock_item_plannings": true,
"tags": true,
"deposit": "current",
"original_order_id": "4d558118-762f-4db0-9acd-137bc6cb1b8f",
"new_order_id": "4f321a57-e531-41e5-a5ad-f86a82049d06"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/order_duplications
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=original_order,new_order |
fields[] |
Array List of comma seperated fields to include ?fields[order_duplications]=custom_lines,customer,dates |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][custom_lines] |
Boolean Indicates if custom Lines should be copied from the original Order. |
data[attributes][customer] |
Boolean Indicates if the Customer should be copied from the original Order. |
data[attributes][dates] |
Boolean Indicates if the rental dates should be copied from the original Order. |
data[attributes][discount] |
Boolean Indicates if discounts should be copied from the original Order. |
data[attributes][properties] |
Boolean Indicates if properties should be copied from the original Order. |
data[attributes][stock_item_plannings] |
Boolean Indicates if planned stock items should be copied from the original Order. |
data[attributes][tags] |
Boolean Indicates if tags should be copied from the original Order. |
data[attributes][deposit] |
String current copies the desposit from the original Order, default resets the deposit to the default for the company or customer, none removes the deposit. |
data[attributes][original_order_id] |
Uuid ID of the Order to be duplicated. |
Includes
This request accepts the following includes:
original_order
new_order
Order fulfillments
Takes an Order through the fulfillment process.
Actions
Book a Bundle
Books a Bundle on an Order.
For each unspecified BundleItem a product variation needs to be selected. Specified BundleItems are automatically booked. These must not be included in the request. When a Bundle only contains specified BundleItems, an empty list of product variations must be provided.
The quantity
attribute sets the quantity of the Bundle itself,
and multiplies the quantities of all products in the Bundle.
The confirm_shortage
attribute (on the resource, not on the action),
overrides shortage warnings when booking on a reserved or started order.
{
"action": "book_bundle",
"bundle_id": "<id>",
"quantity": N,
"product_variations": [
{
"bundle_item_id": "<id>",
"product_id": "<id>"
},
{
"bundle_item_id": "<id>",
"product_id": "<id>"
}
]
}
Book a Product
Books a quantity of a Product on an Order. This can be any type of Product, including trackable Products.
This action supports 3 modes:
- create_new
, a new Planning and Line are created.
- update_existing
, the quantity is added to an existing Planning/Line
- infer_planning
, behaves as update_existing
when a Planning for
the same Product exists. Behaves as create_new
when there is no
existing Planning for the Product.
The confirm_shortage
attribute (on the resource, not on the action),
overrides shortage warnings when booking on a reserved or started order.
{
"action": "book_product",
"mode": "create_new",
"planning_id": "<id>", // required for `mode==update_existing`
"product_id": "<id>",
"quantity": N,
}
Book StockItems
Books one or more StockItems of a trackable Product on an Order.
This action supports 3 modes:
- create_new
, a new Planning and Line are created.
- update_existing
, the StockItems are booked on an existing Planning/Line.
If needed, the quantity of the Planning is increased to accomodate all
newly booked StockItems.
- infer_planning
, behaves as update_existing
when a Planning for
the same Product exists. Behaves as create_new
when there is no
existing Planning for the Product.
The confirm_shortage
attribute (on the resource, not on the action),
overrides shortage warnings when booking on a reserved or started order.
{
"action": "book_stock_items",
"stock_item_ids": ["<id>"],
"planning_id": "<id>", // required for `mode==update_existing`
"product_id": "<id>",
"mode": "infer_planning",
}
Specify StockItems
Adds or removes one or more StockItems from an existing Planning.
It is not possible to specify more StockItems than there is remaining quantity left on the Planning. StockItems that have already been started can not be removed.
{
"action": "specify_stock_items",
"product_id": "<id>",
"planning_id": "<id>",
"stock_item_ids_to_add": ["<id>", "<id>"],
"stock_item_ids_to_remove": ["<id>", "<id>"]
}
When removing StockItems, the archived StockItemPlannings are returned
as part of the changed_stock_item_plannings
relation.
Start a Product
A quantity of a product is started. The quantity can be the same as the booked quantity, or less when a subset of items is started.
The confirm_shortage
attribute (on the resource, not on the action),
overrides shortage warnings when booking on a reserved or started order.
{
"action": "start_product",
"product_id": "<id>",
"planning_id": "<id>",
"quantity": N
}
Start StockItems
One or more stock items of a trackable product are started.
The confirm_shortage
attribute (on the resource, not on the action),
overrides shortage warnings when booking on a reserved or started order.
{
"action": "start_stock_items",
"product_id": "<id>",
"planning_id": "<id>",
"stock_item_ids": ["<id>", "<id>"]
}
Stop a Product
A quantity of a product is returned. The product needs to have started. The quantity can be the same as the started quantity, or less when a subset of items is returned.
Consumables and services can not be stopped.
{
"action": "stop_product",
"product_id": "<id>",
"planning_id": "<id>",
"quantity": N
}
Stop StockItems
One or more stock items of a trackable product are returned. Only stock items that have been started can be stopped.
{
"action": "stop_stock_items",
"product_id": "<id>",
"planning_id": "<id>",
"stock_item_ids": ["<id>", "<id>"]
}
Errors
Booking and starting items can be blocked by shortage errors and other kinds of inventory errors.
Endpoints
POST /api/boomerang/order_fulfillments
Fields
Every order fulfillment has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
actions |
Array writeonly Array of actions to be performed. The actions are executed atomically, and succeed as a whole, or fail as a whole. |
confirm_shortage |
Boolean writeonly A value of true overrides shortage warnings when booking products on a reserved or started Order. |
order_id |
Uuid Associated Order |
Relationships
Order fulfillments have the following relationships:
Name | Description |
---|---|
changed_lines |
Lines readonly Associated Changed lines |
changed_plannings |
Plannings readonly Associated Changed plannings |
changed_stock_item_plannings |
Stock item plannings readonly Associated Changed stock item plannings |
order |
Orders readonly Associated Order |
Book
Book a Product (on a new Planning):
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_fulfillments",
"attributes": {
"order_id": "6eea33ab-e61f-460c-a49f-d3beefc66c17",
"confirm_shortage": null,
"actions": [
{
"action": "book_product",
"mode": "create_new",
"product_id": "c8f5946d-1ba1-4ca5-8319-21a75e8a05ec",
"quantity": 3
}
]
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "e2e05769-e0ee-5cc3-ae84-2044a0c0c56e",
"type": "order_fulfillments",
"attributes": {
"order_id": "6eea33ab-e61f-460c-a49f-d3beefc66c17"
},
"relationships": {}
},
"meta": {}
}
Book a Product (on an existing Planning if there is any):
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_fulfillments",
"attributes": {
"order_id": "8a601341-8aaa-4374-9e92-09d0d3b39859",
"confirm_shortage": null,
"actions": [
{
"action": "book_product",
"mode": "infer_planning",
"product_id": "df45b98f-f305-4c77-beeb-5ea628103d9b",
"planning_id": null,
"quantity": 3
}
]
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "8810eee2-cdbe-5435-95be-ab016134005b",
"type": "order_fulfillments",
"attributes": {
"order_id": "8a601341-8aaa-4374-9e92-09d0d3b39859"
},
"relationships": {}
},
"meta": {}
}
Book a Product (on a specified Planning):
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_fulfillments",
"attributes": {
"order_id": "03550483-5638-461e-a30d-6ca97c69326c",
"confirm_shortage": null,
"actions": [
{
"action": "book_product",
"mode": "update_existing",
"product_id": "40212583-8ca1-4ec8-a9fc-ee29cd93a9f8",
"planning_id": "c5b27515-3b73-45f1-8208-362fdf97b94c",
"quantity": 3
}
]
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "be5e77e3-de11-5cf1-b722-df895fc9b358",
"type": "order_fulfillments",
"attributes": {
"order_id": "03550483-5638-461e-a30d-6ca97c69326c"
},
"relationships": {}
},
"meta": {}
}
Book StockItems:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_fulfillments",
"attributes": {
"order_id": "453b0ef3-ecf8-4a0b-bd4e-5ddcb1d9bd4b",
"confirm_shortage": null,
"actions": [
{
"action": "book_stock_items",
"mode": "infer_planning",
"product_id": "aaf3ff54-3b6d-4542-8910-d9900461704b",
"stock_item_ids": [
"81e7d223-2d30-472e-8dd1-c9b57dc2919d",
"0cdda226-4e19-4fc0-bf05-7999ab8c70f5"
]
}
]
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "b5534fa4-5c04-57a2-8679-827a2e1494b3",
"type": "order_fulfillments",
"attributes": {
"order_id": "453b0ef3-ecf8-4a0b-bd4e-5ddcb1d9bd4b"
},
"relationships": {}
},
"meta": {}
}
Book a Bundle:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_fulfillments",
"attributes": {
"order_id": "56f43c22-6c8a-4e97-b382-d4eeb56b21e0",
"confirm_shortage": null,
"actions": [
{
"action": "book_bundle",
"bundle_id": "fafb0e7e-f9f0-40cc-887a-f8776c156ed3",
"quantity": 1,
"product_variations": [
{
"bundle_item_id": "bcfbbb1e-4ffb-4357-b814-7476fa1f4eb4",
"product_id": "d1b47f2d-2337-4280-81cf-fcf933abeb28"
}
]
}
]
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "8a6f60f8-6775-557d-8973-8bd6b1d5e7b1",
"type": "order_fulfillments",
"attributes": {
"order_id": "56f43c22-6c8a-4e97-b382-d4eeb56b21e0"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/order_fulfillments
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=order,changed_lines,changed_plannings |
fields[] |
Array List of comma seperated fields to include ?fields[order_fulfillments]=order_id |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][actions][] |
Array Array of actions to be performed. The actions are executed atomically, and succeed as a whole, or fail as a whole. |
data[attributes][confirm_shortage] |
Boolean A value of true overrides shortage warnings when booking products on a reserved or started Order. |
data[attributes][order_id] |
Uuid Associated Order |
Includes
This request accepts the following includes:
order
=>
tax_values
transfers
changed_lines
=>
item
=>
photo
changed_plannings
changed_stock_item_plannings
=>
stock_item
Specify
Add a StockItem:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_fulfillments",
"attributes": {
"order_id": "b7fcbfed-9653-42e1-8c92-3033de37d79a",
"actions": [
{
"action": "specify_stock_items",
"product_id": "293dabf3-4357-435a-9bbd-409603097c2d",
"planning_id": "de611bdd-a27c-4ac8-b48f-4bc52daf1769",
"stock_item_ids_to_add": [
"325af969-6d0c-4ecc-9878-5c8971cef451"
],
"stock_item_ids_to_remove": []
}
]
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "66365d26-6c86-5fbc-aeb3-7d0cbab0b230",
"type": "order_fulfillments",
"attributes": {
"order_id": "b7fcbfed-9653-42e1-8c92-3033de37d79a"
},
"relationships": {}
},
"meta": {}
}
Remove a StockItem:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_fulfillments",
"attributes": {
"order_id": "9b663279-e4ef-4838-aece-7e3283232bf6",
"actions": [
{
"action": "specify_stock_items",
"product_id": "818a4329-02b9-49e0-b06f-0a3b813a8e92",
"planning_id": "f7ad858d-ffbe-4bf0-a2f3-52356b20ae46",
"stock_item_ids_to_add": [],
"stock_item_ids_to_remove": [
"ea6611f3-b349-4780-b92a-3f5c2413a10a"
]
}
]
}
},
"include": "changed_stock_item_plannings"
}'
A 200 status response looks like this:
{
"data": {
"id": "d367becf-a87f-50d1-9472-75a236df7c55",
"type": "order_fulfillments",
"attributes": {
"order_id": "9b663279-e4ef-4838-aece-7e3283232bf6"
},
"relationships": {
"changed_stock_item_plannings": {
"data": [
{
"type": "stock_item_plannings",
"id": "9e56f498-4270-4453-bdc8-78b058e35cd2"
}
]
}
}
},
"included": [
{
"id": "9e56f498-4270-4453-bdc8-78b058e35cd2",
"type": "stock_item_plannings",
"attributes": {
"created_at": "2024-11-18T09:27:56.876322+00:00",
"updated_at": "2024-11-18T09:27:56.964097+00:00",
"archived": true,
"archived_at": "2024-11-18T09:27:56.959152+00:00",
"reserved": false,
"started": false,
"stopped": false,
"stock_item_id": "ea6611f3-b349-4780-b92a-3f5c2413a10a",
"planning_id": "f7ad858d-ffbe-4bf0-a2f3-52356b20ae46",
"order_id": "9b663279-e4ef-4838-aece-7e3283232bf6"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
POST /api/boomerang/order_fulfillments
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=order,changed_lines,changed_plannings |
fields[] |
Array List of comma seperated fields to include ?fields[order_fulfillments]=order_id |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][actions][] |
Array Array of actions to be performed. The actions are executed atomically, and succeed as a whole, or fail as a whole. |
data[attributes][confirm_shortage] |
Boolean A value of true overrides shortage warnings when booking products on a reserved or started Order. |
data[attributes][order_id] |
Uuid Associated Order |
Includes
This request accepts the following includes:
order
=>
tax_values
transfers
changed_lines
=>
item
=>
photo
changed_plannings
changed_stock_item_plannings
=>
stock_item
Start
Start a Product:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_fulfillments",
"attributes": {
"order_id": "e237b7d0-e4aa-4938-b499-569cd1b34f90",
"confirm_shortage": null,
"actions": [
{
"action": "start_product",
"product_id": "03b942d0-3110-4389-9c42-21e4fb8dab97",
"planning_id": "67eb091e-ed37-478c-9bbb-033405044233",
"quantity": 1
}
]
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "80efffab-5588-57ef-b3fe-e16d15853c15",
"type": "order_fulfillments",
"attributes": {
"order_id": "e237b7d0-e4aa-4938-b499-569cd1b34f90"
},
"relationships": {}
},
"meta": {}
}
Start StockItems:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_fulfillments",
"attributes": {
"order_id": "1c4d2e94-624c-484b-b9a1-b1afad281011",
"confirm_shortage": null,
"actions": [
{
"action": "start_stock_items",
"product_id": "9848f419-e43e-4e4d-b8a7-864d2fea24a3",
"planning_id": "a712dd47-5415-48e9-8524-eacd52f57812",
"stock_item_ids": [
"f1648a87-e6b4-4333-8184-1f7071dd49c9"
]
}
]
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "3cd750ea-f755-5d08-b2a7-2c099c1640f1",
"type": "order_fulfillments",
"attributes": {
"order_id": "1c4d2e94-624c-484b-b9a1-b1afad281011"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/order_fulfillments
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=order,changed_lines,changed_plannings |
fields[] |
Array List of comma seperated fields to include ?fields[order_fulfillments]=order_id |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][actions][] |
Array Array of actions to be performed. The actions are executed atomically, and succeed as a whole, or fail as a whole. |
data[attributes][confirm_shortage] |
Boolean A value of true overrides shortage warnings when booking products on a reserved or started Order. |
data[attributes][order_id] |
Uuid Associated Order |
Includes
This request accepts the following includes:
order
=>
tax_values
transfers
changed_lines
=>
item
=>
photo
changed_plannings
changed_stock_item_plannings
=>
stock_item
Stop
Stop a Product:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_fulfillments",
"attributes": {
"order_id": "a5695ad7-cfe3-4f21-aeae-8e33cfa78f0c",
"actions": [
{
"action": "stop_product",
"product_id": "7feb1a69-0ff3-427f-80fb-8a22f84f21da",
"planning_id": "57e857de-a627-43dc-af7b-a66507e09ab6",
"quantity": 1
}
]
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "7d711c5f-ddd8-515c-8ba4-3810b51012b3",
"type": "order_fulfillments",
"attributes": {
"order_id": "a5695ad7-cfe3-4f21-aeae-8e33cfa78f0c"
},
"relationships": {}
},
"meta": {}
}
Stop StockItems:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_fulfillments",
"attributes": {
"order_id": "24810d9d-801b-4082-98ed-670011032dc2",
"actions": [
{
"action": "stop_stock_items",
"product_id": "e6086221-323e-42b5-8105-5a9fb9f9b22d",
"planning_id": "d62305ce-177a-4460-89f0-eedb7bf8056c",
"stock_item_ids": [
"82720a78-2f7c-4cfc-9a74-197b17a0dd6e"
]
}
]
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "6c0fac2d-0946-5adb-abf3-17366f541d9d",
"type": "order_fulfillments",
"attributes": {
"order_id": "24810d9d-801b-4082-98ed-670011032dc2"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/order_fulfillments
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=order,changed_lines,changed_plannings |
fields[] |
Array List of comma seperated fields to include ?fields[order_fulfillments]=order_id |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][actions][] |
Array Array of actions to be performed. The actions are executed atomically, and succeed as a whole, or fail as a whole. |
data[attributes][confirm_shortage] |
Boolean A value of true overrides shortage warnings when booking products on a reserved or started Order. |
data[attributes][order_id] |
Uuid Associated Order |
Includes
This request accepts the following includes:
order
=>
tax_values
transfers
changed_lines
=>
item
=>
photo
changed_plannings
changed_stock_item_plannings
=>
stock_item
Order price recalculations
When the rental period of an order is changed, the prices of individual lines and the total price of the order are not automatically recalculated to preserve any manual changes that may have been made.
The OrderPriceRecalculation
resource allows to request a recalculation for the
entire order and all its lines.
To recalculate the price of an individual line, set the charge_length
of the
line to null
as described here.
Fields
Every order price recalculation has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
order_id |
Uuid Order that needs to be recalculated. |
Relationships
Order price recalculations have the following relationships:
Name | Description |
---|---|
order |
Orders Associated Order |
Recalculate prices
Recalculate prices when rental period has changed:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_price_recalculations' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_price_recalculations",
"attributes": {
"order_id": "c36adc94-1c8a-4ec4-a76b-49e4801d876f"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "2586ac35-c76c-5abb-8609-0574b51a15a3",
"type": "order_price_recalculations",
"attributes": {
"order_id": "c36adc94-1c8a-4ec4-a76b-49e4801d876f"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/order_price_recalculations
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=order |
fields[] |
Array List of comma seperated fields to include ?fields[order_price_recalculations]=order_id |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][order_id] |
Uuid Order that needs to be recalculated. |
Includes
This request accepts the following includes:
order
=>
lines
tax_values
Order status transitions
Transitions the status of an Order
to another status.
See Order
for a desciption of the different statuses.
Note that you can not transition to started
or to stopped
.
The Order
will transition to those statuses automatically when
starting or stopping items through the Fulfillment API.
It is however possible to revert to the started
or the stopped
status.
Errors
When the Order can not be transitioned, and error.code
is items_not_available
,
then the error.meta.blocking.*.reason
or error.meta.warning.*.reason
attribute contains one of the following reasons:
stock_item_specified
One or more of theStockItems
on thisOrder
have also been planned for other current or futureOrders
. The Product is specified in theerror.meta.blocking.*.item_id
attribute anderror.meta.blocking.*.unavailable
contains the problematic StockItems.shortage
A shortage would be created for one or more of theProducts
on thisOrder
. When the shortages would within the shortage limits of the products, a warning is returned. Otherwise a blocking error is returned. When reserving an Order, a warning can be overriden by settingconfirm_shortage
totrue
. The Product is specified in theerror.meta.warning.*.item_id
orerror.meta.blocking.*.item_id
attribute.
Note that is is possible to get multiple warnings and errors of different types at the same time.
Permissions
- Canceling an Order requires the
cancel_orders
permission. - Reverting an Order requires the
revert_orders
permission.
Fields
Every order status transition has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
order_id |
Uuid ID of the Order. |
transition_from |
String_enum The current status of the Order. One of: new , concept , reserved , started , stopped , archived , canceled . |
transition_to |
String_enum The new status of the Order. One of: concept , reserved , started , stopped , archived , canceled .It is only possible to transition to started or stopped in combination with revert: true . |
revert |
Boolean Indicates if this transition reverts the Order back to an earlier status. "Earlier status" does not require this specific Order to ever have been in that status (e.g. concept can have been skipped). "Earlier" means earlier in the conceptual progressing of statuses of Orders in general. |
confirm_shortage |
Boolean A value of true overrides shortage warnings. This is only possible when reserving an Order. |
Relationships
Order status transitions have the following relationships:
Name | Description |
---|---|
order |
Orders readonly Associated Order |
Transition
Save a new Order as concept:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_status_transitions",
"attributes": {
"order_id": "062d48ee-e5e3-42ca-87c7-966a87a52f03",
"transition_from": "new",
"transition_to": "concept",
"confirm_shortage": null,
"revert": null
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "e875a5cd-98ef-588a-819d-39cf925fca00",
"type": "order_status_transitions",
"attributes": {
"order_id": "062d48ee-e5e3-42ca-87c7-966a87a52f03",
"transition_from": "new",
"transition_to": "concept",
"revert": null,
"confirm_shortage": null
},
"relationships": {}
},
"meta": {}
}
Reserve a concept Order:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_status_transitions",
"attributes": {
"order_id": "79726d30-269c-4799-a5d7-9e93ded09935",
"transition_from": "concept",
"transition_to": "reserved",
"confirm_shortage": null,
"revert": null
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "6a328b9a-b04a-5806-b364-036a3c3e3077",
"type": "order_status_transitions",
"attributes": {
"order_id": "79726d30-269c-4799-a5d7-9e93ded09935",
"transition_from": "concept",
"transition_to": "reserved",
"revert": null,
"confirm_shortage": null
},
"relationships": {}
},
"meta": {}
}
Reserve a concept Order, causing a blocking shortage error:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_status_transitions",
"attributes": {
"order_id": "d836fc98-b6e9-4a16-9e79-22bb6b9ae252",
"transition_from": "concept",
"transition_to": "reserved",
"confirm_shortage": null,
"revert": null
}
}
}'
A 422 status response looks like this:
{
"errors": [
{
"code": "items_not_available",
"status": "422",
"title": "Items not available",
"detail": "One or more items are not available",
"meta": {
"warning": [],
"blocking": [
{
"reason": "shortage",
"item_id": "20efa979-146b-448f-9e6b-c48c38694879",
"stock_count": 1,
"reserved": 0,
"needed": 2,
"shortage": 1
}
]
}
}
]
}
Reserve a concept Order, causing a shortage warning:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_status_transitions",
"attributes": {
"order_id": "76c36597-9b67-4da5-a639-2727ea7f66c5",
"transition_from": "concept",
"transition_to": "reserved",
"confirm_shortage": null,
"revert": null
}
}
}'
A 422 status response looks like this:
{
"errors": [
{
"code": "items_not_available",
"status": "422",
"title": "Items not available",
"detail": "One or more items are not available",
"meta": {
"warning": [
{
"reason": "shortage",
"item_id": "5b69fe36-f938-4883-b415-fdb42b087c48",
"stock_count": 1,
"reserved": 0,
"needed": 2,
"shortage": 1
}
],
"blocking": []
}
}
]
}
Reserve a concept Order, and override the shortage warning:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_status_transitions",
"attributes": {
"order_id": "5e64bc27-b045-477a-bfee-54b96874988d",
"transition_from": "concept",
"transition_to": "reserved",
"confirm_shortage": true,
"revert": null
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "4bad6f1b-83fc-5506-a995-09ebe2c7623b",
"type": "order_status_transitions",
"attributes": {
"order_id": "5e64bc27-b045-477a-bfee-54b96874988d",
"transition_from": "concept",
"transition_to": "reserved",
"revert": null,
"confirm_shortage": true
},
"relationships": {}
},
"meta": {}
}
Reserve a concept Order, causing a stock item specified error:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_status_transitions",
"attributes": {
"order_id": "e131b39c-51f7-4fb9-9938-50dd9c24bdf5",
"transition_from": "concept",
"transition_to": "reserved",
"confirm_shortage": null,
"revert": null
}
}
}'
A 422 status response looks like this:
{
"errors": [
{
"code": "stock_item_specified",
"status": "422",
"title": "Stock item specified",
"detail": "One or more items are not available",
"meta": {
"warning": [],
"blocking": [
{
"reason": "stock_item_specified",
"item_id": "a8b7951c-9fbc-477d-9b6e-4a9cb9e8db66",
"unavailable": [
"39909245-78ba-4fa0-8d30-8fd34fac395f"
],
"available": [
"f4c1a1c4-a05e-4ba9-aa8b-629e42973267"
]
}
]
}
}
]
}
Archive a reserved Order:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_status_transitions",
"attributes": {
"order_id": "34d4af9e-2b36-49d1-b54f-a55497c3fa68",
"transition_from": "reserved",
"transition_to": "archived",
"confirm_shortage": null,
"revert": null
}
}
}'
A 422 status response looks like this:
{
"errors": [
{
"code": "wrong_status",
"status": "422",
"title": "Wrong status",
"detail": "Can't transition order from 'reserved' to 'archived'",
"meta": null
}
]
}
Archive a stopped Order:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_status_transitions",
"attributes": {
"order_id": "49525c52-0820-4f1f-9b40-04af56dbd4e8",
"transition_from": "stopped",
"transition_to": "archived",
"confirm_shortage": null,
"revert": null
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "4bc82b33-e841-5bcf-883c-d514e6f4b42b",
"type": "order_status_transitions",
"attributes": {
"order_id": "49525c52-0820-4f1f-9b40-04af56dbd4e8",
"transition_from": "stopped",
"transition_to": "archived",
"revert": null,
"confirm_shortage": null
},
"relationships": {}
},
"meta": {}
}
Revert a reserved Order to 'concept':
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "order_status_transitions",
"attributes": {
"order_id": "d6899402-4d96-41b8-9dfb-f7ea0d577e6a",
"transition_from": "reserved",
"transition_to": "concept",
"confirm_shortage": null,
"revert": true
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "30b8b5e8-f2c2-5253-b295-033a1f2bf974",
"type": "order_status_transitions",
"attributes": {
"order_id": "d6899402-4d96-41b8-9dfb-f7ea0d577e6a",
"transition_from": "reserved",
"transition_to": "concept",
"revert": true,
"confirm_shortage": null
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/order_status_transitions
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=order |
fields[] |
Array List of comma seperated fields to include ?fields[order_status_transitions]=order_id,transition_from,transition_to |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][order_id] |
Uuid ID of the Order. |
data[attributes][transition_from] |
String_enum The current status of the Order. One of: new , concept , reserved , started , stopped , archived , canceled . |
data[attributes][transition_to] |
String_enum The new status of the Order. One of: concept , reserved , started , stopped , archived , canceled .It is only possible to transition to started or stopped in combination with revert: true . |
data[attributes][revert] |
Boolean Indicates if this transition reverts the Order back to an earlier status. "Earlier status" does not require this specific Order to ever have been in that status (e.g. concept can have been skipped). "Earlier" means earlier in the conceptual progressing of statuses of Orders in general. |
data[attributes][confirm_shortage] |
Boolean A value of true overrides shortage warnings. This is only possible when reserving an Order. |
Includes
This request accepts the following includes:
order
=>
plannings
stock_item_plannings
Payment methods
Re-usable payment methods stored on file.
Endpoints
GET /api/boomerang/payment_methods
POST /api/boomerang/payment_methods
DELETE /api/boomerang/payment_methods/{id}
Fields
Every payment method 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 |
label |
String Label of the payment method |
provider |
String Provider of the payment method. Can be one of stripe , app , none |
identifier |
String Provider identifier of the payment method |
method_type |
String Provider method type |
details |
Hash Method details |
customer_id |
Uuid Associated Customer |
Relationships
Payment methods have the following relationships:
Name | Description |
---|---|
customer |
Customers readonly Associated Customer |
Listing payment methods
How to fetch a list of payment methods:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/payment_methods' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "374e65b7-b2f3-42fb-a3d7-0eca1ee78910",
"type": "payment_methods",
"attributes": {
"created_at": "2024-11-18T09:24:34.315163+00:00",
"updated_at": "2024-11-18T09:24:34.315163+00:00",
"label": "Visa XXX1234",
"provider": "stripe",
"identifier": "pm_1234567890",
"method_type": null,
"details": {},
"customer_id": "06b7ae81-4a21-491d-ab08-7e42f0a5b361"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/payment_methods
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[payment_methods]=created_at,updated_at,label |
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 |
label |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
provider |
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 |
method_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
customer_id |
Uuid eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request does not accept any includes
Creating a payment method
How to create a payment method:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/payment_methods' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "payment_methods",
"attributes": {
"provider": "stripe",
"identifier": "pm_123",
"customer_id": "a3dbdd3b-7e7e-4e64-82ef-2d973a41bfad",
"label": "Test card"
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "ea0d844f-675d-47d2-9560-b094e3c15ca6",
"type": "payment_methods",
"attributes": {
"created_at": "2024-11-18T09:24:34.909699+00:00",
"updated_at": "2024-11-18T09:24:34.909699+00:00",
"label": "Test card",
"provider": "stripe",
"identifier": "pm_123",
"method_type": null,
"details": {},
"customer_id": "a3dbdd3b-7e7e-4e64-82ef-2d973a41bfad"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/payment_methods
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[payment_methods]=created_at,updated_at,label |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][label] |
String Label of the payment method |
data[attributes][provider] |
String Provider of the payment method. Can be one of stripe , app , none |
data[attributes][identifier] |
String Provider identifier of the payment method |
data[attributes][method_type] |
String Provider method type |
data[attributes][details] |
Hash Method details |
data[attributes][customer_id] |
Uuid Associated Customer |
Includes
This request does not accept any includes
Detach a payment method
How to detach a payment method from customer:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/payment_methods/33c7dedd-c6d3-4962-84c9-5d1c9aed68f2' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "33c7dedd-c6d3-4962-84c9-5d1c9aed68f2",
"type": "payment_methods",
"attributes": {
"created_at": "2024-11-18T09:24:33.810560+00:00",
"updated_at": "2024-11-18T09:24:33.859756+00:00",
"label": "Visa XXX1234",
"provider": "stripe",
"identifier": "pm_1234567890",
"method_type": null,
"details": {},
"customer_id": null
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/payment_methods/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[payment_methods]=created_at,updated_at,label |
Includes
This request does not accept any includes
Photos
Photos are displayed on documents and in the online store to let customers see how products look.
Endpoints
GET /api/boomerang/photos
GET /api/boomerang/photos/{id}
POST /api/boomerang/photos
PUT /api/boomerang/photos/{id}
DELETE /api/boomerang/photos/{id}
Fields
Every photo 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 |
photo_base64 |
String writeonly Base64 encoded photo |
remote_photo_url |
String writeonly Url to an image on the web |
original_url |
String readonly Url to original stored image |
large_url |
String readonly Url to large stored image (max 500x500) |
xlarge_url |
String readonly Url to xlarge stored image (max 2000x2000) |
coordinates |
Hash Focalpoint coordinates ( { x: 10, y: 100 } ). To ensure that a key part of an image stays visible, you can set the image's focal point. The focal point sets the focus of an image, giving you control over where the image is centered. |
preview |
String readonly Base64 encoded preview |
position |
Integer Which position the photo has in the album |
photo |
Carrierwave_file An object describing the photo. |
owner_id |
Uuid ID of its owner |
owner_type |
String The resource type of the owner. One of product_groups , bundles |
Relationships
Photos have the following relationships:
Name | Description |
---|---|
owner |
Product group, Product, Bundle Associated Owner |
Listing photos
How to fetch a list of photos:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/photos' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "1801bd12-16f8-4460-8f32-05993a5546dc",
"type": "photos",
"attributes": {
"created_at": "2024-11-18T09:25:54.192006+00:00",
"updated_at": "2024-11-18T09:25:54.192006+00:00",
"original_url": "/uploads/0cb126eba1b79a852db0cbfa01d5554e/photo/photo/1801bd12-16f8-4460-8f32-05993a5546dc/1731921954-541902778079392-0003-5651/upload.png",
"large_url": "/uploads/0cb126eba1b79a852db0cbfa01d5554e/photo/photo/1801bd12-16f8-4460-8f32-05993a5546dc/large_1731921954-541902778079392-0003-5651/upload.jpg",
"xlarge_url": "/uploads/0cb126eba1b79a852db0cbfa01d5554e/photo/photo/1801bd12-16f8-4460-8f32-05993a5546dc/xlarge_1731921954-541902778079392-0003-5651/upload.jpg",
"coordinates": {
"x": "0.00",
"y": "0.00"
},
"preview": "iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABcVBMVEX///7+///////+//7//v///v7+/v7+/v/9/v73/f78/v7Z8v6H2/1g1/184v3P9f74+/602v5XuP01tvwvvvwoxfw80f2b6v7z/P7t8f6Zu/5VnP5Jof1Eqf0+sf03ufwvwPwtyf1x3v3h+P7k5f+Pnf9ihP5cjP5Wlf5PnP5Io/5Cq/08s/01u/wswvxY1P3S9P7k3P6Nf/JlYtxbZMxVachPb8xTgNxem/VRoP5FpP1Arf06tfwxvPxPzf3M8f7p4PmMadRgQ69YR6NSSaBQT6F1fLe7w93g6PfD2v57s/5NoP1Ep/0/r/1Uyf3Z8/76+PygechlM6RiOaJcPKFpVKutp9Lw8Pfy9v6szf5fpP5IoP1Dqf06sP13zv32/P7p3fF8OqtqKKFsNaWRcL7a0ur9/f7X5v6CtP5Rnv1Fov1NsP3a7/728fmtfsmcZ7/JsN328vn09/681f6Ctv6Ow/7v9/78+v37+fz6+/76/P7k06ScAAAAAWJLR0QCZgt8ZAAAAAd0SU1FB+gLEgkZNuBomkQAAAGRSURBVCjPNVIHVxYxENzb7F4+sCHNLk1RQVFQ7A1EARvYKKIiKNiwUKy/3pm9j7x395JMMmU3IlIUWiiGiKRCTS2JcKlAMDAXF3ETKZMkNyPKS/hwXLEhKblLhWigwelSp01g45XALOOCePxJTigQEDikcs4k9gpNajEVSinVchbhHIcKbNcaGsOtukMwTDCHljt27tq9p4Z8iRwW7KpZm/Y2t7S2te/brwDIKhFW5cDBQ4ePHO3o7OruqZzm0BU5drz3xMlTff2nzwycPUcPtCBZdHDo/IXhi5cuX7l67fqNm7dUk9FS1tsjo3fG7t4bn5i8/+Dho5bHU5pCR6efPH32/MXMLFZz8y8XXr1+swgLzPN2afnd+5XVUK59+Pjp85c11IrI12/ff6xXYc10Y3Pr5y+VMrz9/lPSOQsCgfLvP8Ylgqge3o2xWQ/84FjQJ60KrznXG1bgrOl287TeXq4Zx6LmxfZZIJDyDB3ja8laJuzyFURP8GpgghUnJRZsH42HHalaCwQ1dDbWLfF9+H+O8CGkTfhjrQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNC0xMS0xOFQwOToyNTo1NCswMDowMJNySPoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjQtMTEtMThUMDk6MjU6NTQrMDA6MDDiL/BGAAAAAElFTkSuQmCC",
"position": 1,
"photo": {
"url": "/uploads/0cb126eba1b79a852db0cbfa01d5554e/photo/photo/1801bd12-16f8-4460-8f32-05993a5546dc/1731921954-541902778079392-0003-5651/upload.png"
},
"owner_id": "0c777599-0a6f-4441-a3a4-4e8f776c9489",
"owner_type": "product_groups"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/photos
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[photos]=created_at,updated_at,original_url |
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 |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request does not accept any includes
Fetching a photo
How to fetch a photo:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/photos/268b2480-32ea-4227-8a20-1def794ec348' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "268b2480-32ea-4227-8a20-1def794ec348",
"type": "photos",
"attributes": {
"created_at": "2024-11-18T09:25:56.279425+00:00",
"updated_at": "2024-11-18T09:25:56.279425+00:00",
"original_url": "/uploads/1d8cca8995fee2a3b4465cc368565740/photo/photo/268b2480-32ea-4227-8a20-1def794ec348/1731921956-354040716446413-0006-3021/upload.png",
"large_url": "/uploads/1d8cca8995fee2a3b4465cc368565740/photo/photo/268b2480-32ea-4227-8a20-1def794ec348/large_1731921956-354040716446413-0006-3021/upload.jpg",
"xlarge_url": "/uploads/1d8cca8995fee2a3b4465cc368565740/photo/photo/268b2480-32ea-4227-8a20-1def794ec348/xlarge_1731921956-354040716446413-0006-3021/upload.jpg",
"coordinates": {
"x": "0.00",
"y": "0.00"
},
"preview": "iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABcVBMVEX///7+///////+//7//v///v7+/v7+/v/9/v73/f78/v7Z8v6H2/1g1/184v3P9f74+/602v5XuP01tvwvvvwoxfw80f2b6v7z/P7t8f6Zu/5VnP5Jof1Eqf0+sf03ufwvwPwtyf1x3v3h+P7k5f+Pnf9ihP5cjP5Wlf5PnP5Io/5Cq/08s/01u/wswvxY1P3S9P7k3P6Nf/JlYtxbZMxVachPb8xTgNxem/VRoP5FpP1Arf06tfwxvPxPzf3M8f7p4PmMadRgQ69YR6NSSaBQT6F1fLe7w93g6PfD2v57s/5NoP1Ep/0/r/1Uyf3Z8/76+PygechlM6RiOaJcPKFpVKutp9Lw8Pfy9v6szf5fpP5IoP1Dqf06sP13zv32/P7p3fF8OqtqKKFsNaWRcL7a0ur9/f7X5v6CtP5Rnv1Fov1NsP3a7/728fmtfsmcZ7/JsN328vn09/681f6Ctv6Ow/7v9/78+v37+fz6+/76/P7k06ScAAAAAWJLR0QCZgt8ZAAAAAd0SU1FB+gLEgkZOAfQt0MAAAGRSURBVCjPNVIHVxYxENzb7F4+sCHNLk1RQVFQ7A1EARvYKKIiKNiwUKy/3pm9j7x395JMMmU3IlIUWiiGiKRCTS2JcKlAMDAXF3ETKZMkNyPKS/hwXLEhKblLhWigwelSp01g45XALOOCePxJTigQEDikcs4k9gpNajEVSinVchbhHIcKbNcaGsOtukMwTDCHljt27tq9p4Z8iRwW7KpZm/Y2t7S2te/brwDIKhFW5cDBQ4ePHO3o7OruqZzm0BU5drz3xMlTff2nzwycPUcPtCBZdHDo/IXhi5cuX7l67fqNm7dUk9FS1tsjo3fG7t4bn5i8/+Dho5bHU5pCR6efPH32/MXMLFZz8y8XXr1+swgLzPN2afnd+5XVUK59+Pjp85c11IrI12/ff6xXYc10Y3Pr5y+VMrz9/lPSOQsCgfLvP8Ylgqge3o2xWQ/84FjQJ60KrznXG1bgrOl287TeXq4Zx6LmxfZZIJDyDB3ja8laJuzyFURP8GpgghUnJRZsH42HHalaCwQ1dDbWLfF9+H+O8CGkTfhjrQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNC0xMS0xOFQwOToyNTo1NiswMDowMATtWdMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjQtMTEtMThUMDk6MjU6NTYrMDA6MDB1sOFvAAAAAElFTkSuQmCC",
"position": 1,
"photo": {
"url": "/uploads/1d8cca8995fee2a3b4465cc368565740/photo/photo/268b2480-32ea-4227-8a20-1def794ec348/1731921956-354040716446413-0006-3021/upload.png"
},
"owner_id": "77465390-cba4-4567-82b0-2431558b73c5",
"owner_type": "product_groups"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/photos/{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[photos]=created_at,updated_at,original_url |
Includes
This request accepts the following includes:
owner
Creating a photo
How to create a photo:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/photos' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "photos",
"attributes": {
"owner_id": "3b5f0cad-cf1e-4e10-8cfe-910dc456e305",
"owner_type": "product_groups",
"photo_base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAAAXNSR0IArs4c6QAAFwJJREFUeF7tnX+MHsV5x5+9s7mzTXxnjO/8C2N+2wcGwgW3wY1rkahNRBJRIVCSNlEihJQgJY3SSqWNhCr1HyI1ilI1IqRKFJQmVSE/SgiYmIRE/lXXmACWsR0w4J/x+cfhc2zOd7bvtnrefed9Z+ed3Z2dndmd3X3uH8zd7uzM93k+8zzPzLz7er7v+0A/pAApIFXAI0DIM0iBaAUIEOe9AwO81+hl+1/hfxsbAv8AY42WuyECpNz2o95bVoAAsSwwNV9uBRQBodhbbjNT73UVUAREt3m6r1YKVHAezQ2QCmpXK9+3M9g0XpHmWnO9zQ0QcRXG3BCoJVLAngK5AmJvGC63rDPz6dzjsgbl7VtpASEXKo/TldlWpQVEzz3KbCpxxFUai7o18x51zQBRNwRdWTMFIsgjQGrmB2rDzXueVutV6qsMnM0hQFKrTjfEK1AiuBS6SoBU1d8VjF/VoZscFwFiUs2ktshpkxRy7u+FA0I+45xPWOlQWe1cOCBWrCE0Wlbj5KGNW8/QtZTufcmjrwUgyTLQFfoKhJ0z+D9bDmur3ejREyD6nkF35qVA/ly0RkaA5GVkek4pFSBASmk2hU4XOOsq9I67xO2OEiDprElX10wBAqRmBqfhplOg1oC4HdzTGZKutqNArQGxIym1WiUFCJAqWbNSY3EjvhMgCk7lhqkUOkqXGFeAADEuKTXoigImJjYCxBVrUj8MKmACjaA7BIhBsyQ1Zc5sSU9y9e/lU4AAcdWXqF9OKECAOGEGW50o34xtSwnddgkQXeXovlooQIDUwsw4yDJHk+L6ToCkBKQ4U7GOFt+DlJKV+vLcACGzuugnEVYhY7WMlRsgLroH9YkUSFKAAElSKOvfVWZjlWuy9sP0/WXss4YGBIiGaHRLfRQgQOpjaxqphgIEiIZoxd+Sb36T79OKV5fvAQHilj0q05vyQBXfUwKkSJdM5UWpLi5yVJV6NgFSKXPSYEwrQICYVpTaq5QCAiAUxitlXRpMZgUogmSWkBpwUgFDcz0B4qR1qVOuKFAwIIYwL0RNB/vuYJeMmKbAcRUMiBH5OhspUFBLI6JmC1KgmoDoiklg6SpX2fsIkMqalgZmYr4jQMiPSIEYBQiQWPcwMQeR/5VZAScBIbcss0tVq+9OAlItiVVGQ1OCikpFXEOA5Ko6gZBabuuS0XH31DahG0gBpkCtIoj1yYj8ypIChiyn0UytALFkPWq2wgoQIBU2Lg0tuwIESHYNrbWgkRFY60tdGyZA6mp5GreSAnJAaOpSEi/rRaMXAc5OAxyY8OGE78GJCRQ++FnQ68F1PQB9XQCXdgHMn5H1aVnur69DUATJ4jcp70UgjlwE2Hrah33jAPsnAXaN+3BxBsCMi+3G8P/xZ94sr/HfoV6A63sAVvR48L5ZAFdekvLBjl5eBuwcBqQM8ql5HoKx6R2AF0d9+Om4D11TnfdNdwe/8wMmGtCIPwyYu/sAPtALsHZu82K1btBVUQrEuJrDgJTZnoHiPBjPjLbTpynO+ae72uMUIYkChUUXBOVjcz24uVdfq+pMQ/oaxN1ZGUBcM/T2UYCnjvuw/kQbDDQED4QqKLJowoyKUeUz8wA+1e8VXKekcVDXrBXd98oAksY8Nq/FqPH0YYB/OzgNM8/LgeAhwb4wUMTfq6RdLJpgnfLxuR7c02dzdPVrmwAxaHOMGj/c78O2Uz50TbfhUAVCBopO2vU3/V5lCnmD5tFqigDRki18UyNq7AN49PA0zLgQ/I05Np9WqaRXptKuhwY8WDen6OXhcn91KNouDIix1NBYQwbc124TGDV+useHLafbtYas8Ga/i4ompusTrE2wiKdoks3+FEE09TtzDuAnBwD+4+1puGSy3cjFmdyqlGSFKgkUVYDS1CcYTWpTmxiem6sLiGGheI5Y1NjOrVCx/Qu8LgoSPvWSgRKVXkUV8vL6pHPg+UcTi+JrTmi6t2UHpDpaJGrIosaLbwK8Pj4dup45twoouvWJKihRy8Jr5nlwfx9tMCYamrsgOyBpnlbia98YAfjuPh9ePuKD16TA9/zwvgamV81SJA0oeaZd5dw3Kc5xCBAF7X/7NsCTuwHeHuMK8dbRkDAk/CyP/24dHeFqE7EgZxHFJCghQIVjKwgJ7pv83YJsu/AK0pX+EgIkxoSYUv1mD8C39/jQ3Tw/hY4nPx4SDQrvrHE1SlZQZP0KQSoBRbWAr1EmHfIIAiQCEEypfvYSwJbjsqgR3KQCCl9466Rd4nOyFvJifcIK+M9fVqajKvkFJgJEovWmPQBPvOjDkfPBH6OjhhySRprVHT6DlRUU1eVf3Y1GLOAp5ep0BgKE0wRTqh+/BPD0Xh+6m5/PEB076vStSjTh65O80i4+AvGrZ7Jj9RhNVFOu/ObwYp9EgDT1ZynVSweCmT9uxk4bUcTVrihQ+P2TNIW8ybSLUq4wkAQIALCUanQsEEfF4eIgca0+0Um7KOUKfKHWgLCU6rmdfuu4yFRz+TYOFFtpF6t32ByW9diKaoEfdWwFo8nXB2u2sSgs19UWEEypNmwH2PZmUG/wTs9DwoOSV9rFg6Kbdqn0W/b5E3H/pO51iWFAyrFavns/wE82+vDmsXC+yUMSrETJ/x4FCnOu1oYfd3/W/RPVaKIaNaIAivr8yecWelDHpWDDgBS74qDy9B2/A/jx/wKMNnfFL0jeEBIHilZ9gqd6vfauusqKl4vLwne/x4MvLqnOh7FUpvPaAIL1xgvbAH62w4eeic5VKlOglKU+Ud1XESPKTbM9eHh5fY6oOA6ICuPJcePsyQl4fGsv7HwVDxoG14vpEGtFBCVr2sWeZWP/JK/6RNw/QUg+uagenzFxHJCGewX5iebPyRGARzf4cGS/vAGxNsCrTEUTPs+XPYefnfNIu1TrE5VlYTyy8veDHnx+UN82mibN9bYSAKKvx943AL6/AeDc4faxj8lZne2pRhNx6Vcs5LXqE+6FcdGHDYVj9dyhQ53zXarpVRIoF2YGkNw7v7rnuCoLCBbj658HGD3lt9IpHg2ToEStdsXN2CZ34/mUEf+tuuKV5W0rjbF1B6nqR+d58I9XVBOSBECypTf6c7/+nawYf2FDu94QHYi1LoMkqj5Jm3bx0SZuWRgTlKmItyuqpF1iGscrpwOKShQU+8UgcXaFK4MbVyqCIBxbfwOwfqPfeGmbrJ4QDwniNSajiZh2qYAi3iMWxVlAkUHSgJLbozH1+fgb51RjhYvnqTKAND7c9AzApq3hY+ZsRhUjQN6gqMzMadOuINq5VZ+snFsNSJjflBiQNue4jLv+2V7Y/ooPMycBLvREp2g8KKqQsNZ0VrwKqU+8doSIKuLF+ijrpxn59hCSLy2uxhmuEgMSuC0u4z73pA+793ZCoQqKrEaJSrvEekKWxrGeuHS+S2W1ixXevLPrFvJVgaTUgDA49u0EOB/xpTIqkIyPH2n49MTkaIuyc+dPSsPQuXNHoWtgWftvPsDM7tmt/7+kb0nr3zP6F3a0oXJamK9botIuBrVKfaJ7bCUKlKh0Ufx9FSApLSAIx4bHfXh9X9gHo0BpzPTN1Ovddw/BWTgF3ul3YHzWNEydOhp6ly5eK+5Sy6IMe7LsWvxbT38AkndpP8yeuaDxb4Qmj7Qr6G8+9UlclJnsBfjecq+0X/ZTICD6a29RcPCo8KCcHzsIZ7vPwrnzx2H83SBahFZxhFO7fDtRzi+rX6Kuneqahu6mF4nQePPbUUZlZk5byKt+mlGcFGSRSfe1RFj3fefackJSICDSDCbxlwyOA7sAcHaK+jk73oZi8o9HOmdtCRT88qrYriooUdex9hAW/mf23OWtCDM9GE7J4vZP4l7xo5J2iWlcVDSUHd3XWRbOBxL9STfKj0oFCA+HOCAGCwPjzMjLoQ9BiVGj5bAGQEkTTRr9ECBhfWGw9C5dFRqeKih4E9vdbvxbugFpNu0SnxMXBW1CEqBRRkAM9TkJDgTjxNRbcPGdZgoV8bXJYv4fBU5cNBHTEebNOqAsW3wZXLmkHxYtmAODl89pgXFwrBfO9SyDQ6M+HD8b/Jp3ePvH6gPDJe7G466j8DI9PjqJfUZInhjqyvS9iolphsELrEYQQ2wA7nP8z3/1wKHtnSMfnT4I7xza1FjF8rkZkzeSTK+8QeGhWrK0H/701iVw4zUL4OahpfAeyQFKvB43P0dOA+z5A8DeowDbjgYnBPIAxeb+ybWXl2cz0SogJkBGJ9nxI4CXn223NjnbhzMnX4N3/VMwNnmgo75wARTZe6/W3LIMbnnvQrjz/ddHQhGl2ZkJgEMjAP93GOB3b/kwMh6+Uny7vO3Pn8QV8WK0k0UUhOTrV7v/6UTnAdn+BMDm/247w/mJE3B0ai+cGQ+DIYsIqqDI7tVJvWQFOqYUCMYH110dGy3STCb4wonN+zpBUU27rNcnCWkXe/5d8z34ynXyU8Cmso80usqubQLiSnfCXdz9PMBz327/7uT4Ljhx+lWYmhGct4pMk7jhiJDEpV6qaVfDwDFLwyydWn27WTBEA2YFJaqIT6p3WD8S65Nmyhu3T/KhJR7861XufujK2QiCn+fY/S2Ak2MAfNQQnUTVqVWjSSx4wsOjILnuhgH4sw8t10qldGY8fEvLL14LahT2ylRxIjC6f4KNN30668d+EZ4vL+2Czy7XGbn9e5wEBFesNn4NYP/BAI6DxzbAxGz5KV0mUZGgsIiCYAwPLYSPfvh6uPTymE0aC3bFWu2V/cFLt+Pqk6z7J600Dt/Swo1DNZrIohOmod8acnMj0TlAcMXq59/tgZHtHmBKdXLs1Y5PBLIUS+ZnuYPiA0zPALjtjmXw4F+vhcs7j19ZwCG6Sfa2yKRCXkx72P5JER/7Reg+MMeDr6xyr2h3DhAsyl94/AT8cfpYAw7+R1wZCoHC1R2qRbeJtOuaoQG4+54hYwW4KZpY2vXiofivYQgBwb2/S2WTUZbG6dYnCMlHFkQX7Um62KqinQLk9S0jsO17C2HHjh+2NqhUDg1GRRQb0YTVKJgWfOKvbi4knUpyFvZ39g1Zz+8KNhtd3z9BSL60zK16xBlAMLV69pHjsPn5TR0nabNAkqboVokoCN1tty2FtR+/FtYML1X11UKvY1/tgNEET7nIQIl6barsjS/t1xWpfe1cmvoEjwx9Z2UXrJ5fqGSthzsDyKYfvQ1Pfm1r6/yU8rENoVjMWp/IloVZKnHFvD4Y/siVcNc9N6fe6DNr7vQJhelowhYm4k4L4zUqH9QSP82IS79R+yNmdUxuzQlAcNXqsS88A8feGmsAgiuILHNWBSW2PuF0UK1PGsZtruNjn2653XLUSO/zydaVXKESTZhj29iNx7aTIgq+lO6rN3XB3QNaQwxuMqSnE4D8/BuvwK++/1pLDfF1n0qQNKnKAooMnkWDrkSNDM4i3CpGk0Y04M6xqe7Ih+7pbk5swoe0+EI+zfmu1fM9ePiW4t+1VTggfPQQXUALFCGsBwaK3kOJiig4y930/qXwwBfWFb50aw6NcEtx0UR07KhoIsIVVZ/ofOz3H27NGEUMCFc4IGL0kI0pb1AGFlcvakT5io1owtcnSdGJ9UuWdr1voPgoUigguHL1zQd+Daf2jMH5mFf18LMZE1SWdon5bdS1ccvCK9ZWO2pEgSJGkyTHzqM+QWi+Oay4omWo5hD1KRQQ3Pf49wd/3fp+wCRITIIiQjL/ivpEDd1oIupv9HwXd16Rjyb3X9MFn11hIFfSbKJQQDC92vhYuzjHMahAogqK6v7JXX+5Ev78/uHK1hppfSMpmpiuT+IK+TV9Hnx12CtsWb0wQDD3feqhLfDKL+Vf3GEbFDRK39VzHdnXSOvC9q+X1Sam066k9tiE+Y3VimmWBVkKAwTrj8fu+xUcO3w6tMQojtE0KDMuBF+Q8+G7VlDUUHAoFk1eOhBeCcy6LKyyG4/dQ1v9y1AXrLtKobOmLuHqGScAEWcS2ThVQFFZ7Zpzw1x44MHbYdFtC62EbUu1oinTa7WjEk3i0q6GfRO+KChuR/4zK4urQ5wBhFlOPIatE1FEUFio/ti9N8Kdn16R+2c1tLzSwZtktUlSmpRmtQvbkr0NUgcQUxNVGBBTrSoa9z//dgvsXC+vQeJACaIJfyCl84EICX66Dgv1O9Ysh9X3XQPXryn4wxqKurh8Gftg1s43ADZyX21nEhSEhLWHdnxkbQ1rEBQADyg+/c9bI/0hazQZvLof1t47BO/9i0UUNQxTF5V2mQbl2ku74JE7wUo6rCJJYSkWdg6PmTz+qV80CvW4n+RoEr4bwVi1dgnc8clbaelWxQsyXMNeHPHsruCdXSy9VX0bZNK3aX3iVq+++yBoF9wL2fxoeC8kyl5JEWXR4j5Y/sFFtDqVweF1b+U/wci/WTUtKPzm41X9Hnx5GOC6vDNjF1axmCFwufepf9oBr/72gLJtRNEZGKvWLaE6Q1lFwxf6AI2X2x0L3rDCPpzFnpJ2WRiXdx/6Ey/f5V2JJIWmWKw/mGr98uHNqSGZt5JSKcNubqQ5rE8QFPYWSPZuYdX6BOG4b7iI1KpzlcoJQFA4jCQv/GAvvPH04ciaBGchjBaDq+Y1VqUW39BvsPjOeQnPiCsmNBIzpLxGizUKe7cwvohbfCURjoDVLQjGsvke3DsEhUUOURdnAOFTrj/8fgz2bh+BC+NTcO74BMwa6IWBqy6DwStnGYYiDy+lZ6AC7EXcI6cA9o0CnBDWZVYsApg7D2B4YXErVjJLuQFIXtOZs75aTwEQGvyJert9vuaS28ANQPJVgp7mogKOzhEEiIvOQn1yRgEFQBxFW1XCkndfdZh0nR0FFACx82BqlRQogwIESBmsRH0sTIFqAkJpVWEO1X5wNYxQTUAccA/qQl4K2AWRALFmR7uG0+u2i33SG0ledxEgeSlNzymlAoYBoRnKihc4Jqtj3UkteZr+xwCSppnUfaQbSIFSKGA4gpRizNRJUkBZAQJEWaoKXEhJQWojEiCpJavLDTWmyaWP3NbF3Wic5VTAkQhierYy3V7JjFvD4dsasiOAlMwBXemuLa9wZXwO9IMAkRqBPM8B33SiC/kBUrjPFd4BJwxOnUinQH6ApOsXXa2gACGvIFLGSwiQjALS7dVWwCAgNJ9V21XqOTqDgNRTQBp1tRUgQKptXxpdRgUIkIwC0u3VVoAAqbZ9aXQZFSBAMgro8u20bJLFOoF6BEgWDeneyitAgFTexDTALAoQIFnUo3srrwABUnkTmxtgHWsaAsSc/zjRUvFOXHwPwGAXCBAn3Np+Jwz6jP3OWniC7vg7AdFtycKgqElSoGgFKIIUbQF6vr4COUzmBIi+eejOiijQ5qyTODuA5EA22ianx1TEDWgYOgrYAUSnJ3QPKeCgAu4CwoUHihQOek5NuuQuIDUxAA3TbQXqCQiFJCteWUVZPX/a98GzolfJGq2ieUtmgsTuqttI/cr4h9YzgiQagi4gBQIFCBDyBFIgRoFaAhKEX1NBuFNdey2TL+etQPkAqbL3VXlseXu2oeeVDxBDA69XM0Serr0JEF3l6L5aKECA1MLMNMhkBeRRlgBJVq74KyhDKswGdgGpkWFrNNTCnLWIB9sFpIgR0TNJAYMK5AsITbMGTUdN5aFAvoDkMaLaPINmmzxMTYDkoXLaZ5DvSxSzJUp8uzUExJbQaSmg68ugQA0BccEsFYG0IsOI8whv2vf9wj8OUgGhKzAEF2YO5/pAEcQ5k0R0iAgsxFIOA0IeUYhH0ENDCjgMCFnKLQWKm7CKezJ9ojC9DxZprfS9bd5Ryk5rj9bIjU3JKIIYUZMa0VHA9ic7dfok3kOAZFGRJuYs6pXi3v8HOZ5zbDYLrEsAAAAASUVORK5CYII=\n"
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "c308491a-72db-4e58-b630-3fe530466849",
"type": "photos",
"attributes": {
"created_at": "2024-11-18T09:25:57.095549+00:00",
"updated_at": "2024-11-18T09:25:57.095549+00:00",
"original_url": "/uploads/6e174fd006395e4f16100c1b8470dbb0/photo/photo/c308491a-72db-4e58-b630-3fe530466849/1731921956-785262690585583-0008-5380/upload.png",
"large_url": "/uploads/6e174fd006395e4f16100c1b8470dbb0/photo/photo/c308491a-72db-4e58-b630-3fe530466849/large_1731921956-785262690585583-0008-5380/upload.jpg",
"xlarge_url": "/uploads/6e174fd006395e4f16100c1b8470dbb0/photo/photo/c308491a-72db-4e58-b630-3fe530466849/xlarge_1731921956-785262690585583-0008-5380/upload.jpg",
"coordinates": {
"x": 0,
"y": 0
},
"preview": "iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABcVBMVEX///7+///////+//7//v///v7+/v7+/v/9/v73/f78/v7Z8v6H2/1g1/184v3P9f74+/602v5XuP01tvwvvvwoxfw80f2b6v7z/P7t8f6Zu/5VnP5Jof1Eqf0+sf03ufwvwPwtyf1x3v3h+P7k5f+Pnf9ihP5cjP5Wlf5PnP5Io/5Cq/08s/01u/wswvxY1P3S9P7k3P6Nf/JlYtxbZMxVachPb8xTgNxem/VRoP5FpP1Arf06tfwxvPxPzf3M8f7p4PmMadRgQ69YR6NSSaBQT6F1fLe7w93g6PfD2v57s/5NoP1Ep/0/r/1Uyf3Z8/76+PygechlM6RiOaJcPKFpVKutp9Lw8Pfy9v6szf5fpP5IoP1Dqf06sP13zv32/P7p3fF8OqtqKKFsNaWRcL7a0ur9/f7X5v6CtP5Rnv1Fov1NsP3a7/728fmtfsmcZ7/JsN328vn09/681f6Ctv6Ow/7v9/78+v37+fz6+/76/P7k06ScAAAAAWJLR0QCZgt8ZAAAAAd0SU1FB+gLEgkZOXDXh9UAAAGRSURBVCjPNVIHVxYxENzb7F4+sCHNLk1RQVFQ7A1EARvYKKIiKNiwUKy/3pm9j7x395JMMmU3IlIUWiiGiKRCTS2JcKlAMDAXF3ETKZMkNyPKS/hwXLEhKblLhWigwelSp01g45XALOOCePxJTigQEDikcs4k9gpNajEVSinVchbhHIcKbNcaGsOtukMwTDCHljt27tq9p4Z8iRwW7KpZm/Y2t7S2te/brwDIKhFW5cDBQ4ePHO3o7OruqZzm0BU5drz3xMlTff2nzwycPUcPtCBZdHDo/IXhi5cuX7l67fqNm7dUk9FS1tsjo3fG7t4bn5i8/+Dho5bHU5pCR6efPH32/MXMLFZz8y8XXr1+swgLzPN2afnd+5XVUK59+Pjp85c11IrI12/ff6xXYc10Y3Pr5y+VMrz9/lPSOQsCgfLvP8Ylgqge3o2xWQ/84FjQJ60KrznXG1bgrOl287TeXq4Zx6LmxfZZIJDyDB3ja8laJuzyFURP8GpgghUnJRZsH42HHalaCwQ1dDbWLfF9+H+O8CGkTfhjrQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNC0xMS0xOFQwOToyNTo1NiswMDowMATtWdMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjQtMTEtMThUMDk6MjU6NTYrMDA6MDB1sOFvAAAAAElFTkSuQmCC",
"position": 2,
"photo": {
"url": "/uploads/6e174fd006395e4f16100c1b8470dbb0/photo/photo/c308491a-72db-4e58-b630-3fe530466849/1731921956-785262690585583-0008-5380/upload.png"
},
"owner_id": "3b5f0cad-cf1e-4e10-8cfe-910dc456e305",
"owner_type": "product_groups"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/photos
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[photos]=created_at,updated_at,original_url |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][photo_base64] |
String Base64 encoded photo |
data[attributes][remote_photo_url] |
String Url to an image on the web |
data[attributes][coordinates] |
Hash Focalpoint coordinates ( { x: 10, y: 100 } ). To ensure that a key part of an image stays visible, you can set the image's focal point. The focal point sets the focus of an image, giving you control over where the image is centered. |
data[attributes][position] |
Integer Which position the photo has in the album |
data[attributes][photo] |
Carrierwave_file An object describing the photo. |
data[attributes][owner_id] |
Uuid ID of its owner |
data[attributes][owner_type] |
String The resource type of the owner. One of product_groups , bundles |
Includes
This request accepts the following includes:
owner
Updating a photo
How to update a photo:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/photos/4086b95f-a1d1-4df9-ba4f-0cf6d88aebf8' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "4086b95f-a1d1-4df9-ba4f-0cf6d88aebf8",
"type": "photos",
"attributes": {
"coordinates": {
"x": 10,
"y": 100
}
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "4086b95f-a1d1-4df9-ba4f-0cf6d88aebf8",
"type": "photos",
"attributes": {
"created_at": "2024-11-18T09:25:54.860731+00:00",
"updated_at": "2024-11-18T09:25:54.887707+00:00",
"original_url": "/uploads/375787062cd92d7cfe8090f5cab0cf9b/photo/photo/4086b95f-a1d1-4df9-ba4f-0cf6d88aebf8/1731921954-679980257057762-0004-2487/upload.png",
"large_url": "/uploads/375787062cd92d7cfe8090f5cab0cf9b/photo/photo/4086b95f-a1d1-4df9-ba4f-0cf6d88aebf8/large_1731921954-679980257057762-0004-2487/upload.jpg",
"xlarge_url": "/uploads/375787062cd92d7cfe8090f5cab0cf9b/photo/photo/4086b95f-a1d1-4df9-ba4f-0cf6d88aebf8/xlarge_1731921954-679980257057762-0004-2487/upload.jpg",
"coordinates": {
"x": 10,
"y": 100
},
"preview": "iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABcVBMVEX///7+///////+//7//v///v7+/v7+/v/9/v73/f78/v7Z8v6H2/1g1/184v3P9f74+/602v5XuP01tvwvvvwoxfw80f2b6v7z/P7t8f6Zu/5VnP5Jof1Eqf0+sf03ufwvwPwtyf1x3v3h+P7k5f+Pnf9ihP5cjP5Wlf5PnP5Io/5Cq/08s/01u/wswvxY1P3S9P7k3P6Nf/JlYtxbZMxVachPb8xTgNxem/VRoP5FpP1Arf06tfwxvPxPzf3M8f7p4PmMadRgQ69YR6NSSaBQT6F1fLe7w93g6PfD2v57s/5NoP1Ep/0/r/1Uyf3Z8/76+PygechlM6RiOaJcPKFpVKutp9Lw8Pfy9v6szf5fpP5IoP1Dqf06sP13zv32/P7p3fF8OqtqKKFsNaWRcL7a0ur9/f7X5v6CtP5Rnv1Fov1NsP3a7/728fmtfsmcZ7/JsN328vn09/681f6Ctv6Ow/7v9/78+v37+fz6+/76/P7k06ScAAAAAWJLR0QCZgt8ZAAAAAd0SU1FB+gLEgkZNuBomkQAAAGRSURBVCjPNVIHVxYxENzb7F4+sCHNLk1RQVFQ7A1EARvYKKIiKNiwUKy/3pm9j7x395JMMmU3IlIUWiiGiKRCTS2JcKlAMDAXF3ETKZMkNyPKS/hwXLEhKblLhWigwelSp01g45XALOOCePxJTigQEDikcs4k9gpNajEVSinVchbhHIcKbNcaGsOtukMwTDCHljt27tq9p4Z8iRwW7KpZm/Y2t7S2te/brwDIKhFW5cDBQ4ePHO3o7OruqZzm0BU5drz3xMlTff2nzwycPUcPtCBZdHDo/IXhi5cuX7l67fqNm7dUk9FS1tsjo3fG7t4bn5i8/+Dho5bHU5pCR6efPH32/MXMLFZz8y8XXr1+swgLzPN2afnd+5XVUK59+Pjp85c11IrI12/ff6xXYc10Y3Pr5y+VMrz9/lPSOQsCgfLvP8Ylgqge3o2xWQ/84FjQJ60KrznXG1bgrOl287TeXq4Zx6LmxfZZIJDyDB3ja8laJuzyFURP8GpgghUnJRZsH42HHalaCwQ1dDbWLfF9+H+O8CGkTfhjrQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNC0xMS0xOFQwOToyNTo1NCswMDowMJNySPoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjQtMTEtMThUMDk6MjU6NTQrMDA6MDDiL/BGAAAAAElFTkSuQmCC",
"position": 1,
"photo": {
"url": "/uploads/375787062cd92d7cfe8090f5cab0cf9b/photo/photo/4086b95f-a1d1-4df9-ba4f-0cf6d88aebf8/1731921954-679980257057762-0004-2487/upload.png"
},
"owner_id": "c61966ce-155f-42b3-a03e-4f97c2590e36",
"owner_type": "product_groups"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/photos/{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[photos]=created_at,updated_at,original_url |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][photo_base64] |
String Base64 encoded photo |
data[attributes][remote_photo_url] |
String Url to an image on the web |
data[attributes][coordinates] |
Hash Focalpoint coordinates ( { x: 10, y: 100 } ). To ensure that a key part of an image stays visible, you can set the image's focal point. The focal point sets the focus of an image, giving you control over where the image is centered. |
data[attributes][position] |
Integer Which position the photo has in the album |
data[attributes][photo] |
Carrierwave_file An object describing the photo. |
data[attributes][owner_id] |
Uuid ID of its owner |
data[attributes][owner_type] |
String The resource type of the owner. One of product_groups , bundles |
Includes
This request accepts the following includes:
owner
Deleting a photo
How to delete a photo:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/photos/865a2f54-f69d-4315-874f-778ab6b216c6' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "865a2f54-f69d-4315-874f-778ab6b216c6",
"type": "photos",
"attributes": {
"created_at": "2024-11-18T09:25:55.576937+00:00",
"updated_at": "2024-11-18T09:25:55.576937+00:00",
"original_url": "/uploads/3d82c7fce75b080c211b5f57726e4d56/photo/photo/865a2f54-f69d-4315-874f-778ab6b216c6/1731921955-21546757723301-0005-1442/upload.png",
"large_url": "/uploads/3d82c7fce75b080c211b5f57726e4d56/photo/photo/865a2f54-f69d-4315-874f-778ab6b216c6/large_1731921955-21546757723301-0005-1442/upload.jpg",
"xlarge_url": "/uploads/3d82c7fce75b080c211b5f57726e4d56/photo/photo/865a2f54-f69d-4315-874f-778ab6b216c6/xlarge_1731921955-21546757723301-0005-1442/upload.jpg",
"coordinates": {
"x": "0.00",
"y": "0.00"
},
"preview": "iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABcVBMVEX///7+///////+//7//v///v7+/v7+/v/9/v73/f78/v7Z8v6H2/1g1/184v3P9f74+/602v5XuP01tvwvvvwoxfw80f2b6v7z/P7t8f6Zu/5VnP5Jof1Eqf0+sf03ufwvwPwtyf1x3v3h+P7k5f+Pnf9ihP5cjP5Wlf5PnP5Io/5Cq/08s/01u/wswvxY1P3S9P7k3P6Nf/JlYtxbZMxVachPb8xTgNxem/VRoP5FpP1Arf06tfwxvPxPzf3M8f7p4PmMadRgQ69YR6NSSaBQT6F1fLe7w93g6PfD2v57s/5NoP1Ep/0/r/1Uyf3Z8/76+PygechlM6RiOaJcPKFpVKutp9Lw8Pfy9v6szf5fpP5IoP1Dqf06sP13zv32/P7p3fF8OqtqKKFsNaWRcL7a0ur9/f7X5v6CtP5Rnv1Fov1NsP3a7/728fmtfsmcZ7/JsN328vn09/681f6Ctv6Ow/7v9/78+v37+fz6+/76/P7k06ScAAAAAWJLR0QCZgt8ZAAAAAd0SU1FB+gLEgkZN5dvqtIAAAGRSURBVCjPNVIHVxYxENzb7F4+sCHNLk1RQVFQ7A1EARvYKKIiKNiwUKy/3pm9j7x395JMMmU3IlIUWiiGiKRCTS2JcKlAMDAXF3ETKZMkNyPKS/hwXLEhKblLhWigwelSp01g45XALOOCePxJTigQEDikcs4k9gpNajEVSinVchbhHIcKbNcaGsOtukMwTDCHljt27tq9p4Z8iRwW7KpZm/Y2t7S2te/brwDIKhFW5cDBQ4ePHO3o7OruqZzm0BU5drz3xMlTff2nzwycPUcPtCBZdHDo/IXhi5cuX7l67fqNm7dUk9FS1tsjo3fG7t4bn5i8/+Dho5bHU5pCR6efPH32/MXMLFZz8y8XXr1+swgLzPN2afnd+5XVUK59+Pjp85c11IrI12/ff6xXYc10Y3Pr5y+VMrz9/lPSOQsCgfLvP8Ylgqge3o2xWQ/84FjQJ60KrznXG1bgrOl287TeXq4Zx6LmxfZZIJDyDB3ja8laJuzyFURP8GpgghUnJRZsH42HHalaCwQ1dDbWLfF9+H+O8CGkTfhjrQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNC0xMS0xOFQwOToyNTo1NSswMDowMDUFQ04AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjQtMTEtMThUMDk6MjU6NTUrMDA6MDBEWPvyAAAAAElFTkSuQmCC",
"position": 1,
"photo": {
"url": "/uploads/3d82c7fce75b080c211b5f57726e4d56/photo/photo/865a2f54-f69d-4315-874f-778ab6b216c6/1731921955-21546757723301-0005-1442/upload.png"
},
"owner_id": "6936cfab-a2f0-48ab-914e-460cd5c9709c",
"owner_type": "product_groups"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/photos/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[photos]=created_at,updated_at,original_url |
Includes
This request does not accept any includes
Plannings
Plannings contain information about the quantitative planning of an item. An item can either be a product or a bundle. Planning (in combination with Stock counts) define when an item is available during a given period. Plannings are never directly created or updated through their resource; instead, they are always managed by booking items to an order, updating or deleting its associated line, or transitioning status.
Nested plannings contain information about individual items in a bundle. Note that nested plannings can not be deleted directly, the parent line should be deleted instead.
Endpoints
GET /api/boomerang/plannings
POST api/boomerang/plannings/search
GET /api/boomerang/plannings/{id}
Fields
Every planning 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 planning is archived |
archived_at |
Datetime nullable readonly When the planning was archived |
quantity |
Integer readonly Total planned |
starts_at |
Datetime readonly When the start action is planned |
stops_at |
Datetime readonly When the stop action is planned |
reserved_from |
Datetime readonly When the items become unavailable |
reserved_till |
Datetime readonly When the items become available again |
reserved |
Boolean readonly Wheter items are reserved |
started |
Integer readonly Amount of items started. Cannot exceed quantity . This attribute is omitted when this is a parent planning for a Bundle. |
stopped |
Integer readonly Amount of items stopped. Cannot exceed quantity and started . This attribute is omitted when this is a parent planning for a Bundle. |
location_shortage_amount |
Integer readonly Amount of items short. This attribute is omitted when this is a parent planning for a Bundle. |
shortage_amount |
Integer readonly Amount of items short on location (could be there are still available on other locations in the same cluster). This attribute is omitted when this is a parent planning for a Bundle. |
order_id |
Uuid readonly Associated Order |
item_id |
Uuid readonly Associated Item |
start_location_id |
Uuid readonly Associated Start location |
stop_location_id |
Uuid readonly Associated Stop location |
parent_planning_id |
Uuid readonly Associated Parent planning |
Relationships
Plannings have the following relationships:
Name | Description |
---|---|
item |
Items readonly Associated Item |
nested_plannings |
Plannings readonly Associated Nested plannings |
order |
Orders readonly Associated Order |
order_line |
Lines readonly Associated Order line |
parent_planning |
Plannings readonly Associated Parent planning |
start_location |
Locations readonly Associated Start location |
stock_item_plannings |
Stock item plannings readonly Associated Stock item plannings |
stop_location |
Locations readonly Associated Stop location |
Listing plannings
How to fetch a list of plannings:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/plannings' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "8e1c2910-f0c2-483e-b9d5-60249d65ddb7",
"type": "plannings",
"attributes": {
"created_at": "2024-11-18T09:23:07.785924+00:00",
"updated_at": "2024-11-18T09:23:08.491051+00:00",
"archived": false,
"archived_at": null,
"quantity": 1,
"starts_at": "1980-04-01T12:00:00.000000+00:00",
"stops_at": "1980-05-01T12:00:00.000000+00:00",
"reserved_from": "1980-04-01T12:00:00.000000+00:00",
"reserved_till": "1980-05-01T12:00:00.000000+00:00",
"reserved": true,
"started": 0,
"stopped": 0,
"location_shortage_amount": 0,
"shortage_amount": 0,
"order_id": "9726be0e-a9d5-4613-91ee-37f10e219c8e",
"item_id": "84e1042d-15b8-46c3-8a30-c14201132ecf",
"start_location_id": "f6da41dc-9f43-4b14-819c-9f355488b35b",
"stop_location_id": "f6da41dc-9f43-4b14-819c-9f355488b35b",
"parent_planning_id": null
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/plannings
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=order,item,order_line |
fields[] |
Array List of comma seperated fields to include ?fields[plannings]=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 |
quantity |
Integer eq , not_eq , gt , gte , lt , lte |
starts_at |
Datetime eq , not_eq , gt , gte , lt , lte |
stops_at |
Datetime eq , not_eq , gt , gte , lt , lte |
reserved_from |
Datetime eq , not_eq , gt , gte , lt , lte |
reserved_till |
Datetime eq , not_eq , gt , gte , lt , lte |
reserved |
Boolean eq |
started |
Integer eq , not_eq , gt , gte , lt , lte |
stopped |
Integer eq , not_eq , gt , gte , lt , lte |
location_shortage_amount |
Integer eq , not_eq , gt , gte , lt , lte |
shortage_amount |
Integer eq , not_eq , gt , gte , lt , lte |
order_id |
Uuid eq , not_eq |
item_id |
Uuid eq , not_eq |
start_location_id |
Uuid eq , not_eq |
stop_location_id |
Uuid eq , not_eq |
parent_planning_id |
Uuid eq , not_eq |
q |
String eq |
item_type |
String eq , not_eq |
product_type |
String eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request accepts the following includes:
order
item
=>
photo
order_line
start_location
stop_location
Searching plannings
Use advanced search to make logical filter groups with and/or operators.
How to search for plannings:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/plannings/search' \
--header 'content-type: application/json' \
--data '{
"fields": {
"plannings": "id"
},
"filter": {
"conditions": {
"operator": "or",
"attributes": [
{
"operator": "and",
"attributes": [
{
"starts_at": {
"gte": "2024-11-19T09:23:05Z"
}
},
{
"starts_at": {
"lte": "2024-11-22T09:23:05Z"
}
}
]
},
{
"operator": "and",
"attributes": [
{
"stops_at": {
"gte": "2024-11-19T09:23:05Z"
}
},
{
"stops_at": {
"lte": "2024-11-22T09:23:05Z"
}
}
]
}
]
}
}
}'
A 200 status response looks like this:
{
"data": [
{
"id": "3f936aa9-57ce-47de-87de-0bd418fbb0e0"
},
{
"id": "2af258b6-cd8e-457f-81f7-b7c44bc9ce82"
}
]
}
HTTP Request
POST api/boomerang/plannings/search
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=order,item,order_line |
fields[] |
Array List of comma seperated fields to include ?fields[plannings]=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 |
quantity |
Integer eq , not_eq , gt , gte , lt , lte |
starts_at |
Datetime eq , not_eq , gt , gte , lt , lte |
stops_at |
Datetime eq , not_eq , gt , gte , lt , lte |
reserved_from |
Datetime eq , not_eq , gt , gte , lt , lte |
reserved_till |
Datetime eq , not_eq , gt , gte , lt , lte |
reserved |
Boolean eq |
started |
Integer eq , not_eq , gt , gte , lt , lte |
stopped |
Integer eq , not_eq , gt , gte , lt , lte |
location_shortage_amount |
Integer eq , not_eq , gt , gte , lt , lte |
shortage_amount |
Integer eq , not_eq , gt , gte , lt , lte |
order_id |
Uuid eq , not_eq |
item_id |
Uuid eq , not_eq |
start_location_id |
Uuid eq , not_eq |
stop_location_id |
Uuid eq , not_eq |
parent_planning_id |
Uuid eq , not_eq |
q |
String eq |
item_type |
String eq , not_eq |
product_type |
String eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request accepts the following includes:
order
item
=>
photo
order_line
start_location
stop_location
Fetching a planning
How to fetch a planning:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/plannings/5bba73a9-1a51-4758-b178-9a984ea332d8' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "5bba73a9-1a51-4758-b178-9a984ea332d8",
"type": "plannings",
"attributes": {
"created_at": "2024-11-18T09:22:58.399095+00:00",
"updated_at": "2024-11-18T09:22:59.086068+00:00",
"archived": false,
"archived_at": null,
"quantity": 1,
"starts_at": "1980-04-01T12:00:00.000000+00:00",
"stops_at": "1980-05-01T12:00:00.000000+00:00",
"reserved_from": "1980-04-01T12:00:00.000000+00:00",
"reserved_till": "1980-05-01T12:00:00.000000+00:00",
"reserved": true,
"started": 0,
"stopped": 0,
"location_shortage_amount": 0,
"shortage_amount": 0,
"order_id": "544d539b-a0de-44a7-a4dd-f33b488b42af",
"item_id": "74b4c663-e088-4908-b4b1-b5d682d48c19",
"start_location_id": "d184d70a-ac34-4828-b57a-d49c1a63b0f6",
"stop_location_id": "d184d70a-ac34-4828-b57a-d49c1a63b0f6",
"parent_planning_id": null
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/plannings/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=order,item,order_line |
fields[] |
Array List of comma seperated fields to include ?fields[plannings]=created_at,updated_at,archived |
Includes
This request accepts the following includes:
order
item
=>
photo
order_line
start_location
stop_location
parent_planning
nested_plannings
Price rules
A price rule contains a single pricing adjustment rule and belongs to a price ruleset.
A price rule can have one of these types:
- range_of_days: Adjust pricing for certain days of the week,
match_strategy
can be one ofwithin, overlap, span
and must be used in combination withfrom_day
,till_day
,from_time,
till_timeand
value`. - range_of_dates: Adjust pricing for certain calendar days,
match_strategy
can be one ofwithin, overlap, span
and must be used in combination withfrom
,till
andvalue
. - exclude_week_days: Do not charge for certain days of the week,
match_strategy
can be one ofwithin, overlap, span
and must be used in combination withfrom_day
,till_day
,from_time,
till_time`. - exclude_date_range: Do not charge for certain calendar days,
match_strategy
can be one ofwithin, overlap, span
and must be used in combination withfrom
,till
. - pickup_day: Rule determines if entire day is charged based on pickup day time,
match_strategy
must bestarts_within
,charge
determines if day is charged when beforetime
or not charged if aftertime
. - return_day: Rule determines if entire day is charged based on return day time,
match_strategy
must bestops_within
,charge
determines if day is charged when beforetime
or not charged if aftertime
.
and these match strategies:
- starts_within: Used with
pickup_day
rules - stops_within: Used with
return_day
rules - within: Rule is applied when the rule period fits within the order period.
- overlap: Rule is applied for the part of the rule period that overlaps the order period.
- span: Rule is applied when the rule period spans over the order period.
as well as these adjustment strategies:
- charge: Applies
charge
attribute to determine rule effect, either charges or doesn't charge. Used bypickup_day
andreturn_day
rules types. - percentage: Applies
value
attribute to determine the percentage change to the pricing over the rule period. Used byrange_of_days
,range_of_date
rule types.
Endpoints
POST /api/boomerang/price_rules
PUT /api/boomerang/price_rules/{id}
DELETE /api/boomerang/price_rules/{id}
Fields
Every price rule 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 rule |
rule_type |
String Determines rule behaviour. One of range_of_days , range_of_dates , exclude_date_range , exclude_week_days , pickup_day , return_day |
match_strategy |
String Determines how dates are matched to the rule. One of starts_within , stops_within , overlap , span , within |
adjustment_strategy |
String Determines wether a price rule adjusts prices by percentage or exact cent ammounts. One of percentage , charge |
value |
Float Adjustment value in percent |
from |
Datetime Defines start of period, used by range_of_dates rule type |
till |
Datetime Defines end of period, used by range_of_dates rule type |
from_day |
Integer Defines start of period in weekdays, 0 is monday, used by range_of_days rule type |
till_day |
Integer Defines end of period in weekdays, 0 is monday, used by range_of_days rule type |
from_time |
String Defines start of period time, used by range_of_days rule type. Format is a HH:mm string, independent of time display settings. |
till_time |
String Defines end of period time, used by range_of_days rule type. Format is a HH:mm string, independent of time display settings. |
charge |
Boolean Determines effect of rules using charge attribute |
stacked |
Boolean If a ruleset consists of multiple rules that adjust the product price, determines if rule should interact with other rules |
time |
String Defines time for adjustment, used by pickup_day and return_day rule types. Format is a HH:mm string, independent of time display settings. |
min_duration |
Integer Rule will only be applied when order period is greater than min duration in seconds |
max_duration |
Integer Rule will only be applied when order period is smaller than max duration in seconds |
price_ruleset_id |
Uuid Which ruleset this rule belongs to |
Relationships
Price rules have the following relationships:
Name | Description |
---|---|
price_ruleset |
Price rulesets readonly Associated Price ruleset |
Creating a price rule
How to create a price rule:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/price_rules' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "price_rules",
"attributes": {
"price_ruleset_id": "7258fb4e-4148-402c-8701-933b0e4192de",
"name": "Off season",
"rule_type": "range_of_dates",
"match_strategy": "span",
"value": 25,
"from": "2024-10-18T09:27:24.601Z",
"till": "2024-12-18T09:27:24.601Z"
}
},
"include": "price_rules"
}'
A 201 status response looks like this:
{
"data": {
"id": "f02716cc-a48e-4c10-b45c-14634ef6bb56",
"type": "price_rules",
"attributes": {
"created_at": "2024-11-18T09:27:24.617090+00:00",
"updated_at": "2024-11-18T09:27:24.617090+00:00",
"name": "Off season",
"rule_type": "range_of_dates",
"match_strategy": "span",
"adjustment_strategy": "percentage",
"value": 25.0,
"from": "2024-10-18T09:27:24.601000+00:00",
"till": "2024-12-18T09:27:24.601000+00:00",
"from_day": null,
"till_day": null,
"from_time": null,
"till_time": null,
"charge": null,
"stacked": false,
"time": null,
"min_duration": null,
"max_duration": null,
"price_ruleset_id": "7258fb4e-4148-402c-8701-933b0e4192de"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/price_rules
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=price_ruleset |
fields[] |
Array List of comma seperated fields to include ?fields[price_rules]=created_at,updated_at,name |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the rule |
data[attributes][rule_type] |
String Determines rule behaviour. One of range_of_days , range_of_dates , exclude_date_range , exclude_week_days , pickup_day , return_day |
data[attributes][match_strategy] |
String Determines how dates are matched to the rule. One of starts_within , stops_within , overlap , span , within |
data[attributes][adjustment_strategy] |
String Determines wether a price rule adjusts prices by percentage or exact cent ammounts. One of percentage , charge |
data[attributes][value] |
Float Adjustment value in percent |
data[attributes][from] |
Datetime Defines start of period, used by range_of_dates rule type |
data[attributes][till] |
Datetime Defines end of period, used by range_of_dates rule type |
data[attributes][from_day] |
Integer Defines start of period in weekdays, 0 is monday, used by range_of_days rule type |
data[attributes][till_day] |
Integer Defines end of period in weekdays, 0 is monday, used by range_of_days rule type |
data[attributes][from_time] |
String Defines start of period time, used by range_of_days rule type. Format is a HH:mm string, independent of time display settings. |
data[attributes][till_time] |
String Defines end of period time, used by range_of_days rule type. Format is a HH:mm string, independent of time display settings. |
data[attributes][charge] |
Boolean Determines effect of rules using charge attribute |
data[attributes][stacked] |
Boolean If a ruleset consists of multiple rules that adjust the product price, determines if rule should interact with other rules |
data[attributes][time] |
String Defines time for adjustment, used by pickup_day and return_day rule types. Format is a HH:mm string, independent of time display settings. |
data[attributes][min_duration] |
Integer Rule will only be applied when order period is greater than min duration in seconds |
data[attributes][max_duration] |
Integer Rule will only be applied when order period is smaller than max duration in seconds |
data[attributes][price_ruleset_id] |
Uuid Which ruleset this rule belongs to |
Includes
This request accepts the following includes:
price_ruleset
=>
price_rules
Updating a price rule
How to update a price rule:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/price_rules/c026403a-4d51-4fb8-8976-0f0a1854868b' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "c026403a-4d51-4fb8-8976-0f0a1854868b",
"type": "price_rules",
"attributes": {
"value": 10
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "c026403a-4d51-4fb8-8976-0f0a1854868b",
"type": "price_rules",
"attributes": {
"created_at": "2024-11-18T09:27:24.174953+00:00",
"updated_at": "2024-11-18T09:27:24.194052+00:00",
"name": "Holidays",
"rule_type": "range_of_dates",
"match_strategy": "span",
"adjustment_strategy": "percentage",
"value": 10.0,
"from": "2030-12-01T00:00:00.000000+00:00",
"till": "2031-01-31T00:00:00.000000+00:00",
"from_day": null,
"till_day": null,
"from_time": null,
"till_time": null,
"charge": null,
"stacked": false,
"time": null,
"min_duration": null,
"max_duration": null,
"price_ruleset_id": "02ca7e0c-6b07-49c1-8a1c-605b512b8def"
},
"relationships": {}
},
"meta": {}
}
Updating a price rule:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/price_rules/e8972236-c6c1-404e-9fea-f6f313e87c63' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "e8972236-c6c1-404e-9fea-f6f313e87c63",
"type": "price_rules",
"attributes": {
"id": "e8972236-c6c1-404e-9fea-f6f313e87c63",
"name": "Off season"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "e8972236-c6c1-404e-9fea-f6f313e87c63",
"type": "price_rules",
"attributes": {
"created_at": "2024-11-18T09:27:23.760672+00:00",
"updated_at": "2024-11-18T09:27:23.777888+00:00",
"name": "Off season",
"rule_type": "range_of_dates",
"match_strategy": "span",
"adjustment_strategy": "percentage",
"value": 5.0,
"from": "2030-12-01T00:00:00.000000+00:00",
"till": "2031-01-31T00:00:00.000000+00:00",
"from_day": null,
"till_day": null,
"from_time": null,
"till_time": null,
"charge": null,
"stacked": false,
"time": null,
"min_duration": null,
"max_duration": null,
"price_ruleset_id": "630589ed-b962-464e-9893-4a7d19043476"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/price_rules/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=price_ruleset |
fields[] |
Array List of comma seperated fields to include ?fields[price_rules]=created_at,updated_at,name |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the rule |
data[attributes][rule_type] |
String Determines rule behaviour. One of range_of_days , range_of_dates , exclude_date_range , exclude_week_days , pickup_day , return_day |
data[attributes][match_strategy] |
String Determines how dates are matched to the rule. One of starts_within , stops_within , overlap , span , within |
data[attributes][adjustment_strategy] |
String Determines wether a price rule adjusts prices by percentage or exact cent ammounts. One of percentage , charge |
data[attributes][value] |
Float Adjustment value in percent |
data[attributes][from] |
Datetime Defines start of period, used by range_of_dates rule type |
data[attributes][till] |
Datetime Defines end of period, used by range_of_dates rule type |
data[attributes][from_day] |
Integer Defines start of period in weekdays, 0 is monday, used by range_of_days rule type |
data[attributes][till_day] |
Integer Defines end of period in weekdays, 0 is monday, used by range_of_days rule type |
data[attributes][from_time] |
String Defines start of period time, used by range_of_days rule type. Format is a HH:mm string, independent of time display settings. |
data[attributes][till_time] |
String Defines end of period time, used by range_of_days rule type. Format is a HH:mm string, independent of time display settings. |
data[attributes][charge] |
Boolean Determines effect of rules using charge attribute |
data[attributes][stacked] |
Boolean If a ruleset consists of multiple rules that adjust the product price, determines if rule should interact with other rules |
data[attributes][time] |
String Defines time for adjustment, used by pickup_day and return_day rule types. Format is a HH:mm string, independent of time display settings. |
data[attributes][min_duration] |
Integer Rule will only be applied when order period is greater than min duration in seconds |
data[attributes][max_duration] |
Integer Rule will only be applied when order period is smaller than max duration in seconds |
data[attributes][price_ruleset_id] |
Uuid Which ruleset this rule belongs to |
Includes
This request accepts the following includes:
price_ruleset
=>
price_rules
Archiving a price rule
How to archive a price ruleset:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/price_rules/d3748473-98b4-4872-8a10-1cd7f7b57d82' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "d3748473-98b4-4872-8a10-1cd7f7b57d82",
"type": "price_rules",
"attributes": {
"created_at": "2024-11-18T09:27:23.355425+00:00",
"updated_at": "2024-11-18T09:27:23.355425+00:00",
"name": "Holidays",
"rule_type": "range_of_dates",
"match_strategy": "span",
"adjustment_strategy": "percentage",
"value": 5.0,
"from": "2030-12-01T00:00:00.000000+00:00",
"till": "2031-01-31T00:00:00.000000+00:00",
"from_day": null,
"till_day": null,
"from_time": null,
"till_time": null,
"charge": null,
"stacked": false,
"time": null,
"min_duration": null,
"max_duration": null,
"price_ruleset_id": "967bbcb3-37d1-49f3-bf0a-4692414a42e5"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/price_rules/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=price_ruleset |
fields[] |
Array List of comma seperated fields to include ?fields[price_rules]=created_at,updated_at,name |
Includes
This request accepts the following includes:
price_ruleset
=>
price_rules
Price rulesets
Price rulesets are used to create elaborate pricing adjustments using the advanced pricing feature.
Endpoints
GET /api/boomerang/price_rulesets
GET /api/boomerang/price_rulesets/{id}
POST /api/boomerang/price_rulesets
PUT /api/boomerang/price_rulesets/{id}
DELETE /api/boomerang/price_rulesets/{id}
Fields
Every price ruleset 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 price ruleset is archived |
archived_at |
Datetime readonly When the price ruleset was archived |
name |
String Name of the ruleset |
description |
String Description of the ruleset |
price_rules_attributes |
Array writeonly Allows creating and updating price rules with their ruleset |
make_name_unique |
Boolean writeonly When true , a unique name will be generated when a PriceRuleset with the same name already exists. |
Relationships
Price rulesets have the following relationships:
Name | Description |
---|---|
price_rules |
Price rules readonly Associated Price rules |
Listing price rulesets
How to fetch price rulesets:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/price_rulesets' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "6c4c2f49-9de3-440a-9c4b-89d252b2f977",
"type": "price_rulesets",
"attributes": {
"created_at": "2024-11-18T09:23:12.039867+00:00",
"updated_at": "2024-11-18T09:23:12.039867+00:00",
"archived": false,
"archived_at": null,
"name": "Ruleset",
"description": null
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/price_rulesets
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[price_rulesets]=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 |
price_rules_attributes |
Array eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request does not accept any includes
Fetching a price ruleset
How to fetch a single price ruleset with related price rules:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/price_rulesets/e9039a50-d25f-4fb6-9757-be9773b7dd1a?include=price_rules' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "e9039a50-d25f-4fb6-9757-be9773b7dd1a",
"type": "price_rulesets",
"attributes": {
"created_at": "2024-11-18T09:23:12.734809+00:00",
"updated_at": "2024-11-18T09:23:12.734809+00:00",
"archived": false,
"archived_at": null,
"name": "Ruleset",
"description": null
},
"relationships": {
"price_rules": {
"data": [
{
"type": "price_rules",
"id": "87670754-44db-4ab9-a2b6-32469caffd1b"
}
]
}
}
},
"included": [
{
"id": "87670754-44db-4ab9-a2b6-32469caffd1b",
"type": "price_rules",
"attributes": {
"created_at": "2024-11-18T09:23:12.738331+00:00",
"updated_at": "2024-11-18T09:23:12.738331+00:00",
"name": "Price rule",
"rule_type": "range_of_dates",
"match_strategy": "span",
"adjustment_strategy": "percentage",
"value": 30.0,
"from": "2030-07-01T00:00:00.000000+00:00",
"till": "2030-08-31T00:00:00.000000+00:00",
"from_day": null,
"till_day": null,
"from_time": null,
"till_time": null,
"charge": null,
"stacked": false,
"time": null,
"min_duration": null,
"max_duration": null,
"price_ruleset_id": "e9039a50-d25f-4fb6-9757-be9773b7dd1a"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/price_rulesets/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=price_rules |
fields[] |
Array List of comma seperated fields to include ?fields[price_rulesets]=created_at,updated_at,archived |
Includes
This request accepts the following includes:
price_rules
Creating a price ruleset
How to create a price ruleset with price rules:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/price_rulesets' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "price_rulesets",
"attributes": {
"name": "Seasonal ruleset",
"price_rules_attributes": [
{
"name": "Off season",
"rule_type": "range_of_dates",
"match_strategy": "span",
"value": 25,
"from": "2024-10-18T09:23:11.369Z",
"till": "2024-12-18T09:23:11.369Z"
}
]
}
},
"include": "price_rules"
}'
A 201 status response looks like this:
{
"data": {
"id": "9fd920a3-8de6-48f6-95c7-41429f3da966",
"type": "price_rulesets",
"attributes": {
"created_at": "2024-11-18T09:23:11.392323+00:00",
"updated_at": "2024-11-18T09:23:11.392323+00:00",
"archived": false,
"archived_at": null,
"name": "Seasonal ruleset",
"description": null
},
"relationships": {
"price_rules": {
"data": [
{
"type": "price_rules",
"id": "655be063-bbf5-44ca-b4db-52a6582ef14f"
}
]
}
}
},
"included": [
{
"id": "655be063-bbf5-44ca-b4db-52a6582ef14f",
"type": "price_rules",
"attributes": {
"created_at": "2024-11-18T09:23:11.393938+00:00",
"updated_at": "2024-11-18T09:23:11.393938+00:00",
"name": "Off season",
"rule_type": "range_of_dates",
"match_strategy": "span",
"adjustment_strategy": "percentage",
"value": 25.0,
"from": "2024-10-18T09:23:11.369000+00:00",
"till": "2024-12-18T09:23:11.369000+00:00",
"from_day": null,
"till_day": null,
"from_time": null,
"till_time": null,
"charge": null,
"stacked": false,
"time": null,
"min_duration": null,
"max_duration": null,
"price_ruleset_id": "9fd920a3-8de6-48f6-95c7-41429f3da966"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
POST /api/boomerang/price_rulesets
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=price_rules |
fields[] |
Array List of comma seperated fields to include ?fields[price_rulesets]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the ruleset |
data[attributes][price_rules_attributes][] |
Array Allows creating and updating price rules with their ruleset |
data[attributes][make_name_unique] |
Boolean When true , a unique name will be generated when a PriceRuleset with the same name already exists. |
Includes
This request accepts the following includes:
price_rules
Updating a price ruleset
How to update a price ruleset:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/price_rulesets/e53bc0d7-a03e-45ca-953e-4f2574265b22' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "e53bc0d7-a03e-45ca-953e-4f2574265b22",
"type": "price_rulesets",
"attributes": {
"name": "Seasonal ruleset (old)"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "e53bc0d7-a03e-45ca-953e-4f2574265b22",
"type": "price_rulesets",
"attributes": {
"created_at": "2024-11-18T09:23:10.774531+00:00",
"updated_at": "2024-11-18T09:23:10.796446+00:00",
"archived": false,
"archived_at": null,
"name": "Seasonal ruleset (old)",
"description": null
},
"relationships": {}
},
"meta": {}
}
Updating a price ruleset's price rules:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/price_rulesets/36ce3aca-a77b-4cc2-ba99-522844818000' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "36ce3aca-a77b-4cc2-ba99-522844818000",
"type": "price_rulesets",
"attributes": {
"price_rules_attributes": [
{
"id": "a4e0ec86-0153-4c27-8e21-980e13d0387e",
"name": "Off season"
}
]
}
},
"include": "price_rules"
}'
A 200 status response looks like this:
{
"data": {
"id": "36ce3aca-a77b-4cc2-ba99-522844818000",
"type": "price_rulesets",
"attributes": {
"created_at": "2024-11-18T09:23:10.199321+00:00",
"updated_at": "2024-11-18T09:23:10.199321+00:00",
"archived": false,
"archived_at": null,
"name": "Ruleset",
"description": null
},
"relationships": {
"price_rules": {
"data": [
{
"type": "price_rules",
"id": "a4e0ec86-0153-4c27-8e21-980e13d0387e"
}
]
}
}
},
"included": [
{
"id": "a4e0ec86-0153-4c27-8e21-980e13d0387e",
"type": "price_rules",
"attributes": {
"created_at": "2024-11-18T09:23:10.201570+00:00",
"updated_at": "2024-11-18T09:23:10.239760+00:00",
"name": "Off season",
"rule_type": "range_of_dates",
"match_strategy": "span",
"adjustment_strategy": "percentage",
"value": 30.0,
"from": "2030-07-01T00:00:00.000000+00:00",
"till": "2030-08-31T00:00:00.000000+00:00",
"from_day": null,
"till_day": null,
"from_time": null,
"till_time": null,
"charge": null,
"stacked": false,
"time": null,
"min_duration": null,
"max_duration": null,
"price_ruleset_id": "36ce3aca-a77b-4cc2-ba99-522844818000"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
PUT /api/boomerang/price_rulesets/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=price_rules |
fields[] |
Array List of comma seperated fields to include ?fields[price_rulesets]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the ruleset |
data[attributes][price_rules_attributes][] |
Array Allows creating and updating price rules with their ruleset |
data[attributes][make_name_unique] |
Boolean When true , a unique name will be generated when a PriceRuleset with the same name already exists. |
Includes
This request accepts the following includes:
price_rules
Archiving a price ruleset
How to archive a price ruleset:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/price_rulesets/c9587b9b-c32d-43b6-ab61-ae1a42de2347' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "c9587b9b-c32d-43b6-ab61-ae1a42de2347",
"type": "price_rulesets",
"attributes": {
"created_at": "2024-11-18T09:23:09.547625+00:00",
"updated_at": "2024-11-18T09:23:09.580535+00:00",
"archived": true,
"archived_at": "2024-11-18T09:23:09.580535+00:00",
"name": "Ruleset",
"description": null
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/price_rulesets/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[price_rulesets]=created_at,updated_at,archived |
Includes
This request does not accept any includes
Price structures
Price structures enable you to control what is being priced for a specific period. Price structures consist of tiles that represent a period. The actual charge that is being calculated will always round up to the nearest tile it can find. You can also set up a flat-fee structure after you've run out of tiles by setting one of the following values: hour
, day
, week
, month
, year
.
There are two kinds of price structures:
reusable
: Structures that are reusable and that can be assigned to multiple product groups.private
: Structure for a specific product group. These are automatically created when a product group itsprice_type
is set toprivate_structure
.
Endpoints
GET /api/boomerang/price_structures
GET /api/boomerang/price_structures/{id}
POST /api/boomerang/price_structures
PUT /api/boomerang/price_structures/{id}
DELETE /api/boomerang/price_structures/{id}
Fields
Every price structure 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 price structure is archived |
archived_at |
Datetime readonly When the price structure was archived |
name |
String Name of the structure |
price_structure_type |
String readonly One of reusable , private |
price_tiles_attributes |
Array writeonly The price tiles to associate |
product_group_id |
Uuid readonly The associated product group for private price structure type |
hour |
Float Multiplier for every hour outside of its tiles |
day |
Float Multiplier for every day outside of its tiles |
week |
Float Multiplier for every week outside of its tiles |
month |
Float Multiplier for every month outside of its tiles |
year |
Float Multiplier for every year outside of its tiles |
Relationships
Price structures have the following relationships:
Name | Description |
---|---|
price_tiles |
Price tiles readonly Associated Price tiles |
Listing price structures
How to fetch a list of price structures:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/price_structures' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "2ace9526-5aa3-44cb-b295-cb64a1fc02fe",
"type": "price_structures",
"attributes": {
"created_at": "2024-11-18T09:24:23.324797+00:00",
"updated_at": "2024-11-18T09:24:23.329069+00:00",
"archived": false,
"archived_at": null,
"name": "Price per hour (3 hours minimum)",
"price_structure_type": "reusable",
"product_group_id": null,
"hour": 1.0,
"day": 0.0,
"week": 0.0,
"month": 0.0,
"year": 0.0
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/price_structures
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[price_structures]=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 |
price_structure_type |
String eq , not_eq |
product_group_id |
Uuid eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request does not accept any includes
Fetching a price structure
How to fetch a price structure with it's tiles:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/price_structures/bebc2d55-3d4f-4fc4-9767-6eed60312258?include=price_tiles' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "bebc2d55-3d4f-4fc4-9767-6eed60312258",
"type": "price_structures",
"attributes": {
"created_at": "2024-11-18T09:24:24.211414+00:00",
"updated_at": "2024-11-18T09:24:24.215799+00:00",
"archived": false,
"archived_at": null,
"name": "Price per hour (3 hours minimum)",
"price_structure_type": "reusable",
"product_group_id": null,
"hour": 1.0,
"day": 0.0,
"week": 0.0,
"month": 0.0,
"year": 0.0
},
"relationships": {
"price_tiles": {
"data": [
{
"type": "price_tiles",
"id": "e7d70829-8597-40dd-b882-1dfa65022629"
}
]
}
}
},
"included": [
{
"id": "e7d70829-8597-40dd-b882-1dfa65022629",
"type": "price_tiles",
"attributes": {
"created_at": "2024-11-18T09:24:24.213787+00:00",
"updated_at": "2024-11-18T09:24:24.213787+00:00",
"name": "3 hours",
"quantity": 3,
"length": 10800,
"multiplier": 1.0,
"period": "hours",
"price_structure_id": "bebc2d55-3d4f-4fc4-9767-6eed60312258"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/price_structures/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=price_tiles |
fields[] |
Array List of comma seperated fields to include ?fields[price_structures]=created_at,updated_at,archived |
Includes
This request accepts the following includes:
price_tiles
Creating a price structure
How to create a price structure with price tiles:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/price_structures' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "price_structures",
"attributes": {
"name": "Price per hour (3 hours minimum)",
"hour": 1,
"price_tiles_attributes": [
{
"name": "3 hours",
"quantity": 3,
"period": "hours",
"multiplier": 1
}
]
}
},
"include": "price_tiles"
}'
A 201 status response looks like this:
{
"data": {
"id": "dc53c01c-6d4b-47aa-a14b-788b8e349b6c",
"type": "price_structures",
"attributes": {
"created_at": "2024-11-18T09:24:22.892660+00:00",
"updated_at": "2024-11-18T09:24:22.897032+00:00",
"archived": false,
"archived_at": null,
"name": "Price per hour (3 hours minimum)",
"price_structure_type": "reusable",
"product_group_id": null,
"hour": 1.0,
"day": 0.0,
"week": 0.0,
"month": 0.0,
"year": 0.0
},
"relationships": {
"price_tiles": {
"data": [
{
"type": "price_tiles",
"id": "a844ab26-822d-4b03-8700-e33bd25593b0"
}
]
}
}
},
"included": [
{
"id": "a844ab26-822d-4b03-8700-e33bd25593b0",
"type": "price_tiles",
"attributes": {
"created_at": "2024-11-18T09:24:22.894891+00:00",
"updated_at": "2024-11-18T09:24:22.894891+00:00",
"name": "3 hours",
"quantity": 3,
"length": 10800,
"multiplier": 1.0,
"period": "hours",
"price_structure_id": "dc53c01c-6d4b-47aa-a14b-788b8e349b6c"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
POST /api/boomerang/price_structures
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=price_tiles |
fields[] |
Array List of comma seperated fields to include ?fields[price_structures]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the structure |
data[attributes][price_tiles_attributes][] |
Array The price tiles to associate |
data[attributes][hour] |
Float Multiplier for every hour outside of its tiles |
data[attributes][day] |
Float Multiplier for every day outside of its tiles |
data[attributes][week] |
Float Multiplier for every week outside of its tiles |
data[attributes][month] |
Float Multiplier for every month outside of its tiles |
data[attributes][year] |
Float Multiplier for every year outside of its tiles |
Includes
This request accepts the following includes:
price_tiles
Updating a price structure
How to update a price structure with price tiles:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/price_structures/505664e8-f1e0-45ed-b0d0-69226655f56c' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "505664e8-f1e0-45ed-b0d0-69226655f56c",
"type": "price_structures",
"attributes": {
"name": "Charge per week (cut-rate > 3 weeks)",
"price_tiles_attributes": [
{
"id": "4c95b08d-4ab8-46e4-b946-d9294db67eb0",
"name": "1 semana"
},
{
"id": "c7caa4b1-154b-4a1a-8d69-eb6fcac0803f",
"name": "2 semanas"
},
{
"id": "bbe1e191-e286-4c35-8f40-7796866d3bb6",
"name": "3 semanas"
},
{
"id": "fd31cccd-1314-4a2b-9dd4-a634034571f8",
"_destroy": true
}
]
}
},
"include": "price_tiles"
}'
A 200 status response looks like this:
{
"data": {
"id": "505664e8-f1e0-45ed-b0d0-69226655f56c",
"type": "price_structures",
"attributes": {
"created_at": "2024-11-18T09:24:24.680707+00:00",
"updated_at": "2024-11-18T09:24:24.745874+00:00",
"archived": false,
"archived_at": null,
"name": "Charge per week (cut-rate > 3 weeks)",
"price_structure_type": "reusable",
"product_group_id": null,
"hour": 0.0,
"day": 0.0,
"week": 0.8,
"month": 0.0,
"year": 0.0
},
"relationships": {
"price_tiles": {
"data": [
{
"type": "price_tiles",
"id": "4c95b08d-4ab8-46e4-b946-d9294db67eb0"
},
{
"type": "price_tiles",
"id": "c7caa4b1-154b-4a1a-8d69-eb6fcac0803f"
},
{
"type": "price_tiles",
"id": "bbe1e191-e286-4c35-8f40-7796866d3bb6"
}
]
}
}
},
"included": [
{
"id": "4c95b08d-4ab8-46e4-b946-d9294db67eb0",
"type": "price_tiles",
"attributes": {
"created_at": "2024-11-18T09:24:24.684271+00:00",
"updated_at": "2024-11-18T09:24:24.740285+00:00",
"name": "1 semana",
"quantity": 1,
"length": 604800,
"multiplier": 1.0,
"period": "weeks",
"price_structure_id": "505664e8-f1e0-45ed-b0d0-69226655f56c"
},
"relationships": {}
},
{
"id": "c7caa4b1-154b-4a1a-8d69-eb6fcac0803f",
"type": "price_tiles",
"attributes": {
"created_at": "2024-11-18T09:24:24.688268+00:00",
"updated_at": "2024-11-18T09:24:24.742377+00:00",
"name": "2 semanas",
"quantity": 2,
"length": 1209600,
"multiplier": 2.0,
"period": "weeks",
"price_structure_id": "505664e8-f1e0-45ed-b0d0-69226655f56c"
},
"relationships": {}
},
{
"id": "bbe1e191-e286-4c35-8f40-7796866d3bb6",
"type": "price_tiles",
"attributes": {
"created_at": "2024-11-18T09:24:24.691682+00:00",
"updated_at": "2024-11-18T09:24:24.744273+00:00",
"name": "3 semanas",
"quantity": 3,
"length": 1814400,
"multiplier": 3.0,
"period": "weeks",
"price_structure_id": "505664e8-f1e0-45ed-b0d0-69226655f56c"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
PUT /api/boomerang/price_structures/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=price_tiles |
fields[] |
Array List of comma seperated fields to include ?fields[price_structures]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the structure |
data[attributes][price_tiles_attributes][] |
Array The price tiles to associate |
data[attributes][hour] |
Float Multiplier for every hour outside of its tiles |
data[attributes][day] |
Float Multiplier for every day outside of its tiles |
data[attributes][week] |
Float Multiplier for every week outside of its tiles |
data[attributes][month] |
Float Multiplier for every month outside of its tiles |
data[attributes][year] |
Float Multiplier for every year outside of its tiles |
Includes
This request accepts the following includes:
price_tiles
Deleting a price structure
How to delete a price structure with tax rates:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/price_structures/c7e45d37-509a-4e02-9662-973c9f2090e4' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "c7e45d37-509a-4e02-9662-973c9f2090e4",
"type": "price_structures",
"attributes": {
"created_at": "2024-11-18T09:24:23.755859+00:00",
"updated_at": "2024-11-18T09:24:23.778325+00:00",
"archived": true,
"archived_at": "2024-11-18T09:24:23.778325+00:00",
"name": "Price per hour (3 hours minimum) (Deleted)",
"price_structure_type": "reusable",
"product_group_id": null,
"hour": 1.0,
"day": 0.0,
"week": 0.0,
"month": 0.0,
"year": 0.0
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/price_structures/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[price_structures]=created_at,updated_at,archived |
Includes
This request does not accept any includes
Price tiles
Price tiles hold information on how to calculate a price for a specific period. According to the charge_length
, a tile will be picked in price calculations. Note that Booqable always rounds up to the highest tile it can find. The base price of a product is multiplied by the multiplier
.
Endpoints
GET /api/boomerang/price_tiles
GET /api/boomerang/price_tiles/{id}
POST /api/boomerang/price_tiles
PUT /api/boomerang/price_tiles/{id}
DELETE /api/boomerang/price_tiles/{id}
Fields
Every price tile 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 tile as it's going to be used in charge labels |
quantity |
Integer Used in combination with period (e.g. 3 with period days ) |
length |
Integer readonly Length in seconds (is computed based on quantity and period ) |
multiplier |
Float The amount to multiply a product's base price with (e.g. 2.8 for three days). |
period |
String One of hours , days , weeks , months , years |
price_structure_id |
Uuid Associated Price structure |
Relationships
Price tiles have the following relationships:
Name | Description |
---|---|
price_structure |
Price structures readonly Associated Price structure |
Listing price tiles
How to fetch a list of price tiles:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/price_tiles' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "f725a611-ed0b-409a-b1c2-637b734c8c40",
"type": "price_tiles",
"attributes": {
"created_at": "2024-11-18T09:26:45.248016+00:00",
"updated_at": "2024-11-18T09:26:45.248016+00:00",
"name": "3 hours",
"quantity": 3,
"length": 10800,
"multiplier": 3.0,
"period": "hours",
"price_structure_id": "dbec53ca-4238-4838-97c7-9d2e7d9edbda"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/price_tiles
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[price_tiles]=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 |
price_structure_id |
Uuid eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request does not accept any includes
Fetching a price tile
How to fetch a price tile:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/price_tiles/eb6d1364-d199-41a6-92a2-126e2e2edb44?include=price_tiles' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "eb6d1364-d199-41a6-92a2-126e2e2edb44",
"type": "price_tiles",
"attributes": {
"created_at": "2024-11-18T09:26:45.686175+00:00",
"updated_at": "2024-11-18T09:26:45.686175+00:00",
"name": "3 hours",
"quantity": 3,
"length": 10800,
"multiplier": 3.0,
"period": "hours",
"price_structure_id": "ac389339-65a4-4171-90bc-f57ed99bdad2"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/price_tiles/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=price_structure |
fields[] |
Array List of comma seperated fields to include ?fields[price_tiles]=created_at,updated_at,name |
Includes
This request accepts the following includes:
price_structure
Creating a price tile
How to create a price tile:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/price_tiles' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "price_tiles",
"attributes": {
"price_structure_id": "e5c099c0-8c67-4cb8-b174-15bbdaeb2e13",
"name": "3 hours",
"quantity": 3,
"period": "hours",
"multiplier": 3
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "11e40c53-c751-4a0b-9a5c-31294c6733d0",
"type": "price_tiles",
"attributes": {
"created_at": "2024-11-18T09:26:46.140102+00:00",
"updated_at": "2024-11-18T09:26:46.140102+00:00",
"name": "3 hours",
"quantity": 3,
"length": 10800,
"multiplier": 3.0,
"period": "hours",
"price_structure_id": "e5c099c0-8c67-4cb8-b174-15bbdaeb2e13"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/price_tiles
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=price_structure |
fields[] |
Array List of comma seperated fields to include ?fields[price_tiles]=created_at,updated_at,name |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the tile as it's going to be used in charge labels |
data[attributes][quantity] |
Integer Used in combination with period (e.g. 3 with period days ) |
data[attributes][multiplier] |
Float The amount to multiply a product's base price with (e.g. 2.8 for three days). |
data[attributes][period] |
String One of hours , days , weeks , months , years |
data[attributes][price_structure_id] |
Uuid Associated Price structure |
Includes
This request accepts the following includes:
price_structure
Updating a price tile
How to update a price tile:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/price_tiles/b392f310-441a-4cce-ba60-23c071a97be8' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "b392f310-441a-4cce-ba60-23c071a97be8",
"type": "price_tiles",
"attributes": {
"name": "4 days",
"quantity": 4,
"period": "days",
"multiplier": 4
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "b392f310-441a-4cce-ba60-23c071a97be8",
"type": "price_tiles",
"attributes": {
"created_at": "2024-11-18T09:26:46.993682+00:00",
"updated_at": "2024-11-18T09:26:47.012286+00:00",
"name": "4 days",
"quantity": 4,
"length": 345600,
"multiplier": 4.0,
"period": "days",
"price_structure_id": "9bfcc5db-6192-4ce9-9b6d-f903284908b7"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/price_tiles/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=price_structure |
fields[] |
Array List of comma seperated fields to include ?fields[price_tiles]=created_at,updated_at,name |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the tile as it's going to be used in charge labels |
data[attributes][quantity] |
Integer Used in combination with period (e.g. 3 with period days ) |
data[attributes][multiplier] |
Float The amount to multiply a product's base price with (e.g. 2.8 for three days). |
data[attributes][period] |
String One of hours , days , weeks , months , years |
data[attributes][price_structure_id] |
Uuid Associated Price structure |
Includes
This request accepts the following includes:
price_structure
Deleting a price tile
How to delete a price tile:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/price_tiles/6ea1cd16-e16b-433a-951e-993f5dda7062' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "6ea1cd16-e16b-433a-951e-993f5dda7062",
"type": "price_tiles",
"attributes": {
"created_at": "2024-11-18T09:26:46.564816+00:00",
"updated_at": "2024-11-18T09:26:46.564816+00:00",
"name": "3 hours",
"quantity": 3,
"length": 10800,
"multiplier": 3.0,
"period": "hours",
"price_structure_id": "c0cff345-cfe4-4e2c-8629-3c8d870d5099"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/price_tiles/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[price_tiles]=created_at,updated_at,name |
Includes
This request does not accept any includes
Product groups
Product groups hold general information and configuration about products. A product group is always associated with at least one product. When a product group is enabled to have variations, it can have multiple products. Note that product groups are not plannable on orders.
A product group supports the following product types:
- Rental: Rental products are your main products that you rent out. Even if your main product is officially a service, in Booqable you will want to add it as a rental product.
- Consumable: Consumable products are products that you do not plan on getting back. These are meant to be small items that you plan on selling along with a rental but do not expect to be returned with the rest of the order.
- Service: Service Item or Service Products are the optional extra services (or items) your want to offer to your products. These are not trackable, therefore they do not have an instock number.
The following tracking types can be defined:
- None: Products are not tracked (only for product_type
service
,consumable
) - Trackable: Trackable Products tend to be the larger ticket items; the products you want to know specifically who has what stock item of what product and when. With trackable products, every stock item is has its own identifier so you can assign and track the individual products (only for product_type
rental
). - Bulk: Bulk products are for those products you don't necessarily need to track each specific stock item but rather you just need to know how many you have in stock. These tend to be your smaller ticket items or items that are quicker to replace in bulk if some are lost (only for product_type
rental
,consumable
).
Pricing can be configured by setting one of the following price types:
- None: Products are free (applies to all product types)
- Fixed: Charge a fixed price (applies to all product types).
- Simple: Apply simple pricing (depends on
price_period
, only for product_typerental
,service
). - Structure: Applies associated price structure (only for product_type
rental
,service
). - Private structure: Applies associated private price structure (only for product_type
rental
,service
).
Endpoints
GET /api/boomerang/product_groups
POST api/boomerang/product_groups/search
GET /api/boomerang/product_groups/{id}
POST /api/boomerang/product_groups
PUT /api/boomerang/product_groups/{id}
DELETE /api/boomerang/product_groups/{id}
Fields
Every product group 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 |
group_name |
String readonly The name of the ProductGroup, if this is a Product that is one of the variations in the group. |
slug |
String Slug of the item |
sku |
String Stock keeping unit |
lead_time |
Integer The amount of seconds the item should be unavailable before a reservation |
lag_time |
Integer The amount of seconds the item should be unavailable after a reservation |
product_type |
String One of rental , consumable , service |
tracking_type |
String Tracking type (One of none , bulk , trackable , can only be set on creating ProductGroups) |
trackable |
Boolean Whether stock items are tracked |
has_variations |
Boolean Whether variations are enabled. Not applicable for product_type service |
variation |
Boolean Whether this Item is a variation in a ProductGroup. |
extra_information |
String nullable Extra information about the item, shown on orders and documents |
photo_url |
String readonly Main photo url |
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 |
base_price_in_cents |
Integer readonly The value that is being calculated with (based on the current price_type ) |
price_type |
String One of structure , private_structure , fixed , simple , none |
price_period |
String One of hour , day , week , month (Only used for price type simple ) |
deposit_in_cents |
Integer The value to use for deposit calculations |
discountable |
Boolean Whether discounts should be applied to this item (note that price rules will still apply) |
taxable |
Boolean Whether item is taxable |
seo_title |
String SEO title tag |
seo_description |
String SEO meta description tag |
tag_list |
Array List of tags |
properties |
Hash readonly Key value pairs of associated properties |
photo_id |
Uuid readonly Associated Photo |
tax_category_id |
Uuid Associated Tax category |
price_ruleset_id |
Uuid Associated Price ruleset |
price_structure_id |
Uuid Associated Price structure |
allow_shortage |
Boolean Whether shortages are allowed |
shortage_limit |
Integer The maximum allowed shortage for any date range |
variation_fields |
Array Array of fields that distinguish variations (e.g. color or size) |
flat_fee_price_in_cents |
Integer Use this value when price type is simple |
structure_price_in_cents |
Integer Use this value when price type is structure or private_structure |
properties_attributes |
Array writeonly Create or update multiple properties associated with this product group |
stock_item_properties |
Array Available properties for stock items |
confirm_shortage |
Boolean writeonly Whether to confirm the shortage (over limit by changing shortage_limit ) |
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 |
Relationships
Product groups have the following relationships:
Name | Description |
---|---|
inventory_levels |
Inventory levels readonly Associated Inventory levels |
photo |
Photos readonly Associated Photo |
price_ruleset |
Price rulesets readonly Associated Price ruleset |
price_structure |
Price structures readonly Associated Price structure |
products |
Products readonly Associated Products |
properties |
Properties readonly Associated Properties |
tax_category |
Tax categories readonly Associated Tax category |
Listing product groups
How to fetch a list of product groups:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/product_groups' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "01e4bbd3-03eb-486c-9ca9-dff9808c04bf",
"type": "product_groups",
"attributes": {
"created_at": "2024-11-18T09:27:16.338140+00:00",
"updated_at": "2024-11-18T09:27:16.347504+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": "bulk",
"trackable": false,
"has_variations": false,
"variation": false,
"extra_information": null,
"photo_url": null,
"description": null,
"excerpt": null,
"show_in_store": true,
"sorting_weight": 0,
"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,
"allow_shortage": false,
"shortage_limit": 0,
"variation_fields": [],
"flat_fee_price_in_cents": 0,
"structure_price_in_cents": 0,
"stock_item_properties": []
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/product_groups
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=photo,properties |
fields[] |
Array List of comma seperated fields to include ?fields[product_groups]=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 , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
collection_id |
Uuid eq , not_eq |
product_group_id |
Uuid eq |
allow_shortage |
Boolean eq |
shortage_limit |
Integer eq , not_eq , gt , gte , lt , lte |
flat_fee_price_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
structure_price_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
photo_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 |
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:
photo
properties
Searching product groups
Use advanced search to make logical filter groups with and/or operators.
How to search for product groups:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/product_groups/search' \
--header 'content-type: application/json' \
--data '{
"fields": {
"product_groups": "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": "6d7c728a-4347-4a2e-9be0-90e9c7b2d65f"
},
{
"id": "66966493-68fc-4923-bba2-a4067b30f803"
},
{
"id": "53733dfb-8d29-4e1c-bdd0-dca863401367"
}
]
}
HTTP Request
POST api/boomerang/product_groups/search
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=photo,properties |
fields[] |
Array List of comma seperated fields to include ?fields[product_groups]=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 , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
collection_id |
Uuid eq , not_eq |
product_group_id |
Uuid eq |
allow_shortage |
Boolean eq |
shortage_limit |
Integer eq , not_eq , gt , gte , lt , lte |
flat_fee_price_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
structure_price_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
photo_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 |
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:
photo
properties
Fetching a product group
How to fetch a product group:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/product_groups/6bfd7e96-290a-47fd-b6f4-c6666573be76' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "6bfd7e96-290a-47fd-b6f4-c6666573be76",
"type": "product_groups",
"attributes": {
"created_at": "2024-11-18T09:27:16.996410+00:00",
"updated_at": "2024-11-18T09:27:17.005451+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": "bulk",
"trackable": false,
"has_variations": false,
"variation": false,
"extra_information": null,
"photo_url": null,
"description": null,
"excerpt": null,
"show_in_store": true,
"sorting_weight": 0,
"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,
"allow_shortage": false,
"shortage_limit": 0,
"variation_fields": [],
"flat_fee_price_in_cents": 0,
"structure_price_in_cents": 0,
"stock_item_properties": []
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/product_groups/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=photo,properties,tax_category |
fields[] |
Array List of comma seperated fields to include ?fields[product_groups]=created_at,updated_at,archived |
Includes
This request accepts the following includes:
photo
properties
tax_category
barcode
products
price_structure
=>
price_tiles
Creating a product group
How to create a product group:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/product_groups' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "product_groups",
"attributes": {
"name": "iPad mini",
"tracking_type": "trackable",
"trackable": true,
"price_type": "simple",
"price_period": "day",
"tag_list": [
"tablets",
"apple"
]
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "cc07cabe-565b-4566-8295-ee03a2b271a3",
"type": "product_groups",
"attributes": {
"created_at": "2024-11-18T09:27:20.245114+00:00",
"updated_at": "2024-11-18T09:27:20.245114+00:00",
"archived": false,
"archived_at": null,
"type": "product_groups",
"name": "iPad mini",
"group_name": null,
"slug": "ipad-mini",
"sku": "IPAD_MINI",
"lead_time": 0,
"lag_time": 0,
"product_type": "rental",
"tracking_type": "trackable",
"trackable": true,
"has_variations": false,
"variation": false,
"extra_information": null,
"photo_url": null,
"description": null,
"excerpt": null,
"show_in_store": true,
"sorting_weight": 0,
"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": [
"tablets",
"apple"
],
"properties": {},
"photo_id": null,
"tax_category_id": null,
"price_ruleset_id": null,
"price_structure_id": null,
"allow_shortage": false,
"shortage_limit": 0,
"variation_fields": [],
"flat_fee_price_in_cents": 0,
"structure_price_in_cents": 0,
"stock_item_properties": []
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/product_groups
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=photo,properties,tax_category |
fields[] |
Array List of comma seperated fields to include ?fields[product_groups]=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][sku] |
String Stock keeping unit |
data[attributes][lead_time] |
Integer The amount of seconds the item should be unavailable before a reservation |
data[attributes][lag_time] |
Integer The amount of seconds the item should be unavailable after a reservation |
data[attributes][product_type] |
String One of rental , consumable , service |
data[attributes][tracking_type] |
String Tracking type (One of none , bulk , trackable , can only be set on creating ProductGroups) |
data[attributes][trackable] |
Boolean Whether stock items are tracked |
data[attributes][has_variations] |
Boolean Whether variations are enabled. Not applicable for product_type service |
data[attributes][variation] |
Boolean Whether this Item is a variation in a ProductGroup. |
data[attributes][extra_information] |
String Extra information about the item, shown on orders and documents |
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][price_type] |
String One of structure , private_structure , fixed , simple , none |
data[attributes][price_period] |
String One of hour , day , week , month (Only used for price type simple ) |
data[attributes][deposit_in_cents] |
Integer The value to use for deposit calculations |
data[attributes][discountable] |
Boolean Whether discounts should be applied to this item (note that price rules will still apply) |
data[attributes][taxable] |
Boolean Whether item is taxable |
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][tax_category_id] |
Uuid Associated Tax category |
data[attributes][price_ruleset_id] |
Uuid Associated Price ruleset |
data[attributes][price_structure_id] |
Uuid Associated Price structure |
data[attributes][allow_shortage] |
Boolean Whether shortages are allowed |
data[attributes][shortage_limit] |
Integer The maximum allowed shortage for any date range |
data[attributes][variation_fields][] |
Array Array of fields that distinguish variations (e.g. color or size) |
data[attributes][flat_fee_price_in_cents] |
Integer Use this value when price type is simple |
data[attributes][structure_price_in_cents] |
Integer Use this value when price type is structure or private_structure |
data[attributes][properties_attributes][] |
Array Create or update multiple properties associated with this product group |
data[attributes][stock_item_properties][] |
Array Available properties for stock items |
data[attributes][confirm_shortage] |
Boolean Whether to confirm the shortage (over limit by changing shortage_limit ) |
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 |
Includes
This request accepts the following includes:
photo
properties
tax_category
barcode
price_structure
=>
price_tiles
Updating a product group
How to update a product group:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/product_groups/f023c10a-b952-4217-bb77-b7f9b9dc3558' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "f023c10a-b952-4217-bb77-b7f9b9dc3558",
"type": "product_groups",
"attributes": {
"name": "iPad mini"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "f023c10a-b952-4217-bb77-b7f9b9dc3558",
"type": "product_groups",
"attributes": {
"created_at": "2024-11-18T09:27:19.185964+00:00",
"updated_at": "2024-11-18T09:27:19.437848+00:00",
"archived": false,
"archived_at": null,
"type": "product_groups",
"name": "iPad mini",
"group_name": null,
"slug": "ipad-mini",
"sku": "SKU",
"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": 0,
"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,
"allow_shortage": false,
"shortage_limit": 0,
"variation_fields": [],
"flat_fee_price_in_cents": 0,
"structure_price_in_cents": 0,
"stock_item_properties": []
},
"relationships": {}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/product_groups/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=photo,properties,tax_category |
fields[] |
Array List of comma seperated fields to include ?fields[product_groups]=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][sku] |
String Stock keeping unit |
data[attributes][lead_time] |
Integer The amount of seconds the item should be unavailable before a reservation |
data[attributes][lag_time] |
Integer The amount of seconds the item should be unavailable after a reservation |
data[attributes][product_type] |
String One of rental , consumable , service |
data[attributes][tracking_type] |
String Tracking type (One of none , bulk , trackable , can only be set on creating ProductGroups) |
data[attributes][trackable] |
Boolean Whether stock items are tracked |
data[attributes][has_variations] |
Boolean Whether variations are enabled. Not applicable for product_type service |
data[attributes][variation] |
Boolean Whether this Item is a variation in a ProductGroup. |
data[attributes][extra_information] |
String Extra information about the item, shown on orders and documents |
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][price_type] |
String One of structure , private_structure , fixed , simple , none |
data[attributes][price_period] |
String One of hour , day , week , month (Only used for price type simple ) |
data[attributes][deposit_in_cents] |
Integer The value to use for deposit calculations |
data[attributes][discountable] |
Boolean Whether discounts should be applied to this item (note that price rules will still apply) |
data[attributes][taxable] |
Boolean Whether item is taxable |
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][tax_category_id] |
Uuid Associated Tax category |
data[attributes][price_ruleset_id] |
Uuid Associated Price ruleset |
data[attributes][price_structure_id] |
Uuid Associated Price structure |
data[attributes][allow_shortage] |
Boolean Whether shortages are allowed |
data[attributes][shortage_limit] |
Integer The maximum allowed shortage for any date range |
data[attributes][variation_fields][] |
Array Array of fields that distinguish variations (e.g. color or size) |
data[attributes][flat_fee_price_in_cents] |
Integer Use this value when price type is simple |
data[attributes][structure_price_in_cents] |
Integer Use this value when price type is structure or private_structure |
data[attributes][properties_attributes][] |
Array Create or update multiple properties associated with this product group |
data[attributes][stock_item_properties][] |
Array Available properties for stock items |
data[attributes][confirm_shortage] |
Boolean Whether to confirm the shortage (over limit by changing shortage_limit ) |
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 |
Includes
This request accepts the following includes:
photo
properties
tax_category
barcode
price_structure
=>
price_tiles
Archiving a product group
How to delete a product group:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/product_groups/0bb56781-68aa-4ff5-bce3-d66f994d66ef' \
--header 'content-type: application/json' \
--data '{}'
A 200 status response looks like this:
{
"data": {
"id": "0bb56781-68aa-4ff5-bce3-d66f994d66ef",
"type": "product_groups",
"attributes": {
"created_at": "2024-11-18T09:27:20.818441+00:00",
"updated_at": "2024-11-18T09:27:21.050010+00:00",
"archived": true,
"archived_at": "2024-11-18T09:27:21.050010+00:00",
"type": "product_groups",
"name": "iPad Pro",
"group_name": null,
"slug": "ipad-pro-archived-0bb56781-68aa-4ff5-bce3-d66f994d66ef",
"sku": "SKU",
"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": 0,
"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,
"allow_shortage": false,
"shortage_limit": 0,
"variation_fields": [],
"flat_fee_price_in_cents": 0,
"structure_price_in_cents": 0,
"stock_item_properties": []
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/product_groups/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[product_groups]=created_at,updated_at,archived |
Includes
This request does not accept any includes
Products
Products are items that are plannable on orders. They always belong to a product group and can only be created separately if the group has variations enabled.
Most of the settings are inherited from the associated product group. When the group has variations enabled, the base_price_in_cents
field is not inherited from the group anymore but can be set individually.
Endpoints
GET /api/boomerang/products
POST api/boomerang/products/search
GET /api/boomerang/products/{id}
POST /api/boomerang/products
PUT /api/boomerang/products/{id}
DELETE /api/boomerang/products/{id}
Fields
Every product 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 readonly Name of the item (based on product group and variations_values ) |
group_name |
String readonly The name of the ProductGroup, if this is a Product that is one of the variations in the group. |
slug |
String Slug of the item |
sku |
String Stock keeping unit |
lead_time |
Integer readonly Inherited from product group: The amount of seconds the item should be unavailable before a reservation |
lag_time |
Integer readonly Inherited from product group: The amount of seconds the item should be unavailable after a reservation |
product_type |
String readonly Inherited from product group: One of rental , consumable , service |
tracking_type |
String readonly Inherited from product group: Tracking type (One of none , bulk , trackable , can only be set on creating ProductGroups) |
trackable |
Boolean readonly Inherited from product group: Whether stock items are tracked |
has_variations |
Boolean Whether variations are enabled. Not applicable for product_type service |
variation |
Boolean readonly Whether this Item is a variation in a ProductGroup. |
extra_information |
String readonly Inherited from product group: Extra information about the item, shown on orders and documents |
photo_url |
String readonly Main photo url |
description |
String readonly Inherited from product group: Description used in the online store |
excerpt |
String Excerpt used in the online store |
show_in_store |
Boolean readonly Inherited from product group: Whether to show this item in the online |
sorting_weight |
Integer Defines sorting weight within its associated product group, the lower the weight - the higher it shows up in lists |
base_price_in_cents |
Integer The value that is being calculated with. This value is writable if group has variations enabled, otherwise it's inherited from the group |
price_type |
String readonly Inherited from product group: One of structure , private_structure , fixed , simple , none |
price_period |
String readonly Inherited from product group: One of hour , day , week , month (Only used for price type simple ) |
deposit_in_cents |
Integer The value to use for deposit calculations |
discountable |
Boolean readonly Inherited from product group: Whether discounts should be applied to this item (note that price rules will still apply) |
taxable |
Boolean readonly Inherited from product group: Whether item is taxable |
seo_title |
String SEO title tag |
seo_description |
String SEO meta description tag |
tag_list |
Array readonly Inherited from product group: List of tags |
properties |
Hash readonly Inherited from product group: Key value pairs of associated properties |
photo_id |
Uuid Associated Photo |
tax_category_id |
Uuid readonly Associated Tax category |
price_ruleset_id |
Uuid readonly Associated Price ruleset |
price_structure_id |
Uuid readonly Associated Price structure |
product_group_id |
Uuid Associated Product group |
variation_values |
Array List of values for product_group.variation_fields (Should be in the same order) |
allow_shortage |
Boolean readonly Inherited from product group: Whether shortages are allowed |
shortage_limit |
Integer readonly Inherited from product group: The maximum allowed shortage for any date range |
confirm_shortage |
Boolean writeonly Whether to confirm the shortage (over limit by changing shortage_limit ) |
Relationships
Products have the following relationships:
Name | Description |
---|---|
barcode |
Barcodes Associated Barcode |
inventory_levels |
Inventory levels readonly Associated Inventory levels |
photo |
Photos readonly Associated Photo |
price_ruleset |
Price rulesets readonly Associated Price ruleset |
price_structure |
Price structures readonly Associated Price structure |
product_group |
Product groups readonly Associated Product group |
properties |
Properties readonly Associated Properties |
tax_category |
Tax categories readonly Associated Tax category |
Listing products
How to fetch a list of products:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/products' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "acaacb60-a9c7-4277-82a7-c5afa7bdc725",
"type": "products",
"attributes": {
"created_at": "2024-11-18T09:28:06.681258+00:00",
"updated_at": "2024-11-18T09:28:06.886229+00:00",
"archived": false,
"archived_at": null,
"type": "products",
"name": "iPad Pro",
"group_name": "iPad Pro",
"slug": "ipad-pro",
"sku": null,
"lead_time": 0,
"lag_time": 0,
"product_type": "rental",
"tracking_type": "bulk",
"trackable": false,
"has_variations": true,
"variation": true,
"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": [
"green"
],
"allow_shortage": false,
"shortage_limit": 0,
"product_group_id": "f38564b2-9c8c-4293-8e44-6ea781347e5e"
},
"relationships": {}
},
{
"id": "6ea4485f-2e7c-43fc-9830-3dab07dc097a",
"type": "products",
"attributes": {
"created_at": "2024-11-18T09:28:06.970712+00:00",
"updated_at": "2024-11-18T09:28:06.970712+00:00",
"archived": false,
"archived_at": null,
"type": "products",
"name": "iPad Pro - blue",
"group_name": "iPad Pro",
"slug": "ipad-pro-blue",
"sku": "PRODUCT 1000078",
"lead_time": 0,
"lag_time": 0,
"product_type": "rental",
"tracking_type": "bulk",
"trackable": false,
"has_variations": true,
"variation": true,
"extra_information": null,
"photo_url": null,
"description": null,
"excerpt": null,
"show_in_store": true,
"sorting_weight": 2,
"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": [
"blue"
],
"allow_shortage": false,
"shortage_limit": 0,
"product_group_id": "f38564b2-9c8c-4293-8e44-6ea781347e5e"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/products
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=barcode,inventory_levels,photo |
fields[] |
Array List of comma seperated fields to include ?fields[products]=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 |
Array 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 , not_eq |
allow_shortage |
Boolean eq |
shortage_limit |
Integer eq , not_eq , gt , gte , lt , lte |
photo_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 |
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:
barcode
inventory_levels
photo
price_structure
=>
price_tiles
product_group
properties
tax_category
Searching products
Use advanced search to make logical filter groups with and/or operators.
How to search for products:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/products/search' \
--header 'content-type: application/json' \
--data '{
"fields": {
"products": "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": "f608646f-8ecd-42d1-baa6-7bcc3c1791c4"
},
{
"id": "dbed1b37-8c0f-4d6c-ab0d-54f4d02f0adb"
},
{
"id": "4d3de3be-0f4d-4fc5-8ed1-7166bcf26776"
},
{
"id": "dcd2a4a1-a498-476e-8e23-5ff2fcac7375"
}
]
}
HTTP Request
POST api/boomerang/products/search
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=barcode,inventory_levels,photo |
fields[] |
Array List of comma seperated fields to include ?fields[products]=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 |
Array 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 , not_eq |
allow_shortage |
Boolean eq |
shortage_limit |
Integer eq , not_eq , gt , gte , lt , lte |
photo_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 |
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:
barcode
inventory_levels
photo
price_structure
=>
price_tiles
product_group
properties
tax_category
Fetching a product
How to fetch a product:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/products/5a276944-e4f5-4811-ba42-7d1642567d5d' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "5a276944-e4f5-4811-ba42-7d1642567d5d",
"type": "products",
"attributes": {
"created_at": "2024-11-18T09:28:10.252927+00:00",
"updated_at": "2024-11-18T09:28:10.453272+00:00",
"archived": false,
"archived_at": null,
"type": "products",
"name": "iPad Pro",
"group_name": "iPad Pro",
"slug": "ipad-pro",
"sku": null,
"lead_time": 0,
"lag_time": 0,
"product_type": "rental",
"tracking_type": "bulk",
"trackable": false,
"has_variations": true,
"variation": true,
"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": [
"green"
],
"allow_shortage": false,
"shortage_limit": 0,
"product_group_id": "747fb42e-cd12-48c7-b37c-6dcaf0ffca50"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/products/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=barcode,inventory_levels,photo |
fields[] |
Array List of comma seperated fields to include ?fields[products]=created_at,updated_at,archived |
Includes
This request accepts the following includes:
barcode
inventory_levels
photo
price_structure
=>
price_tiles
product_group
properties
tax_category
Creating a product
How to create a product:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/products' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "products",
"attributes": {
"product_group_id": "2cc980c6-061e-4458-bed2-7f4813ce85a8",
"variation_values": [
"red"
]
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "eb012d9d-e415-4fd2-a2fb-046addd500d1",
"type": "products",
"attributes": {
"created_at": "2024-11-18T09:28:07.925095+00:00",
"updated_at": "2024-11-18T09:28:07.925095+00:00",
"archived": false,
"archived_at": null,
"type": "products",
"name": "iPad Pro - red",
"group_name": "iPad Pro",
"slug": "ipad-pro-red",
"sku": null,
"lead_time": 0,
"lag_time": 0,
"product_type": "rental",
"tracking_type": "bulk",
"trackable": false,
"has_variations": true,
"variation": true,
"extra_information": null,
"photo_url": null,
"description": null,
"excerpt": null,
"show_in_store": true,
"sorting_weight": 3,
"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": [
"red"
],
"allow_shortage": false,
"shortage_limit": 0,
"product_group_id": "2cc980c6-061e-4458-bed2-7f4813ce85a8"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/products
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=barcode,inventory_levels,photo |
fields[] |
Array List of comma seperated fields to include ?fields[products]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][slug] |
String Slug of the item |
data[attributes][sku] |
String Stock keeping unit |
data[attributes][has_variations] |
Boolean Whether variations are enabled. Not applicable for product_type service |
data[attributes][excerpt] |
String Excerpt used in the online store |
data[attributes][sorting_weight] |
Integer Defines sorting weight within its associated product group, the lower the weight - the higher it shows up in lists |
data[attributes][base_price_in_cents] |
Integer The value that is being calculated with. This value is writable if group has variations enabled, otherwise it's inherited from the group |
data[attributes][deposit_in_cents] |
Integer The value to use for deposit calculations |
data[attributes][seo_title] |
String SEO title tag |
data[attributes][seo_description] |
String SEO meta description tag |
data[attributes][photo_id] |
Uuid Associated Photo |
data[attributes][product_group_id] |
Uuid Associated Product group |
data[attributes][variation_values][] |
Array List of values for product_group.variation_fields (Should be in the same order) |
data[attributes][confirm_shortage] |
Boolean Whether to confirm the shortage (over limit by changing shortage_limit ) |
Includes
This request accepts the following includes:
barcode
inventory_levels
photo
price_structure
=>
price_tiles
product_group
properties
tax_category
Updating a product
How to update a product:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/products/9fa6b4da-88e4-4fa1-bf3b-86cefad2c99e' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "9fa6b4da-88e4-4fa1-bf3b-86cefad2c99e",
"type": "products",
"attributes": {
"variation_values": [
"red"
]
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "9fa6b4da-88e4-4fa1-bf3b-86cefad2c99e",
"type": "products",
"attributes": {
"created_at": "2024-11-18T09:28:04.755232+00:00",
"updated_at": "2024-11-18T09:28:05.193756+00:00",
"archived": false,
"archived_at": null,
"type": "products",
"name": "iPad Pro - red",
"group_name": "iPad Pro",
"slug": "ipad-pro",
"sku": null,
"lead_time": 0,
"lag_time": 0,
"product_type": "rental",
"tracking_type": "bulk",
"trackable": false,
"has_variations": true,
"variation": true,
"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": [
"red"
],
"allow_shortage": false,
"shortage_limit": 0,
"product_group_id": "7bc44027-580b-40e1-a695-c3703c81c8da"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/products/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=barcode,inventory_levels,photo |
fields[] |
Array List of comma seperated fields to include ?fields[products]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][slug] |
String Slug of the item |
data[attributes][sku] |
String Stock keeping unit |
data[attributes][has_variations] |
Boolean Whether variations are enabled. Not applicable for product_type service |
data[attributes][excerpt] |
String Excerpt used in the online store |
data[attributes][sorting_weight] |
Integer Defines sorting weight within its associated product group, the lower the weight - the higher it shows up in lists |
data[attributes][base_price_in_cents] |
Integer The value that is being calculated with. This value is writable if group has variations enabled, otherwise it's inherited from the group |
data[attributes][deposit_in_cents] |
Integer The value to use for deposit calculations |
data[attributes][seo_title] |
String SEO title tag |
data[attributes][seo_description] |
String SEO meta description tag |
data[attributes][photo_id] |
Uuid Associated Photo |
data[attributes][product_group_id] |
Uuid Associated Product group |
data[attributes][variation_values][] |
Array List of values for product_group.variation_fields (Should be in the same order) |
data[attributes][confirm_shortage] |
Boolean Whether to confirm the shortage (over limit by changing shortage_limit ) |
Includes
This request accepts the following includes:
barcode
inventory_levels
photo
price_structure
=>
price_tiles
product_group
properties
tax_category
Archiving a product
How to delete a product:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/products/9c269a83-49d5-4605-bdf5-c64d1cc3d137' \
--header 'content-type: application/json' \
--data '{}'
A 200 status response looks like this:
{
"data": {
"id": "9c269a83-49d5-4605-bdf5-c64d1cc3d137",
"type": "products",
"attributes": {
"created_at": "2024-11-18T09:28:05.755016+00:00",
"updated_at": "2024-11-18T09:28:06.167509+00:00",
"archived": true,
"archived_at": "2024-11-18T09:28:06.167509+00:00",
"type": "products",
"name": "iPad Pro",
"group_name": "iPad Pro",
"slug": "ipad-pro",
"sku": null,
"lead_time": 0,
"lag_time": 0,
"product_type": "rental",
"tracking_type": "bulk",
"trackable": false,
"has_variations": true,
"variation": true,
"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": [
"green"
],
"allow_shortage": false,
"shortage_limit": 0,
"product_group_id": "e71cc53e-1561-4189-befd-b1a688fcfc25"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/products/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[products]=created_at,updated_at,archived |
Includes
This request does not accept any includes
Properties
While Booqable comes with standard fields, like a customer's name and a product's SKU, you can add custom properties to capture additional information that's important for you or your customers.
Types
Properties can have different types and behave differently. These are the values
you can supply for each type:
text_field | Renders a text field |
---|---|
value |
String |
text_area | Renders a text area |
---|---|
value |
String |
phone | Renders a phone field |
---|---|
value |
String |
Renders an email field | |
---|---|
value |
String |
date | Renders a date picker |
---|---|
value |
String |
select | Renders a dropdown select |
---|---|
value |
String |
address | Renders multiple fields |
---|---|
first_name |
String |
last_name |
String |
address1 |
String |
address2 |
String |
city |
String |
region |
String |
zipcode |
String |
country |
String |
country_id |
UUID |
province_id |
UUID |
Properties inherit their configuration 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/properties
GET /api/boomerang/properties/{id}
POST /api/boomerang/properties
PUT /api/boomerang/properties/{id}
DELETE /api/boomerang/properties/{id}
Fields
Every 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 |
meets_validation_requirements |
Boolean Whether this property meets the validation requirements |
first_name |
String For type address |
last_name |
String For type address |
address1 |
String For type address |
address2 |
String For type address |
city |
String For type address |
region |
String For type address |
zipcode |
String For type address |
country |
String For type address |
country_id |
String For type address |
province_id |
String For type address |
latitude |
String For type address |
longitude |
String For type address |
value |
String For type text_field , text_area , phone , email , date_field , select |
default_property_id |
Uuid Associated Default property |
owner_id |
Uuid ID of its owner |
owner_type |
String The resource type of the owner. One of companies , customers , locations , orders , product_groups , stock_items , users , order_delivery_rates |
Relationships
Properties have the following relationships:
Name | Description |
---|---|
default_property |
Default properties readonly Associated Default property |
owner |
Customer, Order, Product group, Stock item, Order delivery rate Associated Owner |
Listing properties
How to fetch a list of properties:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/properties?include=owner' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "26cf9df0-e81f-4b3c-8dec-66c830a438f7",
"type": "properties",
"attributes": {
"created_at": "2024-11-18T09:24:28.813693+00:00",
"updated_at": "2024-11-18T09:24:28.813693+00:00",
"name": "Phone",
"identifier": "property_1",
"position": 0,
"property_type": "phone",
"show_on": [],
"validation_required": false,
"meets_validation_requirements": true,
"value": "+316000000",
"default_property_id": null,
"owner_id": "528c8cce-2149-42a6-a321-89f33d0ab2ab",
"owner_type": "customers"
},
"relationships": {
"owner": {
"data": {
"type": "customers",
"id": "528c8cce-2149-42a6-a321-89f33d0ab2ab"
}
}
}
}
],
"included": [
{
"id": "528c8cce-2149-42a6-a321-89f33d0ab2ab",
"type": "customers",
"attributes": {
"created_at": "2024-11-18T09:24:28.748777+00:00",
"updated_at": "2024-11-18T09:24:28.815767+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": {
"property_1": "+316000000"
},
"tag_list": [],
"merge_suggestion_customer_id": null,
"tax_region_id": null
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/properties
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[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 |
default_property_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:
owner
Fetching a property
How to fetch a properties:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/properties/88bf8e87-2103-4a11-a005-f752146112eb?include=owner' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "88bf8e87-2103-4a11-a005-f752146112eb",
"type": "properties",
"attributes": {
"created_at": "2024-11-18T09:24:31.937440+00:00",
"updated_at": "2024-11-18T09:24:31.937440+00:00",
"name": "Phone",
"identifier": "property_6",
"position": 0,
"property_type": "phone",
"show_on": [],
"validation_required": false,
"meets_validation_requirements": true,
"value": "+316000000",
"default_property_id": null,
"owner_id": "63e5b595-dd76-44c5-b05b-cd7af5b31f6a",
"owner_type": "customers"
},
"relationships": {
"owner": {
"data": {
"type": "customers",
"id": "63e5b595-dd76-44c5-b05b-cd7af5b31f6a"
}
}
}
},
"included": [
{
"id": "63e5b595-dd76-44c5-b05b-cd7af5b31f6a",
"type": "customers",
"attributes": {
"created_at": "2024-11-18T09:24:31.898157+00:00",
"updated_at": "2024-11-18T09:24:31.939221+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": {
"property_6": "+316000000"
},
"tag_list": [],
"merge_suggestion_customer_id": null,
"tax_region_id": null
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/properties/{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[properties]=created_at,updated_at,name |
Includes
This request accepts the following includes:
owner
Creating a property
How to create a property and assign it to an owner:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/properties' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "properties",
"attributes": {
"name": "Phone",
"property_type": "phone",
"value": "+316000000",
"owner_id": "f6840cf5-2d0d-4bfd-b7bf-3b929677f8f6",
"owner_type": "customers"
}
},
"include": "owner"
}'
A 201 status response looks like this:
{
"data": {
"id": "985e61d4-6372-4f2d-b8e7-c158ff081bad",
"type": "properties",
"attributes": {
"created_at": "2024-11-18T09:24:33.252791+00:00",
"updated_at": "2024-11-18T09:24:33.252791+00:00",
"name": "Phone",
"identifier": "phone",
"position": 0,
"property_type": "phone",
"show_on": [],
"validation_required": false,
"meets_validation_requirements": true,
"value": "+316000000",
"default_property_id": null,
"owner_id": "f6840cf5-2d0d-4bfd-b7bf-3b929677f8f6",
"owner_type": "customers"
},
"relationships": {
"owner": {
"data": {
"type": "customers",
"id": "f6840cf5-2d0d-4bfd-b7bf-3b929677f8f6"
}
}
}
},
"included": [
{
"id": "f6840cf5-2d0d-4bfd-b7bf-3b929677f8f6",
"type": "customers",
"attributes": {
"created_at": "2024-11-18T09:24:33.203650+00:00",
"updated_at": "2024-11-18T09:24:33.254767+00:00",
"archived": false,
"archived_at": null,
"number": 2,
"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": {
"phone": "+316000000"
},
"tag_list": [],
"merge_suggestion_customer_id": null,
"tax_region_id": null
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
POST /api/boomerang/properties
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[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][meets_validation_requirements] |
Boolean Whether this property meets the validation requirements |
data[attributes][first_name] |
String For type address |
data[attributes][last_name] |
String For type address |
data[attributes][address1] |
String For type address |
data[attributes][address2] |
String For type address |
data[attributes][city] |
String For type address |
data[attributes][region] |
String For type address |
data[attributes][zipcode] |
String For type address |
data[attributes][country] |
String For type address |
data[attributes][country_id] |
String For type address |
data[attributes][province_id] |
String For type address |
data[attributes][latitude] |
String For type address |
data[attributes][longitude] |
String For type address |
data[attributes][value] |
String For type text_field , text_area , phone , email , date_field , select |
data[attributes][default_property_id] |
Uuid Associated Default property |
data[attributes][owner_id] |
Uuid ID of its owner |
data[attributes][owner_type] |
String The resource type of the owner. One of companies , customers , locations , orders , product_groups , stock_items , users , order_delivery_rates |
Includes
This request accepts the following includes:
owner
Updating a property
How to update a property:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/properties/596f9d51-e202-4dd0-bf1b-ad1d6f946b52' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "596f9d51-e202-4dd0-bf1b-ad1d6f946b52",
"type": "properties",
"attributes": {
"value": "+316000001"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "596f9d51-e202-4dd0-bf1b-ad1d6f946b52",
"type": "properties",
"attributes": {
"created_at": "2024-11-18T09:24:31.384828+00:00",
"updated_at": "2024-11-18T09:24:31.436391+00:00",
"name": "Phone",
"identifier": "property_5",
"position": 0,
"property_type": "phone",
"show_on": [],
"validation_required": false,
"meets_validation_requirements": true,
"value": "+316000001",
"default_property_id": null,
"owner_id": "18e348f0-bf01-4305-9138-63df20281204",
"owner_type": "customers"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/properties/{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[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][meets_validation_requirements] |
Boolean Whether this property meets the validation requirements |
data[attributes][first_name] |
String For type address |
data[attributes][last_name] |
String For type address |
data[attributes][address1] |
String For type address |
data[attributes][address2] |
String For type address |
data[attributes][city] |
String For type address |
data[attributes][region] |
String For type address |
data[attributes][zipcode] |
String For type address |
data[attributes][country] |
String For type address |
data[attributes][country_id] |
String For type address |
data[attributes][province_id] |
String For type address |
data[attributes][latitude] |
String For type address |
data[attributes][longitude] |
String For type address |
data[attributes][value] |
String For type text_field , text_area , phone , email , date_field , select |
data[attributes][default_property_id] |
Uuid Associated Default property |
data[attributes][owner_id] |
Uuid ID of its owner |
data[attributes][owner_type] |
String The resource type of the owner. One of companies , customers , locations , orders , product_groups , stock_items , users , order_delivery_rates |
Includes
This request accepts the following includes:
owner
Deleting a property
How to delete a property:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/properties/922d4eea-2e25-4c1f-a012-353f0a9f53dc' \
--header 'content-type: application/json' \
--data '{}'
A 200 status response looks like this:
{
"data": {
"id": "922d4eea-2e25-4c1f-a012-353f0a9f53dc",
"type": "properties",
"attributes": {
"created_at": "2024-11-18T09:24:32.510937+00:00",
"updated_at": "2024-11-18T09:24:32.510937+00:00",
"name": "Phone",
"identifier": "property_7",
"position": 0,
"property_type": "phone",
"show_on": [],
"validation_required": false,
"meets_validation_requirements": null,
"value": "+316000000",
"default_property_id": null,
"owner_id": "03cdaa0c-73b3-4ff1-85ad-fba9056c0082",
"owner_type": "customers"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/properties/{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[properties]=created_at,updated_at,name |
Includes
This request accepts the following includes:
owner
Managing multiple properties on a resource
On the following resources you can manage multiple properties at once:
- Customers
- Product groups
- Orders
- Stock items
Creating properties that correspond with an existing default property (we've already created a default phone property for a customer):
curl --request \
--url 'https://example.booqable.com/api/boomerang/customers' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "customers",
"attributes": {
"name": "John Doe",
"properties_attributes": [
{
"identifier": "phone",
"value": "+316000000"
}
]
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "017f3cbd-7669-4080-bb47-7add3bc4932b",
"type": "customers",
"attributes": {
"created_at": "2024-11-18T09:24:30.058963+00:00",
"updated_at": "2024-11-18T09:24:30.062940+00:00",
"archived": false,
"archived_at": null,
"number": 2,
"name": "John Doe",
"email": null,
"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": {
"phone": "+316000000"
},
"tag_list": [],
"merge_suggestion_customer_id": null,
"tax_region_id": null
},
"relationships": {}
},
"meta": {}
}
Creating one-off properties (no corresponding default property):
curl --request \
--url 'https://example.booqable.com/api/boomerang/customers' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "customers",
"attributes": {
"name": "John Doe",
"properties_attributes": [
{
"name": "Phone",
"value": "+316000000",
"property_type": "phone"
}
]
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "7d65b68b-fa74-4716-bbe6-8cc120214892",
"type": "customers",
"attributes": {
"created_at": "2024-11-18T09:24:29.415361+00:00",
"updated_at": "2024-11-18T09:24:29.419513+00:00",
"archived": false,
"archived_at": null,
"number": 2,
"name": "John Doe",
"email": null,
"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": {
"phone": "+316000000"
},
"tag_list": [],
"merge_suggestion_customer_id": null,
"tax_region_id": null
},
"relationships": {}
},
"meta": {}
}
Deleting a property while updating another one:
curl --request \
--url 'https://example.booqable.com/api/boomerang/customers/3d7b1f51-9edd-42e1-8294-fcf0d394c2f5' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "customers",
"id": "3d7b1f51-9edd-42e1-8294-fcf0d394c2f5",
"attributes": {
"name": "John Doe",
"properties_attributes": [
{
"identifier": "phone",
"_destroy": true
},
{
"identifier": "birthday",
"value": "01-01-1970"
}
]
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "3d7b1f51-9edd-42e1-8294-fcf0d394c2f5",
"type": "customers",
"attributes": {
"created_at": "2024-11-18T09:24:30.744646+00:00",
"updated_at": "2024-11-18T09:24:30.831106+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": {
"birthday": "01-01-1970"
},
"tag_list": [],
"merge_suggestion_customer_id": null,
"tax_region_id": null
},
"relationships": {}
},
"meta": {}
}
Includes
All includes are allowed on this request
Provinces
The Province
resource describes provinces/states etc. in a country.
Fields
Every province 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 The name of the province/state. |
code |
String readonly The code of the province/state. |
position |
Integer readonly The position of the province/state in the list. |
country_id |
Uuid readonly The ID of the country the province/state belongs to. |
Listing provinces
How to fetch a list of provinces.:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/provinces' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "8cc070fd-3693-4940-b79b-e348c6ffc16a",
"type": "provinces",
"attributes": {
"created_at": "2024-11-18T09:22:27.057084+00:00",
"updated_at": "2024-11-18T09:22:27.057084+00:00",
"name": "Friesland",
"code": "FR",
"position": 0,
"country_id": "a795f587-f6d5-43b4-aba8-b0859d0cb648"
}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/provinces
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[provinces]=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 |
country_id |
Uuid eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request does not accept any includes
Sessions
The session tells you whether settings are changed since the last time they were being requested.
Every response includes a Session-Id
header which contains a session ID. If that ID does not
match with the ID of the last session that was fetched, this indicates that the following information
may have been changed:
- Employee's permissions
- Company's subscription
- Settings
- Default properties
- Clusters and Locations
- Operating rules
- Employee's notification subscriptions
When there's an ID mismatch, it's advised to fetch the session again to reload these resources.
Fields
Every session has the following fields:
Name | Description |
---|---|
id |
Uuid Primary key |
company_id |
Uuid Associated Company |
employee_id |
Uuid Associated Employee |
locations_updated_at |
Datetime When locations were last updated |
clusters_updated_at |
Datetime When the clusters were last updated |
default_properties_updated_at |
Datetime When the default properties were last updated |
notification_subscriptions_updated_at |
Datetime When the employee last made a change to their notification subscriptions |
countries_updated_at |
Datetime When the countries were last updated |
operating_rules_updated_at |
Datetime When the operating rules were last updated |
Relationships
Sessions have the following relationships:
Name | Description |
---|---|
app_subscriptions |
App subscriptions readonly Associated App subscriptions |
clusters |
Clusters readonly Associated Clusters |
company |
Companies readonly Associated Company |
default_properties |
Default properties readonly Associated Default properties |
employee |
Employees readonly Associated Employee |
locations |
Locations readonly Associated Locations |
operating_rules |
Operating rules readonly Associated Operating rules |
settings |
Settings readonly Associated Settings |
Fetching the session
How to fetch the session:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/sessions/current?extra_fields%5Bcompanies%5D=subscription&include=company%2Cemployee%2Csettings' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "4bb4e738-088a-506e-9ebc-a9a8e2f12880",
"type": "sessions",
"attributes": {
"updated_at": "2024-11-18T09:27:25.910380+00:00",
"company_id": "627f4155-a2f0-4083-a183-27aeb508a429",
"employee_id": "a2d5fbf0-9995-44cb-a99d-fa8e57d3512b",
"locations_updated_at": null,
"clusters_updated_at": null,
"default_properties_updated_at": null,
"notification_subscriptions_updated_at": "2024-11-18T09:27:25.914618+00:00",
"countries_updated_at": null,
"operating_rules_updated_at": null
},
"relationships": {
"company": {
"data": {
"type": "companies",
"id": "627f4155-a2f0-4083-a183-27aeb508a429"
}
},
"employee": {
"data": {
"type": "employees",
"id": "a2d5fbf0-9995-44cb-a99d-fa8e57d3512b"
}
},
"settings": {
"data": {
"type": "settings",
"id": "4ebd0208-8328-5d69-8c44-ec50939c0967"
}
}
}
},
"included": [
{
"id": "627f4155-a2f0-4083-a183-27aeb508a429",
"type": "companies",
"attributes": {
"created_at": "2024-11-18T09:27:25.889806+00:00",
"updated_at": "2024-11-18T09:27:25.899642+00:00",
"name": "Company name 258",
"slug": "company-name-258",
"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,
"custom_domain_validation": null,
"development": false,
"shop_theme_id": null,
"installed_online_store": false,
"source": null,
"medium": null,
"tenant_token": "d4b44d657f3adc30a4702fdf72b1de26",
"pending_subscription": false,
"team_size": null,
"projected_revenue": null,
"year_business_start": 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,
"subscription": {
"trial_ends_at": "2024-12-02T09:27:25.878Z",
"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",
"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
}
}
},
{
"id": "a2d5fbf0-9995-44cb-a99d-fa8e57d3512b",
"type": "employees",
"attributes": {
"created_at": "2024-11-18T09:27:25.910380+00:00",
"updated_at": "2024-11-18T09:27:25.910380+00:00",
"name": "John Doe",
"firstname": "John",
"lastname": "Doe",
"locale": null,
"email": "[email protected]",
"unconfirmed_email": null,
"viewed_whats_new_at": "2024-11-18T09:27:25.905972+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"
}
},
{
"id": "4ebd0208-8328-5d69-8c44-ec50939c0967",
"type": "settings",
"attributes": {
"currency": {
"name": "USD",
"decimal": ".",
"thousand": ",",
"symbol": "$",
"precision": 2,
"format": "%s%v"
},
"defaults": {
"timezone": "UTC",
"timezone_offset": 0,
"tax_category_id": null,
"tax_region_id": null,
"shop_start_location_id": null,
"shop_stop_location_id": null
},
"pricing": {
"enabled": true,
"tax_strategy": "exclusive",
"deposit_type": "percentage",
"deposit_value": 100,
"currency_format": "symbol",
"currency_position": "left"
},
"dates": {
"format": "DD-MM-YYYY",
"use_am_pm": false,
"first_day_of_week": 0
},
"orders": {
"use_times": true,
"start_type": "fixed",
"start_relative_offset": 0,
"start_fixed_at": "09:00",
"stop_type": "fixed",
"stop_relative_offset": 48,
"stop_fixed_at": "15:00"
},
"security": {
"sso_forced": false,
"2fa_forced": false,
"iprestrictions_enabled": false
},
"address": {
"fields_order": [
"zipcode",
"city",
"region"
]
},
"store": {
"enabled": true,
"public": true,
"send_order_confirmation": true,
"brand_color": "#136DEB",
"use_availability": true,
"use_prices": true,
"display_price": "period",
"show_powered_by": true,
"use_order_lag_time": false,
"order_lag_time_value": null,
"order_lag_time_interval": null,
"behaviors.add_button": "show_cart",
"behaviors.location_picker": "start_stop",
"payment_strategy": "none",
"payment_strategy_value": 30,
"payment_deposit": false,
"payment_methods": [],
"use_toc": false,
"toc_label": "",
"toc_content": "",
"use_business_hours": false,
"use_away_mode": false,
"period_type": "freely",
"use_times": true,
"use_coupons_in_checkout": true,
"time_increment": 60,
"show_product_availability": true,
"hide_product_availability_quantities": false,
"show_cart_availability": true,
"website": null,
"checkout_scripts": "",
"google_analytics_id": null,
"google_anlaytics_options": "{}",
"facebook_pixel_id": null,
"facebook_domain_verification": null
},
"user": {
"auth_enabled": false,
"allow_signup": true,
"allow_guest_checkout": true,
"require_verification": true
},
"documents": {
"show_tax_column": true,
"css": "",
"scss": "",
"scope_numbering_to_prefix": false,
"page_size": "a4"
},
"invoices": {
"footer": "",
"show_product_photos": true,
"show_stock_identifiers": false,
"show_free_lines": true,
"hide_section_lines": false,
"prefix": null,
"default_due_period": null
},
"quotes": {
"footer": "",
"body": "",
"show_product_photos": true,
"show_stock_identifiers": false,
"show_free_lines": true,
"hide_section_lines": false,
"prefix": null
},
"contracts": {
"footer": "",
"body": "",
"show_product_photos": true,
"show_stock_identifiers": false,
"show_free_lines": true,
"hide_section_lines": false,
"prefix": null
},
"labels": {
"customer": "customer",
"order": "order",
"quote": "quote",
"contract": "contract",
"packing_slip": "packing_slip",
"start": "pick_up",
"stop": "return"
},
"emails": {},
"deliveries": {
"distance_unit": "metric"
}
}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/sessions/current
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=app_subscriptions,clusters,company |
fields[] |
Array List of comma seperated fields to include ?fields[sessions]=company_id,employee_id,locations_updated_at |
Includes
This request accepts the following includes:
app_subscriptions
clusters
company
default_properties
employee
locations
operating_rules
settings
Settings
Settings are configured globally for a company account. They are divided in the following sections:
Currency
Information on how to display and handle the currency.
Name | Description |
---|---|
name |
String readonly Currency code |
decimal |
String readonly Decimal seperator |
thousand |
String readonly Thousand seperator |
symbol |
String readonly Currency symbol |
precision |
String readonly Precision |
format |
String readonly The format |
Defaults
Defaults derived from other resources.
Name | Description |
---|---|
timezone |
String readonly The default timezone (managed on the company resource) |
timezone_offset |
Integer readonly The UTC offset of the default timezone, in minutes |
tax_category_id |
Uuid readonly ID the default tax category |
tax_region_id |
Uuid readonly ID the default tax region |
Pricing
Configuration on how to handle and display pricing
Name | Description |
---|---|
enabled |
Boolean Whether pricing is enabled |
tax_strategy |
Uuid How taxes should be calculated, one of exclusive , inclusive |
deposit_type |
String Default deposit type (applied to orders if customer deposit type is default , one of none , percentage_total , percentage , fixed ) |
deposit_value |
Integer Default deposit value (applied to orders if customer deposit type is default ) |
currency_format |
String Currency format |
currency_position |
String Where to place the currency symbol, one of left , right |
Dates
Information on how to display dates. The settings below should be used (and combined) to select the format string for the date library being used.
Name | Description |
---|---|
format |
String How dates should be formatted. Supported formats are DD-MM-YYYY , MM-DD-YYYY and YYYY-MM-DD . |
use_am_pm |
Boolean Whether to use 24h clock or AM/PM |
first_day_of_week |
Integer Which day to display as first day of the week ( 0 for Sunday) |
Orders
Configuration for orders (these settings also apply to the online store)
Name | Description |
---|---|
use_times |
Boolean Whether time selection is enabled, if not, full days are always planned and calculated |
start_type |
String Behavior of default start time, one of fixed , relative |
start_relative_offset |
Integer Offset in seconds from now, used when start_type is relative |
start_fixed_at |
String Fixed time of day, e.g. 14:00 , used when start_type is fixed |
stop_type |
String Behavior of default stop time, one of fixed , relative |
stop_relative_offset |
Integer Offset in seconds from now, used when stop_type is relative |
stop_fixed_at |
String Fixed time of day, e.g. 14:00 , used when stop_type is fixed |
Security
Global security settings
Name | Description |
---|---|
sso_forced |
Boolean Whether to force SSO |
iprestrictions_enabled |
Boolean Whether IP restrictions are enabled |
Address
Settings on how to display addresses
Name | Description |
---|---|
fields_order |
Array Order of how the fields are displayed, e.g. ["zipcode", "city", "region"] |
Store
Settings for the online store
Name | Description |
---|---|
enabled |
Boolean Whether to accept online reservations |
public |
Boolean Whether to hosted online store is public |
send_order_confirmation |
Boolean Whether to send order confirmations automatically after checkout |
brand_color |
String Brand color as HEX code |
use_availability |
Boolean Whether to show availability and block checkouts when items are unavailable |
use_prices |
Boolean Whether to show prices |
display_price |
String One of period (label will be populated with actual period), charge (label will be populated with the name of the price tile), cheapest (show "starting from" as label) |
show_powered_by |
Boolean Whether to display "Powered by" in the cart |
use_order_lag_time |
Boolean Whether to prevent last-minute reservations |
order_lag_time_interval |
String One of minutes , hours , days , weeks , months |
order_lag_time_value |
Integer The value applied for order_lag_time_interval |
payment_strategy |
String One of none (no payment required at checkout), full (full payment required at checkout), partial (partial payment required at checkout) |
payment_strategy_value |
Integer Percentage to be paid at checkout (for payment_strategy partial ) |
payment_deposit |
Boolean Whether deposit should be paid during checkout |
payment_methods |
Array List of enabled payment methods, any of ideal , bancontact , eps , alipay , p24 , creditcard , paypal |
use_toc |
Boolean Wheter the agreement should be accepted during checkout |
toc_label |
String The label of the agreement checkbox |
toc_content |
String The contents of the actual agreement |
use_business_hours |
Boolean Whether to take opening hours into account while selecting a period (see operating rules for more information) |
use_away_mode |
Boolean Whether away mode is enabled (see operating rules for more information) |
period_type |
String How the period picker is setup, one of freely (free selection), timeslot_duration (select a day, time and duration), timeslot_fixed (fixed timeslots for days). See operating rules for more information |
use_times |
Boolean Whether to use time selection in the online store |
use_coupons_in_checkout |
Boolean Whether supplying coupons during checkout is enabled |
time_increment |
Integer Time increments for time selection (e.g. 15 , 30 , 60 ) |
show_product_availability |
Boolean Whether to show detailed product availability for products |
hide_product_availability_quantities |
Boolean Whether hide quantities in the product availability calendar |
show_cart_availability |
Boolean Whether to show on which dates the products in a cart are available during the period selection |
website |
String Website to use to redirect back to from the checkout |
checkout_scripts |
String Custom scripts to execute during checkout |
google_analytics_id |
String Google analytics ID to use for tracking |
facebook_pixel_id |
String Facebook pixel ID to use for tracking |
facebook_domain_verification |
String Content for the facebook-domain-verification meta tag |
User
Settings that apply to user accounts
Name | Description |
---|---|
auth_enabled |
Boolean Whether user accounts are enabled |
allow_signup |
Boolean Whether signup during checkout is allowed |
allow_guest_checkout |
Boolean Whether to allow guest checkouts |
require_verification |
Boolean Whether e-mail addresses need to be verified |
Documents
Settings that apply to all document types
Name | Description |
---|---|
show_tax_column |
Boolean Whether to show the tax column on lines |
css |
String Custom css used for documents |
scss |
String Custom scss used for documents |
scope_numbering_to_prefix |
Boolean Whether to scope numbering to prefix, e.g. 1980-1 , 1980-2 , 1981-1 or 1980-1 , 1980-2 , 1981-3 |
page_size |
String The page size to use for pdf downloads, one of a4 , letter |
Invoices
Settings that apply to invoices
Name | Description |
---|---|
footer |
String HTML formatted footer to display on invoices |
show_product_photos |
Boolean Whether to show product photos |
show_stock_identifiers |
Boolean Whether to show identifiers of the stock items that are booked |
show_free_lines |
Boolean Whether to display lines that don't have price |
hide_section_lines |
Boolean Whether to hide lines within a section, if enabled to total price of all lines in a section is summed and displayed next to the section |
prefix |
String Prefix to use for document numbering, e.g. {{year}} or {{customer_number}} , combinations are also possible {{year}}-{{order_number}} |
default_due_period |
Integer A period of time during which invoices can await payment, in seconds |
Quotes
Settings that apply to quotes
Name | Description |
---|---|
footer |
String HTML formatted footer to display on quotes |
body |
String HTML formatted body to display on quotes |
show_product_photos |
Boolean Whether to show product photos |
show_stock_identifiers |
Boolean Whether to show identifiers of the stock items that are booked |
show_free_lines |
Boolean Whether to display lines that don't have price |
hide_section_lines |
Boolean Whether to hide lines within a section, if enabled to total price of all lines in a section is summed and displayed next to the section |
prefix |
String Prefix to use for document numbering, e.g. {{year}} or {{customer_number}} , combinations are also possible {{year}}-{{order_number}} |
Contracts
Settings that apply to contracts
Name | Description |
---|---|
footer |
String HTML formatted footer to display on contracts |
body |
String HTML formatted body to display on contracts |
show_product_photos |
Boolean Whether to show product photos |
show_stock_identifiers |
Boolean Whether to show identifiers of the stock items that are booked |
show_free_lines |
Boolean Whether to display lines that don't have price |
hide_section_lines |
Boolean Whether to hide lines within a section, if enabled to total price of all lines in a section is summed and displayed next to the section |
prefix |
String Prefix to use for document numbering, e.g. {{year}} or {{customer_number}} , combinations are also possible {{year}}-{{order_number}} |
Labels
Customization settings for labels
Name | Description |
---|---|
customer |
String What to call a customer (one of customer , client , student `) |
order |
String What to call an order (one of order , booking , project `) |
quote |
String What to call a quote (one of quote , proposal ) |
contract |
String What to call a contract (one of contract , waiver ) |
packing_slip |
String What to call a packing slip (one of packing_slip , pull_sheet ) |
Labels
Settings for emails
Name | Description |
---|---|
bcc |
String BCC addresses to use for all emails |
Fields
Every setting has the following fields:
Name | Description |
---|---|
id |
Uuid Primary key |
currency |
Hash readonly Information on how to display and handle the currency (managed on Company resource) |
defaults |
Hash readonly Defaults derived from other resources |
pricing |
Hash Configuration on how to handle and display pricing |
dates |
Hash Information on how to display dates |
orders |
Hash Configuration for orders (these settings also apply to the online store) |
security |
Hash Global security settings |
address |
Hash Settings on how to display addresses |
store |
Hash Settings for the online store |
user |
Hash Settings that apply to user accounts |
documents |
Hash Settings that apply to all document types |
invoices |
Hash Settings that apply to invoices |
quotes |
Hash Settings that apply to quotes |
contracts |
Hash Settings that apply to contracts |
labels |
Hash Customization settings for labels |
emails |
Hash Settings for emails |
deliveries |
Hash Settings for deliveries |
dashboard |
Hash Dashboard settings (Used internally by Booqable) |
setup_checklist |
Hash Setup checklist settings (Used internally by Booqable) |
onboarding |
Hash Onboarding settings (Used internally by Booqable) |
instructions |
Hash Settings for in app instructions (Used internally by Booqable) |
tracking |
Hash Tracking settings (Used internally by Booqable) |
feature_enrollments |
Hash Feature enrollments settings (Used internally by Booqable) |
Fetching settings
How to fetch settings:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/settings/current' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "1f5650da-6406-55f0-bb69-a750e18473cd",
"type": "settings",
"attributes": {
"updated_at": "2024-11-18T09:24:11.405355+00:00",
"currency": {
"name": "USD",
"decimal": ".",
"thousand": ",",
"symbol": "$",
"precision": 2,
"format": "%s%v"
},
"defaults": {
"timezone": "UTC",
"timezone_offset": 0,
"tax_category_id": "90d36861-8677-4f46-a92b-cc1e3fe6b6bc",
"tax_region_id": "88629637-c4d3-4566-94d5-7bfd1381e62b",
"shop_start_location_id": null,
"shop_stop_location_id": null
},
"pricing": {
"enabled": true,
"tax_strategy": "exclusive",
"deposit_type": "percentage",
"deposit_value": 100,
"currency_format": "symbol",
"currency_position": "left"
},
"dates": {
"format": "DD-MM-YYYY",
"use_am_pm": false,
"first_day_of_week": 0
},
"orders": {
"use_times": true,
"start_type": "fixed",
"start_relative_offset": 0,
"start_fixed_at": "09:00",
"stop_type": "fixed",
"stop_relative_offset": 48,
"stop_fixed_at": "15:00"
},
"security": {
"sso_forced": false,
"2fa_forced": false,
"iprestrictions_enabled": false
},
"address": {
"fields_order": [
"zipcode",
"city",
"region"
]
},
"store": {
"enabled": true,
"public": true,
"send_order_confirmation": true,
"brand_color": "#136DEB",
"use_availability": true,
"use_prices": true,
"display_price": "period",
"show_powered_by": true,
"use_order_lag_time": false,
"order_lag_time_value": null,
"order_lag_time_interval": null,
"behaviors.add_button": "show_cart",
"behaviors.location_picker": "start_stop",
"payment_strategy": "none",
"payment_strategy_value": 30,
"payment_deposit": false,
"payment_methods": [],
"use_toc": false,
"toc_label": "",
"toc_content": "",
"use_business_hours": false,
"use_away_mode": false,
"period_type": "freely",
"use_times": true,
"use_coupons_in_checkout": true,
"time_increment": 60,
"show_product_availability": true,
"hide_product_availability_quantities": false,
"show_cart_availability": true,
"website": null,
"checkout_scripts": "",
"google_analytics_id": null,
"google_anlaytics_options": "{}",
"facebook_pixel_id": null,
"facebook_domain_verification": null
},
"user": {
"auth_enabled": false,
"allow_signup": true,
"allow_guest_checkout": true,
"require_verification": true
},
"documents": {
"show_tax_column": true,
"css": "",
"scss": "",
"scope_numbering_to_prefix": false,
"page_size": "a4"
},
"invoices": {
"footer": "",
"show_product_photos": true,
"show_stock_identifiers": false,
"show_free_lines": true,
"hide_section_lines": false,
"prefix": "{{year}}-{{order_number}}",
"default_due_period": null
},
"quotes": {
"footer": "",
"body": "",
"show_product_photos": true,
"show_stock_identifiers": false,
"show_free_lines": true,
"hide_section_lines": false,
"prefix": "{{year}}-{{customer_number}}"
},
"contracts": {
"footer": "",
"body": "",
"show_product_photos": true,
"show_stock_identifiers": false,
"show_free_lines": true,
"hide_section_lines": false,
"prefix": null
},
"labels": {
"customer": "customer",
"order": "order",
"quote": "quote",
"contract": "contract",
"packing_slip": "packing_slip",
"start": "pick_up",
"stop": "return"
},
"emails": {},
"deliveries": {
"distance_unit": "metric"
}
}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/settings/current
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[settings]=currency,defaults,pricing |
Includes
This request does not accept any includes
Signatures
Signatures are used to confirm and store a signature for contracts and quotes.
This resource can also be used to update the signature of a document or add one later.
When a contract is confirmed and a signature is supplied the has_signed_contract
flag will
be set accordingly on the associated order.
Fields
Every signature has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
signature_base64 |
String required writeonly Base64 encoded signature, use this field to store a signature |
document_id |
Uuid Associated Document |
order_id |
Uuid readonly Associated Order |
customer_id |
Uuid readonly Associated Customer |
Relationships
Signatures have the following relationships:
Name | Description |
---|---|
customer |
Customers readonly Associated Customer |
document |
Documents readonly Associated Document |
order |
Orders readonly Associated Order |
Confirm a contract
Confirm and add a signature to a contract:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/signatures' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "signatures",
"attributes": {
"document_id": "a6c11f5f-c187-40bd-a6e4-578f21141c31",
"signature_base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAAAXNSR0IArs4c6QAAFwJJREFUeF7tnX+MHsV5x5+9s7mzTXxnjO/8C2N+2wcGwgW3wY1rkahNRBJRIVCSNlEihJQgJY3SSqWNhCr1HyI1ilI1IqRKFJQmVSE/SgiYmIRE/lXXmACWsR0w4J/x+cfhc2zOd7bvtnrefed9Z+ed3Z2dndmd3X3uH8zd7uzM93k+8zzPzLz7er7v+0A/pAApIFXAI0DIM0iBaAUIEOe9AwO81+hl+1/hfxsbAv8AY42WuyECpNz2o95bVoAAsSwwNV9uBRQBodhbbjNT73UVUAREt3m6r1YKVHAezQ2QCmpXK9+3M9g0XpHmWnO9zQ0QcRXG3BCoJVLAngK5AmJvGC63rDPz6dzjsgbl7VtpASEXKo/TldlWpQVEzz3KbCpxxFUai7o18x51zQBRNwRdWTMFIsgjQGrmB2rDzXueVutV6qsMnM0hQFKrTjfEK1AiuBS6SoBU1d8VjF/VoZscFwFiUs2ktshpkxRy7u+FA0I+45xPWOlQWe1cOCBWrCE0Wlbj5KGNW8/QtZTufcmjrwUgyTLQFfoKhJ0z+D9bDmur3ejREyD6nkF35qVA/ly0RkaA5GVkek4pFSBASmk2hU4XOOsq9I67xO2OEiDprElX10wBAqRmBqfhplOg1oC4HdzTGZKutqNArQGxIym1WiUFCJAqWbNSY3EjvhMgCk7lhqkUOkqXGFeAADEuKTXoigImJjYCxBVrUj8MKmACjaA7BIhBsyQ1Zc5sSU9y9e/lU4AAcdWXqF9OKECAOGEGW50o34xtSwnddgkQXeXovlooQIDUwsw4yDJHk+L6ToCkBKQ4U7GOFt+DlJKV+vLcACGzuugnEVYhY7WMlRsgLroH9YkUSFKAAElSKOvfVWZjlWuy9sP0/WXss4YGBIiGaHRLfRQgQOpjaxqphgIEiIZoxd+Sb36T79OKV5fvAQHilj0q05vyQBXfUwKkSJdM5UWpLi5yVJV6NgFSKXPSYEwrQICYVpTaq5QCAiAUxitlXRpMZgUogmSWkBpwUgFDcz0B4qR1qVOuKFAwIIYwL0RNB/vuYJeMmKbAcRUMiBH5OhspUFBLI6JmC1KgmoDoiklg6SpX2fsIkMqalgZmYr4jQMiPSIEYBQiQWPcwMQeR/5VZAScBIbcss0tVq+9OAlItiVVGQ1OCikpFXEOA5Ko6gZBabuuS0XH31DahG0gBpkCtIoj1yYj8ypIChiyn0UytALFkPWq2wgoQIBU2Lg0tuwIESHYNrbWgkRFY60tdGyZA6mp5GreSAnJAaOpSEi/rRaMXAc5OAxyY8OGE78GJCRQ++FnQ68F1PQB9XQCXdgHMn5H1aVnur69DUATJ4jcp70UgjlwE2Hrah33jAPsnAXaN+3BxBsCMi+3G8P/xZ94sr/HfoV6A63sAVvR48L5ZAFdekvLBjl5eBuwcBqQM8ql5HoKx6R2AF0d9+Om4D11TnfdNdwe/8wMmGtCIPwyYu/sAPtALsHZu82K1btBVUQrEuJrDgJTZnoHiPBjPjLbTpynO+ae72uMUIYkChUUXBOVjcz24uVdfq+pMQ/oaxN1ZGUBcM/T2UYCnjvuw/kQbDDQED4QqKLJowoyKUeUz8wA+1e8VXKekcVDXrBXd98oAksY8Nq/FqPH0YYB/OzgNM8/LgeAhwb4wUMTfq6RdLJpgnfLxuR7c02dzdPVrmwAxaHOMGj/c78O2Uz50TbfhUAVCBopO2vU3/V5lCnmD5tFqigDRki18UyNq7AN49PA0zLgQ/I05Np9WqaRXptKuhwY8WDen6OXhcn91KNouDIix1NBYQwbc124TGDV+useHLafbtYas8Ga/i4ompusTrE2wiKdoks3+FEE09TtzDuAnBwD+4+1puGSy3cjFmdyqlGSFKgkUVYDS1CcYTWpTmxiem6sLiGGheI5Y1NjOrVCx/Qu8LgoSPvWSgRKVXkUV8vL6pHPg+UcTi+JrTmi6t2UHpDpaJGrIosaLbwK8Pj4dup45twoouvWJKihRy8Jr5nlwfx9tMCYamrsgOyBpnlbia98YAfjuPh9ePuKD16TA9/zwvgamV81SJA0oeaZd5dw3Kc5xCBAF7X/7NsCTuwHeHuMK8dbRkDAk/CyP/24dHeFqE7EgZxHFJCghQIVjKwgJ7pv83YJsu/AK0pX+EgIkxoSYUv1mD8C39/jQ3Tw/hY4nPx4SDQrvrHE1SlZQZP0KQSoBRbWAr1EmHfIIAiQCEEypfvYSwJbjsqgR3KQCCl9466Rd4nOyFvJifcIK+M9fVqajKvkFJgJEovWmPQBPvOjDkfPBH6OjhhySRprVHT6DlRUU1eVf3Y1GLOAp5ep0BgKE0wRTqh+/BPD0Xh+6m5/PEB076vStSjTh65O80i4+AvGrZ7Jj9RhNVFOu/ObwYp9EgDT1ZynVSweCmT9uxk4bUcTVrihQ+P2TNIW8ybSLUq4wkAQIALCUanQsEEfF4eIgca0+0Um7KOUKfKHWgLCU6rmdfuu4yFRz+TYOFFtpF6t32ByW9diKaoEfdWwFo8nXB2u2sSgs19UWEEypNmwH2PZmUG/wTs9DwoOSV9rFg6Kbdqn0W/b5E3H/pO51iWFAyrFavns/wE82+vDmsXC+yUMSrETJ/x4FCnOu1oYfd3/W/RPVaKIaNaIAivr8yecWelDHpWDDgBS74qDy9B2/A/jx/wKMNnfFL0jeEBIHilZ9gqd6vfauusqKl4vLwne/x4MvLqnOh7FUpvPaAIL1xgvbAH62w4eeic5VKlOglKU+Ud1XESPKTbM9eHh5fY6oOA6ICuPJcePsyQl4fGsv7HwVDxoG14vpEGtFBCVr2sWeZWP/JK/6RNw/QUg+uagenzFxHJCGewX5iebPyRGARzf4cGS/vAGxNsCrTEUTPs+XPYefnfNIu1TrE5VlYTyy8veDHnx+UN82mibN9bYSAKKvx943AL6/AeDc4faxj8lZne2pRhNx6Vcs5LXqE+6FcdGHDYVj9dyhQ53zXarpVRIoF2YGkNw7v7rnuCoLCBbj658HGD3lt9IpHg2ToEStdsXN2CZ34/mUEf+tuuKV5W0rjbF1B6nqR+d58I9XVBOSBECypTf6c7/+nawYf2FDu94QHYi1LoMkqj5Jm3bx0SZuWRgTlKmItyuqpF1iGscrpwOKShQU+8UgcXaFK4MbVyqCIBxbfwOwfqPfeGmbrJ4QDwniNSajiZh2qYAi3iMWxVlAkUHSgJLbozH1+fgb51RjhYvnqTKAND7c9AzApq3hY+ZsRhUjQN6gqMzMadOuINq5VZ+snFsNSJjflBiQNue4jLv+2V7Y/ooPMycBLvREp2g8KKqQsNZ0VrwKqU+8doSIKuLF+ijrpxn59hCSLy2uxhmuEgMSuC0u4z73pA+793ZCoQqKrEaJSrvEekKWxrGeuHS+S2W1ixXevLPrFvJVgaTUgDA49u0EOB/xpTIqkIyPH2n49MTkaIuyc+dPSsPQuXNHoWtgWftvPsDM7tmt/7+kb0nr3zP6F3a0oXJamK9botIuBrVKfaJ7bCUKlKh0Ufx9FSApLSAIx4bHfXh9X9gHo0BpzPTN1Ovddw/BWTgF3ul3YHzWNEydOhp6ly5eK+5Sy6IMe7LsWvxbT38AkndpP8yeuaDxb4Qmj7Qr6G8+9UlclJnsBfjecq+0X/ZTICD6a29RcPCo8KCcHzsIZ7vPwrnzx2H83SBahFZxhFO7fDtRzi+rX6Kuneqahu6mF4nQePPbUUZlZk5byKt+mlGcFGSRSfe1RFj3fefackJSICDSDCbxlwyOA7sAcHaK+jk73oZi8o9HOmdtCRT88qrYriooUdex9hAW/mf23OWtCDM9GE7J4vZP4l7xo5J2iWlcVDSUHd3XWRbOBxL9STfKj0oFCA+HOCAGCwPjzMjLoQ9BiVGj5bAGQEkTTRr9ECBhfWGw9C5dFRqeKih4E9vdbvxbugFpNu0SnxMXBW1CEqBRRkAM9TkJDgTjxNRbcPGdZgoV8bXJYv4fBU5cNBHTEebNOqAsW3wZXLmkHxYtmAODl89pgXFwrBfO9SyDQ6M+HD8b/Jp3ePvH6gPDJe7G466j8DI9PjqJfUZInhjqyvS9iolphsELrEYQQ2wA7nP8z3/1wKHtnSMfnT4I7xza1FjF8rkZkzeSTK+8QeGhWrK0H/701iVw4zUL4OahpfAeyQFKvB43P0dOA+z5A8DeowDbjgYnBPIAxeb+ybWXl2cz0SogJkBGJ9nxI4CXn223NjnbhzMnX4N3/VMwNnmgo75wARTZe6/W3LIMbnnvQrjz/ddHQhGl2ZkJgEMjAP93GOB3b/kwMh6+Uny7vO3Pn8QV8WK0k0UUhOTrV7v/6UTnAdn+BMDm/247w/mJE3B0ai+cGQ+DIYsIqqDI7tVJvWQFOqYUCMYH110dGy3STCb4wonN+zpBUU27rNcnCWkXe/5d8z34ynXyU8Cmso80usqubQLiSnfCXdz9PMBz327/7uT4Ljhx+lWYmhGct4pMk7jhiJDEpV6qaVfDwDFLwyydWn27WTBEA2YFJaqIT6p3WD8S65Nmyhu3T/KhJR7861XufujK2QiCn+fY/S2Ak2MAfNQQnUTVqVWjSSx4wsOjILnuhgH4sw8t10qldGY8fEvLL14LahT2ylRxIjC6f4KNN30668d+EZ4vL+2Czy7XGbn9e5wEBFesNn4NYP/BAI6DxzbAxGz5KV0mUZGgsIiCYAwPLYSPfvh6uPTymE0aC3bFWu2V/cFLt+Pqk6z7J600Dt/Swo1DNZrIohOmod8acnMj0TlAcMXq59/tgZHtHmBKdXLs1Y5PBLIUS+ZnuYPiA0zPALjtjmXw4F+vhcs7j19ZwCG6Sfa2yKRCXkx72P5JER/7Reg+MMeDr6xyr2h3DhAsyl94/AT8cfpYAw7+R1wZCoHC1R2qRbeJtOuaoQG4+54hYwW4KZpY2vXiofivYQgBwb2/S2WTUZbG6dYnCMlHFkQX7Um62KqinQLk9S0jsO17C2HHjh+2NqhUDg1GRRQb0YTVKJgWfOKvbi4knUpyFvZ39g1Zz+8KNhtd3z9BSL60zK16xBlAMLV69pHjsPn5TR0nabNAkqboVokoCN1tty2FtR+/FtYML1X11UKvY1/tgNEET7nIQIl6barsjS/t1xWpfe1cmvoEjwx9Z2UXrJ5fqGSthzsDyKYfvQ1Pfm1r6/yU8rENoVjMWp/IloVZKnHFvD4Y/siVcNc9N6fe6DNr7vQJhelowhYm4k4L4zUqH9QSP82IS79R+yNmdUxuzQlAcNXqsS88A8feGmsAgiuILHNWBSW2PuF0UK1PGsZtruNjn2653XLUSO/zydaVXKESTZhj29iNx7aTIgq+lO6rN3XB3QNaQwxuMqSnE4D8/BuvwK++/1pLDfF1n0qQNKnKAooMnkWDrkSNDM4i3CpGk0Y04M6xqe7Ih+7pbk5swoe0+EI+zfmu1fM9ePiW4t+1VTggfPQQXUALFCGsBwaK3kOJiig4y930/qXwwBfWFb50aw6NcEtx0UR07KhoIsIVVZ/ofOz3H27NGEUMCFc4IGL0kI0pb1AGFlcvakT5io1owtcnSdGJ9UuWdr1voPgoUigguHL1zQd+Daf2jMH5mFf18LMZE1SWdon5bdS1ccvCK9ZWO2pEgSJGkyTHzqM+QWi+Oay4omWo5hD1KRQQ3Pf49wd/3fp+wCRITIIiQjL/ivpEDd1oIupv9HwXd16Rjyb3X9MFn11hIFfSbKJQQDC92vhYuzjHMahAogqK6v7JXX+5Ev78/uHK1hppfSMpmpiuT+IK+TV9Hnx12CtsWb0wQDD3feqhLfDKL+Vf3GEbFDRK39VzHdnXSOvC9q+X1Sam066k9tiE+Y3VimmWBVkKAwTrj8fu+xUcO3w6tMQojtE0KDMuBF+Q8+G7VlDUUHAoFk1eOhBeCcy6LKyyG4/dQ1v9y1AXrLtKobOmLuHqGScAEWcS2ThVQFFZ7Zpzw1x44MHbYdFtC62EbUu1oinTa7WjEk3i0q6GfRO+KChuR/4zK4urQ5wBhFlOPIatE1FEUFio/ti9N8Kdn16R+2c1tLzSwZtktUlSmpRmtQvbkr0NUgcQUxNVGBBTrSoa9z//dgvsXC+vQeJACaIJfyCl84EICX66Dgv1O9Ysh9X3XQPXryn4wxqKurh8Gftg1s43ADZyX21nEhSEhLWHdnxkbQ1rEBQADyg+/c9bI/0hazQZvLof1t47BO/9i0UUNQxTF5V2mQbl2ku74JE7wUo6rCJJYSkWdg6PmTz+qV80CvW4n+RoEr4bwVi1dgnc8clbaelWxQsyXMNeHPHsruCdXSy9VX0bZNK3aX3iVq+++yBoF9wL2fxoeC8kyl5JEWXR4j5Y/sFFtDqVweF1b+U/wci/WTUtKPzm41X9Hnx5GOC6vDNjF1axmCFwufepf9oBr/72gLJtRNEZGKvWLaE6Q1lFwxf6AI2X2x0L3rDCPpzFnpJ2WRiXdx/6Ey/f5V2JJIWmWKw/mGr98uHNqSGZt5JSKcNubqQ5rE8QFPYWSPZuYdX6BOG4b7iI1KpzlcoJQFA4jCQv/GAvvPH04ciaBGchjBaDq+Y1VqUW39BvsPjOeQnPiCsmNBIzpLxGizUKe7cwvohbfCURjoDVLQjGsvke3DsEhUUOURdnAOFTrj/8fgz2bh+BC+NTcO74BMwa6IWBqy6DwStnGYYiDy+lZ6AC7EXcI6cA9o0CnBDWZVYsApg7D2B4YXErVjJLuQFIXtOZs75aTwEQGvyJert9vuaS28ANQPJVgp7mogKOzhEEiIvOQn1yRgEFQBxFW1XCkndfdZh0nR0FFACx82BqlRQogwIESBmsRH0sTIFqAkJpVWEO1X5wNYxQTUAccA/qQl4K2AWRALFmR7uG0+u2i33SG0ledxEgeSlNzymlAoYBoRnKihc4Jqtj3UkteZr+xwCSppnUfaQbSIFSKGA4gpRizNRJUkBZAQJEWaoKXEhJQWojEiCpJavLDTWmyaWP3NbF3Wic5VTAkQhierYy3V7JjFvD4dsasiOAlMwBXemuLa9wZXwO9IMAkRqBPM8B33SiC/kBUrjPFd4BJwxOnUinQH6ApOsXXa2gACGvIFLGSwiQjALS7dVWwCAgNJ9V21XqOTqDgNRTQBp1tRUgQKptXxpdRgUIkIwC0u3VVoAAqbZ9aXQZFSBAMgro8u20bJLFOoF6BEgWDeneyitAgFTexDTALAoQIFnUo3srrwABUnkTmxtgHWsaAsSc/zjRUvFOXHwPwGAXCBAn3Np+Jwz6jP3OWniC7vg7AdFtycKgqElSoGgFKIIUbQF6vr4COUzmBIi+eejOiijQ5qyTODuA5EA22ianx1TEDWgYOgrYAUSnJ3QPKeCgAu4CwoUHihQOek5NuuQuIDUxAA3TbQXqCQiFJCteWUVZPX/a98GzolfJGq2ieUtmgsTuqttI/cr4h9YzgiQagi4gBQIFCBDyBFIgRoFaAhKEX1NBuFNdey2TL+etQPkAqbL3VXlseXu2oeeVDxBDA69XM0Serr0JEF3l6L5aKECA1MLMNMhkBeRRlgBJVq74KyhDKswGdgGpkWFrNNTCnLWIB9sFpIgR0TNJAYMK5AsITbMGTUdN5aFAvoDkMaLaPINmmzxMTYDkoXLaZ5DvSxSzJUp8uzUExJbQaSmg68ugQA0BccEsFYG0IsOI8whv2vf9wj8OUgGhKzAEF2YO5/pAEcQ5k0R0iAgsxFIOA0IeUYhH0ENDCjgMCFnKLQWKm7CKezJ9ojC9DxZprfS9bd5Ryk5rj9bIjU3JKIIYUZMa0VHA9ic7dfok3kOAZFGRJuYs6pXi3v8HOZ5zbDYLrEsAAAAASUVORK5CYII=\n"
}
},
"include": "document,order",
"fields": {
"orders": "has_signed_contract"
}
}'
A 200 status response looks like this:
{
"data": {
"id": "94aa15ba-5d55-5108-9355-ed7a65da0874",
"type": "signatures",
"attributes": {
"document_id": "a6c11f5f-c187-40bd-a6e4-578f21141c31",
"order_id": "19a87214-8c53-4aa1-9201-f8e7f72eb70b",
"customer_id": "c2fbf00b-3c00-4170-b6a9-b45349d9c98f"
},
"relationships": {
"document": {
"data": {
"type": "documents",
"id": "a6c11f5f-c187-40bd-a6e4-578f21141c31"
}
},
"order": {
"data": {
"type": "orders",
"id": "19a87214-8c53-4aa1-9201-f8e7f72eb70b"
}
}
}
},
"included": [
{
"id": "a6c11f5f-c187-40bd-a6e4-578f21141c31",
"type": "documents",
"attributes": {
"created_at": "2024-11-18T09:27:57.547706+00:00",
"updated_at": "2024-11-18T09:27:57.603534+00:00",
"archived": false,
"archived_at": null,
"document_type": "contract",
"number": 1,
"prefix": null,
"prefix_with_number": "1",
"date": "2024-11-18",
"due_date": null,
"name": "John Doe",
"address": null,
"reference": null,
"revised": false,
"finalized": true,
"sent": false,
"confirmed": true,
"status": "confirmed",
"signature_url": "/uploads/09ec624ef026cb3e013cef3065aaa172/document/contract/signature/a6c11f5f-c187-40bd-a6e4-578f21141c31/5bb313ab-dc09-45d6-a194-b151f8f5feaa.png",
"deposit_type": "none",
"deposit_value": 0.0,
"tag_list": [],
"price_in_cents": 0,
"grand_total_in_cents": 0,
"grand_total_with_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,
"tax_in_cents": 0,
"discount_percentage": 0.0,
"order_id": "19a87214-8c53-4aa1-9201-f8e7f72eb70b",
"customer_id": "c2fbf00b-3c00-4170-b6a9-b45349d9c98f",
"tax_region_id": null,
"coupon_id": null
},
"relationships": {}
},
{
"id": "19a87214-8c53-4aa1-9201-f8e7f72eb70b",
"type": "orders",
"attributes": {
"has_signed_contract": true
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
POST /api/boomerang/signatures
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=document,order,customer |
fields[] |
Array List of comma seperated fields to include ?fields[signatures]=document_id,order_id,customer_id |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][signature_base64] |
String Base64 encoded signature, use this field to store a signature |
data[attributes][document_id] |
Uuid Associated Document |
Includes
This request accepts the following includes:
document
order
customer
Sortings
A convienient way to bulk update positions for supported models.
Fields
Every sorting has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
type |
String_enum writeonly Type of model to update. Any of bundle_items , default_properties , lines , photos , properties , tax_rates , collection_items , products |
ids |
Array_of_strings writeonly Array of ids, positions are determined by the order of the array |
Sorting a resource
How to update positions:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/sortings' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "sorting",
"attributes": {
"type": "default_properties",
"ids": [
"bb7f4276-da73-494f-8d73-54b7f5041d92",
"cd6d9345-70b5-49c7-bb07-0f367d7da7dc",
"c8beb36c-ecbf-43a6-98cc-ed52272f66ba",
"59e9fb5f-4855-4e17-a8a0-f224c8cedea7",
"552d9ad0-341b-4b2c-b015-16e9cf01cf50"
]
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "53550759-e6c0-5d3c-b928-aa062ab05149",
"type": "sortings"
},
"meta": {}
}
HTTP Request
POST /api/boomerang/sortings
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][type] |
String_enum Type of model to update. Any of bundle_items , default_properties , lines , photos , properties , tax_rates , collection_items , products |
data[attributes][ids] |
Array_of_strings Array of ids, positions are determined by the order of the array |
Includes
This request does not accept any includes
Stock item plannings
Stock item plannings hold information about the planning of individual stock items (for trackable products). They make it possible to know precisely which stock items have been where and define when an item is available during a given period.
Stock item plannings are never directly created or updated through their resource; instead they are created by booking or specifying stock items; they are updated by starting or stoppinmg them. See the OrderFulfilments resource for examples.
Endpoints
GET /api/boomerang/stock_item_plannings
DELETE /api/boomerang/stock_item_plannings/{id}
Fields
Every stock item planning 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 stock item planning is archived |
archived_at |
Datetime nullable readonly When the stock item planning was archived |
reserved |
Boolean readonly Wheter stock item is reserved, meaning it's unavailable for other orders |
started |
Boolean readonly Wheter stock item is started |
stopped |
Boolean readonly Wheter stock item is stopped. Meaning it's available again |
stock_item_id |
Uuid readonly Associated Stock item |
planning_id |
Uuid readonly Associated Planning |
order_id |
Uuid readonly Associated Order |
Relationships
Stock item plannings have the following relationships:
Name | Description |
---|---|
order |
Orders readonly Associated Order |
planning |
Plannings readonly Associated Planning |
stock_item |
Stock items readonly Associated Stock item |
Listing stock item plannings
How to fetch a list of stock item plannings:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/stock_item_plannings' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "4ad3c7af-cfa0-43c0-9f34-5daae8a36669",
"type": "stock_item_plannings",
"attributes": {
"created_at": "2024-11-18T09:25:18.245107+00:00",
"updated_at": "2024-11-18T09:25:18.245107+00:00",
"archived": false,
"archived_at": null,
"reserved": false,
"started": false,
"stopped": false,
"stock_item_id": "eaa2c494-5168-4ad3-836f-aa09f20e5185",
"planning_id": "870fd7e6-2392-40aa-9134-8c4005e7d04d",
"order_id": "717daba6-e911-45e7-aa81-fee3bd75a543"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/stock_item_plannings
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=stock_item,planning,order |
fields[] |
Array List of comma seperated fields to include ?fields[stock_item_plannings]=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 |
reserved |
Boolean eq |
started |
Boolean eq |
stopped |
Boolean eq |
stock_item_id |
Uuid eq , not_eq |
planning_id |
Uuid eq , not_eq |
order_id |
Uuid eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request accepts the following includes:
stock_item
=>
product
=>
photo
planning
order
Archiving a stock_item planning
How to archive a stock item planning:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/stock_item_plannings/bd731992-db6e-4968-8521-3a5188892e90' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "bd731992-db6e-4968-8521-3a5188892e90",
"type": "stock_item_plannings",
"attributes": {
"created_at": "2024-11-18T09:25:17.350471+00:00",
"updated_at": "2024-11-18T09:25:17.350471+00:00",
"archived": false,
"archived_at": null,
"reserved": false,
"started": false,
"stopped": false,
"stock_item_id": "3f3b5e57-68a2-4e5a-a097-7bc925d3212d",
"planning_id": "7de7367a-6680-465d-b4bf-fd857af7b5d4",
"order_id": "28c2c0b5-6654-4672-9a56-41f7badb7d93"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/stock_item_plannings/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[stock_item_plannings]=created_at,updated_at,archived |
Includes
This request does not accept any includes
Stock items
For trackable products, each stock item is tracked and managed individually. Each stock item has a unique identifier that helps to keep track of it throughout Booqable.
A stock item can have one of the following types:
- Regular: Regular stock item (
from
andtill
dates are not set). - Expected: Items will become part of your regular inventory once they surpass the available from date, used for "coming soon" products and purchase orders (only
from
date is set). - Temporary: Temporary items will automatically become unavailable once they exceed the available till date, typically a sub-rental (
from
andtill
are set).
Endpoints
GET /api/boomerang/stock_items
GET /api/boomerang/stock_items/{id}
POST /api/boomerang/stock_items
PUT /api/boomerang/stock_items/{id}
Fields
Every stock 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 |
archived |
Boolean readonly Whether item is archived |
archived_at |
Datetime nullable readonly When the item was archived |
identifier |
String Unique identifier (like serial number) |
status |
String readonly Whether item is out with a customer or in-store/warehouse. One of archived , expected , in_stock , started , overdue , expired |
from |
Datetime nullable When the stock item will be available in stock (temporary items or expected arrival date) |
till |
Datetime nullable When item will be out of stock (temporary items) |
stock_item_type |
String readonly Based on the values of from and till . One of regular , temporary |
product_group_id |
String readonly Unique identifier of the product group this stock item belongs to |
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 item |
confirm_shortage |
Boolean writeonly Whether to confirm a shortage when updating from, till or location of a stock item |
product_id |
Uuid Associated Product |
location_id |
Uuid Associated Location |
Relationships
Stock items have the following relationships:
Name | Description |
---|---|
barcode |
Barcodes Associated Barcode |
location |
Locations readonly Associated Location |
product |
Products Associated Product |
properties |
Properties readonly Associated Properties |
Listing stock_items
How to fetch a list of stock items:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/stock_items' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "27d3da68-1bfa-4130-b850-37896122c717",
"type": "stock_items",
"attributes": {
"created_at": "2024-11-18T09:26:15.656564+00:00",
"updated_at": "2024-11-18T09:26:15.656564+00:00",
"archived": false,
"archived_at": null,
"identifier": "id1000156",
"status": "in_stock",
"from": null,
"till": null,
"stock_item_type": "regular",
"product_group_id": "3b302307-5c29-4daf-bf16-3f16d327a60d",
"properties": {},
"product_id": "7eede27c-cd89-45b2-be55-d9642fde97bc",
"location_id": "03f07e26-3a7a-466c-b8d7-cea91455d54a"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/stock_items
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=product,barcode,location |
fields[] |
Array List of comma seperated fields to include ?fields[stock_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 |
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 |
status |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
from |
Datetime eq , not_eq , gt , gte , lt , lte |
till |
Datetime eq , not_eq , gt , gte , lt , lte |
stock_item_type |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
product_group_id |
Uuid eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
product_id |
Uuid eq , not_eq |
location_id |
Uuid eq , not_eq |
q |
String eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
stock_item_type |
Array count |
status |
Array count |
Includes
This request accepts the following includes:
product
barcode
location
properties
Fetching a stock_item
How to fetch a stock item:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/stock_items/410d787a-23b1-41cf-a879-055256821b56' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "410d787a-23b1-41cf-a879-055256821b56",
"type": "stock_items",
"attributes": {
"created_at": "2024-11-18T09:26:15.000272+00:00",
"updated_at": "2024-11-18T09:26:15.000272+00:00",
"archived": false,
"archived_at": null,
"identifier": "id1000155",
"status": "in_stock",
"from": null,
"till": null,
"stock_item_type": "regular",
"product_group_id": "8809d688-d86d-4b34-abc3-29a3ff30ea4a",
"properties": {},
"product_id": "3dd8833c-4a18-4571-b419-77806db6b944",
"location_id": "c7d2798a-db1e-482d-9a28-e7ba6134cf67"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/stock_items/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=barcode,location,properties |
fields[] |
Array List of comma seperated fields to include ?fields[stock_items]=created_at,updated_at,archived |
Includes
This request accepts the following includes:
barcode
location
properties
product
=>
product_group
Creating a stock_item
How to create a stock item:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/stock_items' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "stock_items",
"attributes": {
"identifier": "12345",
"product_id": "fdb197d5-81ba-492c-ba43-8938e023cada"
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "93ba9bc4-e135-42fb-8aa9-79cff1d0bfe9",
"type": "stock_items",
"attributes": {
"created_at": "2024-11-18T09:26:14.298427+00:00",
"updated_at": "2024-11-18T09:26:14.298427+00:00",
"archived": false,
"archived_at": null,
"identifier": "12345",
"status": "in_stock",
"from": null,
"till": null,
"stock_item_type": "regular",
"product_group_id": "1ece0599-1bc6-42e4-ac36-765c9e1e7fea",
"properties": {},
"product_id": "fdb197d5-81ba-492c-ba43-8938e023cada",
"location_id": "151e9f3e-e2c7-46ec-88a0-18992482c43a"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/stock_items
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=barcode,location,properties |
fields[] |
Array List of comma seperated fields to include ?fields[stock_items]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][identifier] |
String Unique identifier (like serial number) |
data[attributes][from] |
Datetime When the stock item will be available in stock (temporary items or expected arrival date) |
data[attributes][till] |
Datetime When item will be out of stock (temporary items) |
data[attributes][properties_attributes][] |
Array Create or update multiple properties associated with this item |
data[attributes][confirm_shortage] |
Boolean Whether to confirm a shortage when updating from, till or location of a stock item |
data[attributes][product_id] |
Uuid Associated Product |
data[attributes][location_id] |
Uuid Associated Location |
Includes
This request accepts the following includes:
barcode
location
properties
product
=>
product_group
Updating a stock_item
How to update a stock item:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/stock_items/35873521-88a7-48c5-a989-5ade6ce13645' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "35873521-88a7-48c5-a989-5ade6ce13645",
"type": "stock_items",
"attributes": {
"identifier": "12346"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "35873521-88a7-48c5-a989-5ade6ce13645",
"type": "stock_items",
"attributes": {
"created_at": "2024-11-18T09:26:16.309527+00:00",
"updated_at": "2024-11-18T09:26:16.370862+00:00",
"archived": false,
"archived_at": null,
"identifier": "12346",
"status": "in_stock",
"from": null,
"till": null,
"stock_item_type": "regular",
"product_group_id": "06c3c62a-1a8e-4b0b-b44b-239fd76f907a",
"properties": {},
"product_id": "7daf2d45-a4d5-490e-8153-832697031d53",
"location_id": "56c86c9b-78e4-4642-af19-1d8cadc34c7b"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/stock_items/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=barcode,location,properties |
fields[] |
Array List of comma seperated fields to include ?fields[stock_items]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][identifier] |
String Unique identifier (like serial number) |
data[attributes][from] |
Datetime When the stock item will be available in stock (temporary items or expected arrival date) |
data[attributes][till] |
Datetime When item will be out of stock (temporary items) |
data[attributes][properties_attributes][] |
Array Create or update multiple properties associated with this item |
data[attributes][confirm_shortage] |
Boolean Whether to confirm a shortage when updating from, till or location of a stock item |
data[attributes][product_id] |
Uuid Associated Product |
data[attributes][location_id] |
Uuid Associated Location |
Includes
This request accepts the following includes:
barcode
location
properties
product
=>
product_group
Stock item archivations
Archives a stock item.
Archivation is final and can not be undone.
When the request fails, the error.code
attribute can have the
following values:
stock_item_archived
The stock item was already archived before.stock_item_specified
The stock item has not been archived because this specific stock item has been planned for current or future orders. The orders to which this stock item has been planned are specified in themeta.blocking[0].order_ids
field.shortage
The stock item has not been archived because this would lead to an (un)acceptable shortage of the product for current or future orders. When the shortage is within the shortage limit of the product, a warning is returned. Otherwise a blocking error is returned. A warning can be overriden by settingconfirm_shortage
totrue
. The orders that would be affected by the shortage can be found in eithermeta.blocking[0].order_ids
ormeta.warning[0].order_ids
.
Fields
Every stock item archivation has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
confirm_shortage |
Boolean writeonly A value of true overrides shortage warnings. |
stock_item_id |
Uuid ID of the stock item that needs to be archived. |
Relationships
Stock item archivations have the following relationships:
Name | Description |
---|---|
stock_item |
Stock items Associated Stock item |
Archive
When the StockItem is not used, it can be archived:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/stock_item_archivations' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "stock_item_archivations",
"attributes": {
"stock_item_id": "de1bdad3-3e09-46f4-b6bc-1af0410fc57a"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "8c6daf03-caa7-54e3-9eac-a2a8fa0640e7",
"type": "stock_item_archivations",
"attributes": {
"stock_item_id": "de1bdad3-3e09-46f4-b6bc-1af0410fc57a"
},
"relationships": {}
},
"meta": {}
}
When the StockItem was already archived:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/stock_item_archivations' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "stock_item_archivations",
"attributes": {
"stock_item_id": "9558b000-cc4e-426a-9300-d4aa018c9990"
}
}
}'
A 422 status response looks like this:
{
"errors": [
{
"code": "stock_item_archived",
"status": "422",
"title": "Stock item archived",
"detail": "Stock item is already archived",
"meta": null
}
]
}
When the StockItem is specified on a reserved Order:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/stock_item_archivations' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "stock_item_archivations",
"attributes": {
"stock_item_id": "85634a3e-fd0c-471f-9796-6a069eecd00a"
}
}
}'
A 422 status response looks like this:
{
"errors": [
{
"code": "stock_item_specified",
"status": "422",
"title": "Stock item specified",
"detail": "This stock item is specified on a current or future order",
"meta": {
"blocking": [
{
"order_ids": [
"596a1911-d691-4f05-bd83-ad09c5e19b8c"
]
}
]
}
}
]
}
When archival would create unallowed shortage:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/stock_item_archivations' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "stock_item_archivations",
"attributes": {
"stock_item_id": "0eb8bfd3-7011-4025-8a5a-f404ba1c89f3"
}
}
}'
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": 1,
"item_id": "42decec4-28d1-4d4c-9ef2-b597653a3226",
"mutation": -1,
"order_ids": [
"1da148f8-695d-4319-964e-7d0eb5d0c942"
],
"location_id": "3c2bb066-ed8c-47d9-95d8-49f0d681e46a",
"available": 0,
"plannable": 0,
"stock_count": 1,
"planned": 1,
"needed": 1,
"cluster_available": 0,
"cluster_plannable": 0,
"cluster_stock_count": 1,
"cluster_planned": 1,
"cluster_needed": 1
}
]
}
}
]
}
When archival would create allowed shortage, but confirm_shortage is unspecified:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/stock_item_archivations' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "stock_item_archivations",
"attributes": {
"stock_item_id": "394f9a6b-1d12-40f7-abbc-caa3b1ceaf56"
}
}
}'
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": [
{
"reason": "shortage",
"shortage": 1,
"item_id": "d8c3a49b-974d-4ec0-9d96-600c35d70070",
"mutation": -1,
"order_ids": [
"f43e2a7e-52f5-450a-b463-f681e89799ec"
],
"location_id": "28400993-31cc-4908-8608-fa6a5f672c64",
"available": 0,
"plannable": 1,
"stock_count": 1,
"planned": 1,
"needed": 1,
"cluster_available": 0,
"cluster_plannable": 1,
"cluster_stock_count": 1,
"cluster_planned": 1,
"cluster_needed": 1
}
],
"blocking": []
}
}
]
}
When archival would create allowed shortage, and confirm_shortage is true:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/stock_item_archivations' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "stock_item_archivations",
"attributes": {
"stock_item_id": "05968e4b-5e3f-417f-a5d6-6093b5ba1ddd",
"confirm_shortage": true
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "0c22ff21-7325-5fc7-8078-1384e5ad4772",
"type": "stock_item_archivations",
"attributes": {
"stock_item_id": "05968e4b-5e3f-417f-a5d6-6093b5ba1ddd"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/stock_item_archivations
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=stock_item |
fields[] |
Array List of comma seperated fields to include ?fields[stock_item_archivations]=stock_item_id |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][confirm_shortage] |
Boolean A value of true overrides shortage warnings. |
data[attributes][stock_item_id] |
Uuid ID of the stock item that needs to be archived. |
Includes
This request accepts the following includes:
stock_item
Stock item suggestions
Use stock item suggestions to figure out which stock item can be booked, started, or stopped.
The suggestions are sorted: 1. Temporary stock items are sorted before permanent stock items. 2. Available stock items are sorted before overdue, unavailable and already_booked stock items. 3. Equally relevant stock items are sorted by the identifier.
Fields
Every stock item suggestion has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
stock_item_id |
Uuid ID of the suggested stock item. |
item_id |
Uuid readonly ID of the Product the suggested stock item belongs to. |
status |
String_enum readonly Status of the suggested stock item. One of available_in_location , available_in_cluster , overdue , unavailable , already_booked |
Relationships
Stock item suggestions have the following relationships:
Name | Description |
---|---|
stock_item |
Stock items readonly Associated Stock item |
Listing stock item suggestions
Retrieve stock item suggestions for booking:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/stock_item_suggestions?filter%5Baction%5D=book&filter%5Bitem_id%5D=ddf5186e-09ad-4294-97bd-7af70a2b6d8a&filter%5Border_id%5D=46bec75b-a35b-4bf8-bc2d-e4506dc330db' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "41bf5a91-0b08-5314-a67f-f03c6d431fc3",
"type": "stock_item_suggestions",
"attributes": {
"stock_item_id": "38b0aaa1-a169-4605-9ab3-b7d9c780be6b",
"item_id": "ddf5186e-09ad-4294-97bd-7af70a2b6d8a",
"status": "available_in_location"
},
"relationships": {}
},
{
"id": "8c16ba54-f162-550a-acf5-b72602115dd5",
"type": "stock_item_suggestions",
"attributes": {
"stock_item_id": "c3d58a50-3f57-48a2-8cf1-4ac6b7f85f63",
"item_id": "ddf5186e-09ad-4294-97bd-7af70a2b6d8a",
"status": "already_booked"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/stock_item_suggestions
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=stock_item |
fields[] |
Array List of comma seperated fields to include ?fields[stock_item_suggestions]=stock_item_id,item_id,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 |
---|---|
item_id |
Uuid required eq |
status |
String_enum eq |
order_id |
Uuid required eq |
action |
String_enum required eq |
q |
String eq |
location_id |
Uuid eq |
from |
Datetime eq |
till |
Datetime eq |
stock_item_id |
Uuid eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request accepts the following includes:
stock_item
Tags
Tags are designed to find specific resources faster. They can be added to the following resources by supplying a tag_list
.
Fields
Every tag has the following fields:
Name | Description |
---|---|
id |
Uuid readonly Primary key |
for |
String writeonly The resource to show the tag counts for. One of Order , Customer , ProductGroup , Bundle , Document |
name |
String Name of the tag |
count |
Integer Total count |
Listing tags
How to fetch a list of tags with their counts:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/tags?filter%5Bfor%5D=Order' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "bcbe3816-3813-43f6-a513-fde09d143179",
"type": "tags",
"attributes": {
"name": "vip",
"count": 1
}
},
{
"id": "62f4b42e-b436-43c4-aeff-d432fca8e2cf",
"type": "tags",
"attributes": {
"name": "webshop",
"count": 3
}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/tags
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[tags]=name,count |
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 |
---|---|
for |
String eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request does not accept any includes
Tax categories
You can create different tax categories and assign them according to the tax requirements of a product. The tax rates in the category are charged over a product when it's added to an order. An order's total tax rate is the sum of all product taxes on that order.
Endpoints
GET /api/boomerang/tax_categories
GET /api/boomerang/tax_categories/{id}
POST /api/boomerang/tax_categories
PUT /api/boomerang/tax_categories/{id}
DELETE /api/boomerang/tax_categories/{id}
Fields
Every tax category 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 tax category is archived |
archived_at |
Datetime nullable readonly When the tax category was archived |
name |
String Name of the tax category |
default |
Boolean Whether this is the default tax category. Setting this value to true will set other tax categories to false |
tax_rates_attributes |
Array writeonly The tax rates to associate |
Relationships
Tax categories have the following relationships:
Name | Description |
---|---|
tax_rates |
Tax rates readonly Associated Tax rates |
Listing tax categories
How to fetch a list of tax categories:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/tax_categories' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "349f0d0a-2b72-4076-83f0-306c2fbc61e5",
"type": "tax_categories",
"attributes": {
"created_at": "2024-11-18T09:23:18.814015+00:00",
"updated_at": "2024-11-18T09:23:18.817262+00:00",
"archived": false,
"archived_at": null,
"name": "Sales Tax",
"default": false
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/tax_categories
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=tax_rates |
fields[] |
Array List of comma seperated fields to include ?fields[tax_categories]=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 |
default |
Boolean eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request accepts the following includes:
tax_rates
Fetching a tax category
How to fetch a tax categories with it's tax rates:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/tax_categories/aebae488-57b7-4008-aab4-a46d38891e82?include=tax_rates' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "aebae488-57b7-4008-aab4-a46d38891e82",
"type": "tax_categories",
"attributes": {
"created_at": "2024-11-18T09:23:20.142078+00:00",
"updated_at": "2024-11-18T09:23:20.145391+00:00",
"archived": false,
"archived_at": null,
"name": "Sales Tax",
"default": false
},
"relationships": {
"tax_rates": {
"data": [
{
"type": "tax_rates",
"id": "a74ecde5-55dc-44f4-9614-06e40cee4387"
}
]
}
}
},
"included": [
{
"id": "a74ecde5-55dc-44f4-9614-06e40cee4387",
"type": "tax_rates",
"attributes": {
"created_at": "2024-11-18T09:23:20.143771+00:00",
"updated_at": "2024-11-18T09:23:20.143771+00:00",
"name": "VAT",
"value": 21.0,
"position": 1,
"owner_id": "aebae488-57b7-4008-aab4-a46d38891e82",
"owner_type": "tax_categories"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/tax_categories/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=tax_rates |
fields[] |
Array List of comma seperated fields to include ?fields[tax_categories]=created_at,updated_at,archived |
Includes
This request accepts the following includes:
tax_rates
Creating a tax category
How to create a tax category with tax rates:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/tax_categories' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "tax_categories",
"attributes": {
"name": "Sales Tax",
"tax_rates_attributes": [
{
"name": "VAT",
"value": 21
}
]
}
},
"include": "tax_rates"
}'
A 201 status response looks like this:
{
"data": {
"id": "71ed86bf-3e3e-49f3-992c-5521ee1d431f",
"type": "tax_categories",
"attributes": {
"created_at": "2024-11-18T09:23:20.607418+00:00",
"updated_at": "2024-11-18T09:23:20.610466+00:00",
"archived": false,
"archived_at": null,
"name": "Sales Tax",
"default": false
},
"relationships": {
"tax_rates": {
"data": [
{
"type": "tax_rates",
"id": "4eb439da-3ddc-45ce-a9ab-00a65a4922a2"
}
]
}
}
},
"included": [
{
"id": "4eb439da-3ddc-45ce-a9ab-00a65a4922a2",
"type": "tax_rates",
"attributes": {
"created_at": "2024-11-18T09:23:20.609011+00:00",
"updated_at": "2024-11-18T09:23:20.609011+00:00",
"name": "VAT",
"value": 21.0,
"position": 1,
"owner_id": "71ed86bf-3e3e-49f3-992c-5521ee1d431f",
"owner_type": "tax_categories"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
POST /api/boomerang/tax_categories
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=tax_rates |
fields[] |
Array List of comma seperated fields to include ?fields[tax_categories]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the tax category |
data[attributes][default] |
Boolean Whether this is the default tax category. Setting this value to true will set other tax categories to false |
data[attributes][tax_rates_attributes][] |
Array The tax rates to associate |
Includes
This request accepts the following includes:
tax_rates
Updating a tax category
How to update a tax category with tax rates:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/tax_categories/c8aaf27a-51df-409b-8bd7-ef4eb91b2ed7' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "c8aaf27a-51df-409b-8bd7-ef4eb91b2ed7",
"type": "tax_categories",
"attributes": {
"name": "State Tax",
"tax_rates_attributes": [
{
"name": "VAT",
"value": 9
},
{
"id": "9b46c068-cd32-4330-9fa5-42b378ff1e24",
"_destroy": true
}
]
}
},
"include": "tax_rates"
}'
A 200 status response looks like this:
{
"data": {
"id": "c8aaf27a-51df-409b-8bd7-ef4eb91b2ed7",
"type": "tax_categories",
"attributes": {
"created_at": "2024-11-18T09:23:19.691221+00:00",
"updated_at": "2024-11-18T09:23:19.734007+00:00",
"archived": false,
"archived_at": null,
"name": "State Tax",
"default": false
},
"relationships": {
"tax_rates": {
"data": [
{
"type": "tax_rates",
"id": "8309c68c-be4f-4fe7-9f4f-305517860040"
}
]
}
}
},
"included": [
{
"id": "8309c68c-be4f-4fe7-9f4f-305517860040",
"type": "tax_rates",
"attributes": {
"created_at": "2024-11-18T09:23:19.732562+00:00",
"updated_at": "2024-11-18T09:23:19.732562+00:00",
"name": "VAT",
"value": 9.0,
"position": 2,
"owner_id": "c8aaf27a-51df-409b-8bd7-ef4eb91b2ed7",
"owner_type": "tax_categories"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
PUT /api/boomerang/tax_categories/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=tax_rates |
fields[] |
Array List of comma seperated fields to include ?fields[tax_categories]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the tax category |
data[attributes][default] |
Boolean Whether this is the default tax category. Setting this value to true will set other tax categories to false |
data[attributes][tax_rates_attributes][] |
Array The tax rates to associate |
Includes
This request accepts the following includes:
tax_rates
Deleting a tax category
How to delete a tax category with tax rates:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/tax_categories/80917815-7038-490b-ba8c-89c2601dfb46' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "80917815-7038-490b-ba8c-89c2601dfb46",
"type": "tax_categories",
"attributes": {
"created_at": "2024-11-18T09:23:19.245783+00:00",
"updated_at": "2024-11-18T09:23:19.266063+00:00",
"archived": true,
"archived_at": "2024-11-18T09:23:19.266063+00:00",
"name": "Sales Tax (Deleted)",
"default": false
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/tax_categories/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[tax_categories]=created_at,updated_at,archived |
Includes
This request does not accept any includes
Tax rates
Tax rates are always assigned to either a TaxRegion or TaxCategory. Tax rates define the individual rates that will be taxed.
Endpoints
GET api/boomerang/tax_rates
GET /api/boomerang/tax_rates/{id}
POST /api/boomerang/tax_rates
PUT /api/boomerang/tax_rates/{id}
DELETE /api/boomerang/tax_rates/{id}
Fields
Every tax rate 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 The name of the tax rate |
value |
Float The percentage value of the rate |
position |
Integer readonly Position of the tax rate |
owner_id |
Uuid ID of its owner |
owner_type |
String The resource type of the owner. One of tax_regions , tax_categories |
Relationships
Tax rates have the following relationships:
Name | Description |
---|---|
owner |
Tax category, Tax region Associated Owner |
Listing tax rates
How to fetch a list of tax rates:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/tax_rates' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "0883b333-57c5-4bfe-88ec-5c3ec45b520a",
"type": "tax_rates",
"attributes": {
"created_at": "2024-11-18T09:24:06.523068+00:00",
"updated_at": "2024-11-18T09:24:06.523068+00:00",
"name": "VAT",
"value": 21.0,
"position": 1,
"owner_id": "40aecc65-50b4-464c-922a-f0325590b137",
"owner_type": "tax_regions"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET api/boomerang/tax_rates
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[tax_rates]=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 |
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
Fetching a tax rate
How to fetch a tax rate:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/tax_rates/59fe4a07-97e6-493a-a1bd-e048819417ef?include=owner' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "59fe4a07-97e6-493a-a1bd-e048819417ef",
"type": "tax_rates",
"attributes": {
"created_at": "2024-11-18T09:24:05.624698+00:00",
"updated_at": "2024-11-18T09:24:05.624698+00:00",
"name": "VAT",
"value": 21.0,
"position": 1,
"owner_id": "b982f9e1-5f21-474b-be9d-3d31bf59d26b",
"owner_type": "tax_regions"
},
"relationships": {
"owner": {
"data": {
"type": "tax_regions",
"id": "b982f9e1-5f21-474b-be9d-3d31bf59d26b"
}
}
}
},
"included": [
{
"id": "b982f9e1-5f21-474b-be9d-3d31bf59d26b",
"type": "tax_regions",
"attributes": {
"created_at": "2024-11-18T09:24:05.615797+00:00",
"updated_at": "2024-11-18T09:24:05.626470+00:00",
"archived": false,
"archived_at": null,
"name": "Sales Tax",
"strategy": "add_to",
"default": false
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/tax_rates/{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[tax_rates]=created_at,updated_at,name |
Includes
This request accepts the following includes:
owner
Creating a tax rate
How to create a tax rate and associate it with an owner:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/tax_rates' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "tax_rates",
"attributes": {
"name": "VAT",
"value": 21,
"owner_id": "8db3da14-c12f-4e41-8956-bc75f56caa31",
"owner_type": "tax_regions"
}
},
"include": "owner"
}'
A 201 status response looks like this:
{
"data": {
"id": "045d17c5-27c1-457c-8262-e2d5c1c1e5a5",
"type": "tax_rates",
"attributes": {
"created_at": "2024-11-18T09:24:06.993735+00:00",
"updated_at": "2024-11-18T09:24:06.993735+00:00",
"name": "VAT",
"value": 21.0,
"position": 1,
"owner_id": "8db3da14-c12f-4e41-8956-bc75f56caa31",
"owner_type": "tax_regions"
},
"relationships": {
"owner": {
"data": {
"type": "tax_regions",
"id": "8db3da14-c12f-4e41-8956-bc75f56caa31"
}
}
}
},
"included": [
{
"id": "8db3da14-c12f-4e41-8956-bc75f56caa31",
"type": "tax_regions",
"attributes": {
"created_at": "2024-11-18T09:24:06.975064+00:00",
"updated_at": "2024-11-18T09:24:06.995196+00:00",
"archived": false,
"archived_at": null,
"name": "Sales Tax",
"strategy": "add_to",
"default": false
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
POST /api/boomerang/tax_rates
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[tax_rates]=created_at,updated_at,name |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String The name of the tax rate |
data[attributes][value] |
Float The percentage value of the rate |
data[attributes][owner_id] |
Uuid ID of its owner |
data[attributes][owner_type] |
String The resource type of the owner. One of tax_regions , tax_categories |
Includes
This request accepts the following includes:
owner
Updating a tax rate
How to update a tax rate:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/tax_rates/2ce5eee8-98b6-45bd-a646-bc3f43cdb322' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "2ce5eee8-98b6-45bd-a646-bc3f43cdb322",
"type": "tax_rates",
"attributes": {
"value": 9
}
},
"include": "owner"
}'
A 200 status response looks like this:
{
"data": {
"id": "2ce5eee8-98b6-45bd-a646-bc3f43cdb322",
"type": "tax_rates",
"attributes": {
"created_at": "2024-11-18T09:24:06.073950+00:00",
"updated_at": "2024-11-18T09:24:06.095465+00:00",
"name": "Vat",
"value": 9.0,
"position": 1,
"owner_id": "90a0bd99-8928-4f22-ab38-163a219ac9f0",
"owner_type": "tax_categories"
},
"relationships": {
"owner": {
"data": {
"type": "tax_categories",
"id": "90a0bd99-8928-4f22-ab38-163a219ac9f0"
}
}
}
},
"included": [
{
"id": "90a0bd99-8928-4f22-ab38-163a219ac9f0",
"type": "tax_categories",
"attributes": {
"created_at": "2024-11-18T09:24:06.061674+00:00",
"updated_at": "2024-11-18T09:24:06.097071+00:00",
"archived": false,
"archived_at": null,
"name": "Sales Tax",
"default": false
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
PUT /api/boomerang/tax_rates/{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[tax_rates]=created_at,updated_at,name |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String The name of the tax rate |
data[attributes][value] |
Float The percentage value of the rate |
data[attributes][owner_id] |
Uuid ID of its owner |
data[attributes][owner_type] |
String The resource type of the owner. One of tax_regions , tax_categories |
Includes
This request accepts the following includes:
owner
Deleting a tax rate
How to delete a tax rate:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/tax_rates/c91c91ae-a492-48e3-b1a6-89a1804c400b' \
--header 'content-type: application/json' \
--data '{}'
A 200 status response looks like this:
{
"data": {
"id": "c91c91ae-a492-48e3-b1a6-89a1804c400b",
"type": "tax_rates",
"attributes": {
"created_at": "2024-11-18T09:24:07.402149+00:00",
"updated_at": "2024-11-18T09:24:07.402149+00:00",
"name": "VAT",
"value": 21.0,
"position": 1,
"owner_id": "32eb80c0-f05b-4812-8d53-830838af718d",
"owner_type": "tax_regions"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/tax_rates/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[tax_rates]=created_at,updated_at,name |
Includes
This request does not accept any includes
Tax regions
You can create tax regions for specific customers. Booqable's tax system supports adding, replacing and compounding rates. A tax region can have one of the following strategies:
- Add to: Each tax rate is calculated over the order total and individually added or substracted to/from the order total.
- Compound: The tax is calculated over the order total, including product taxes (tax over tax). This method is used in some countries like Canada.
- Replace: Removes product taxes and calculates tax over the order total.
Endpoints
GET /api/boomerang/tax_regions
GET /api/boomerang/tax_regions/{id}
POST /api/boomerang/tax_regions
PUT /api/boomerang/tax_regions/{id}
DELETE /api/boomerang/tax_regions/{id}
Fields
Every tax region 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 tax region is archived |
archived_at |
Datetime nullable readonly When the tax region was archived |
name |
String Name of the tax region |
strategy |
String The strategy to apply. One of add_to , replace , compound |
default |
Boolean Whether this is the default tax region. Setting this value to true will set other tax regions to false |
tax_rates_attributes |
Array writeonly The tax rates to associate |
Relationships
Tax regions have the following relationships:
Name | Description |
---|---|
tax_rates |
Tax rates readonly Associated Tax rates |
Listing tax regions
How to fetch a list of tax regions:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/tax_regions' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "34b197fd-c8b8-44ad-bd1d-e1283be2c201",
"created_at": "2024-11-18T09:28:03.363145+00:00",
"updated_at": "2024-11-18T09:28:03.366263+00:00",
"archived": false,
"archived_at": null,
"name": "Sales Tax",
"strategy": "add_to",
"default": false
}
]
}
HTTP Request
GET /api/boomerang/tax_regions
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=tax_rates |
fields[] |
Array List of comma seperated fields to include ?fields[tax_regions]=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 |
strategy |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
default |
Boolean eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request accepts the following includes:
tax_rates
Fetching a tax region
How to fetch a tax regions with it's tax rates:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/tax_regions/5123b41e-7b6e-4cc1-9e0c-d02294258572?include=tax_rates' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "5123b41e-7b6e-4cc1-9e0c-d02294258572",
"created_at": "2024-11-18T09:28:02.106182+00:00",
"updated_at": "2024-11-18T09:28:02.110333+00:00",
"archived": false,
"archived_at": null,
"name": "Sales Tax",
"strategy": "add_to",
"default": false,
"tax_rates": [
{
"id": "91d9a099-4952-4949-ab94-7cebdb5df0af",
"created_at": "2024-11-18T09:28:02.108504+00:00",
"updated_at": "2024-11-18T09:28:02.108504+00:00",
"name": "VAT",
"value": 21.0,
"position": 1,
"owner_id": "5123b41e-7b6e-4cc1-9e0c-d02294258572",
"owner_type": "tax_regions"
}
]
}
}
HTTP Request
GET /api/boomerang/tax_regions/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=tax_rates |
fields[] |
Array List of comma seperated fields to include ?fields[tax_regions]=created_at,updated_at,archived |
Includes
This request accepts the following includes:
tax_rates
Creating a tax region
How to create a tax region with tax rates:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/tax_regions' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "tax_regions",
"attributes": {
"name": "Sales Tax",
"strategy": "compound",
"tax_rates_attributes": [
{
"name": "VAT",
"value": 21
}
]
}
},
"include": "tax_rates"
}'
A 201 status response looks like this:
{
"data": {
"id": "f767e440-c51f-4d7c-b8ea-ce478da4824a",
"type": "tax_regions",
"attributes": {
"created_at": "2024-11-18T09:28:01.670717+00:00",
"updated_at": "2024-11-18T09:28:01.673312+00:00",
"archived": false,
"archived_at": null,
"name": "Sales Tax",
"strategy": "compound",
"default": false
},
"relationships": {
"tax_rates": {
"data": [
{
"type": "tax_rates",
"id": "b32d3af4-c932-4979-b3df-aa1c023dc1c0"
}
]
}
}
},
"included": [
{
"id": "b32d3af4-c932-4979-b3df-aa1c023dc1c0",
"type": "tax_rates",
"attributes": {
"created_at": "2024-11-18T09:28:01.672044+00:00",
"updated_at": "2024-11-18T09:28:01.672044+00:00",
"name": "VAT",
"value": 21.0,
"position": 1,
"owner_id": "f767e440-c51f-4d7c-b8ea-ce478da4824a",
"owner_type": "tax_regions"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
POST /api/boomerang/tax_regions
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=tax_rates |
fields[] |
Array List of comma seperated fields to include ?fields[tax_regions]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the tax region |
data[attributes][strategy] |
String The strategy to apply. One of add_to , replace , compound |
data[attributes][default] |
Boolean Whether this is the default tax region. Setting this value to true will set other tax regions to false |
data[attributes][tax_rates_attributes][] |
Array The tax rates to associate |
Includes
This request accepts the following includes:
tax_rates
Updating a tax region
How to update a tax region with tax rates:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/tax_regions/3cbdc8ec-d9d1-4349-8360-512e12f18835' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "3cbdc8ec-d9d1-4349-8360-512e12f18835",
"type": "tax_regions",
"attributes": {
"name": "State Tax",
"tax_rates_attributes": [
{
"name": "VAT",
"value": 9
},
{
"id": "6949f5f5-6bb2-4411-9e27-af746ae42f6e",
"_destroy": true
}
]
}
},
"include": "tax_rates"
}'
A 200 status response looks like this:
{
"data": {
"id": "3cbdc8ec-d9d1-4349-8360-512e12f18835",
"type": "tax_regions",
"attributes": {
"created_at": "2024-11-18T09:28:02.913348+00:00",
"updated_at": "2024-11-18T09:28:02.951507+00:00",
"archived": false,
"archived_at": null,
"name": "State Tax",
"strategy": "add_to",
"default": false
},
"relationships": {
"tax_rates": {
"data": [
{
"type": "tax_rates",
"id": "aba909af-b1c6-49de-bda0-206fa16634a3"
}
]
}
}
},
"included": [
{
"id": "aba909af-b1c6-49de-bda0-206fa16634a3",
"type": "tax_rates",
"attributes": {
"created_at": "2024-11-18T09:28:02.950153+00:00",
"updated_at": "2024-11-18T09:28:02.950153+00:00",
"name": "VAT",
"value": 9.0,
"position": 2,
"owner_id": "3cbdc8ec-d9d1-4349-8360-512e12f18835",
"owner_type": "tax_regions"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
PUT /api/boomerang/tax_regions/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=tax_rates |
fields[] |
Array List of comma seperated fields to include ?fields[tax_regions]=created_at,updated_at,archived |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][name] |
String Name of the tax region |
data[attributes][strategy] |
String The strategy to apply. One of add_to , replace , compound |
data[attributes][default] |
Boolean Whether this is the default tax region. Setting this value to true will set other tax regions to false |
data[attributes][tax_rates_attributes][] |
Array The tax rates to associate |
Includes
This request accepts the following includes:
tax_rates
Deleting a tax region
How to delete a tax region with tax rates:
curl --request DELETE \
--url 'https://example.booqable.com/api/boomerang/tax_regions/24ad741f-56a2-484e-b1a0-d2291c3ee1b5' \
--header 'content-type: application/json' \
--data '{}'
A 200 status response looks like this:
{
"data": {
"id": "24ad741f-56a2-484e-b1a0-d2291c3ee1b5",
"type": "tax_regions",
"attributes": {
"created_at": "2024-11-18T09:28:02.470529+00:00",
"updated_at": "2024-11-18T09:28:02.485857+00:00",
"archived": true,
"archived_at": "2024-11-18T09:28:02.485857+00:00",
"name": "Sales Tax (Deleted)",
"strategy": "add_to",
"default": false
},
"relationships": {}
},
"meta": {}
}
HTTP Request
DELETE /api/boomerang/tax_regions/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[tax_regions]=created_at,updated_at,archived |
Includes
This request does not accept any includes
Tax values
Tax values are always generated automatically by price calculations for orders
and carts
. They hold information about the amount taxed for a specific rate.
Endpoints
GET api/boomerang/tax_values
GET /api/boomerang/tax_values/{id}
Fields
Every tax value 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 tax rate |
percentage |
Float readonly The percentage taxed |
value_in_cents |
Integer readonly Amount of tax in cents |
tax_rate_id |
Uuid readonly Associated Tax rate |
owner_id |
Uuid readonly ID of its owner |
owner_type |
String readonly The resource type of the owner. One of orders , documents , carts , lines |
Relationships
Tax values have the following relationships:
Name | Description |
---|---|
owner |
Order Associated Owner |
tax_rate |
Tax rates readonly Associated Tax rate |
Listing tax values
How to fetch a list of tax values:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/tax_values' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "d15038c8-c532-4029-80c9-4650118f3973",
"type": "tax_values",
"attributes": {
"created_at": "2024-11-18T09:28:03.800207+00:00",
"updated_at": "2024-11-18T09:28:03.800207+00:00",
"name": "VAT 19%",
"percentage": 19.0,
"value_in_cents": 13800,
"tax_rate_id": "9b812d59-2f4b-4c95-86ef-dd27b477ca74",
"owner_id": "7e1fd780-17fa-4eed-bf93-9fda23c4dcb9",
"owner_type": "orders"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET api/boomerang/tax_values
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[tax_values]=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 |
percentage |
Float eq , not_eq , gt , gte , lt , lte |
value_in_cents |
Integer eq , not_eq , gt , gte , lt , lte |
tax_rate_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 |
value_in_cents |
Array sum , maximum , minimum , average |
Includes
This request does not accept any includes
Fetching a tax value
How to fetch a tax value:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/tax_values/c4cc4ad7-e838-4742-899c-215b8512b769?include=owner' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "c4cc4ad7-e838-4742-899c-215b8512b769",
"type": "tax_values",
"attributes": {
"created_at": "2024-11-18T09:28:04.262227+00:00",
"updated_at": "2024-11-18T09:28:04.262227+00:00",
"name": "VAT 19%",
"percentage": 19.0,
"value_in_cents": 13800,
"tax_rate_id": "c86e8762-9c53-4da3-a68c-aaa29e0acecc",
"owner_id": "f7f1be2d-2e4e-464e-859b-4efaed5df699",
"owner_type": "orders"
},
"relationships": {
"owner": {
"data": {
"type": "orders",
"id": "f7f1be2d-2e4e-464e-859b-4efaed5df699"
}
}
}
},
"included": [
{
"id": "f7f1be2d-2e4e-464e-859b-4efaed5df699",
"type": "orders",
"attributes": {
"created_at": "2024-11-18T09:28:04.238783+00:00",
"updated_at": "2024-11-18T09:28:04.238783+00:00",
"number": null,
"status": "new",
"statuses": [
"new"
],
"status_counts": {
"new": 0,
"concept": 0,
"reserved": 0,
"started": 0,
"stopped": 0
},
"starts_at": "2024-11-16T09:15:00.000000+00:00",
"stops_at": "2024-11-20T09:15:00.000000+00:00",
"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,
"billing_address_property_id": null,
"fulfillment_type": "pickup",
"customer_id": null,
"tax_region_id": null,
"coupon_id": null,
"start_location_id": "92e3d60b-dcfb-4f8e-a379-e587afc8dc78",
"stop_location_id": "92e3d60b-dcfb-4f8e-a379-e587afc8dc78"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/tax_values/{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[tax_values]=created_at,updated_at,name |
Includes
This request accepts the following includes:
owner
Transfers
When an order causes a shortage for a location and that shortage can be solved by the inventory in the cluster, one or multiple transfers are created.
Fields
Every transfer 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 readonly Quantity of items being transfered |
available_at |
Datetime readonly Date when item should be available at destination location |
finalized |
Boolean readonly Whether or not the transfer has completed |
item_id |
Uuid readonly ID of the product being transfered |
order_id |
Uuid readonly Order the item is being transfered for |
source_location_id |
Uuid readonly Location item is being transfered from |
destination_location_id |
Uuid readonly Location item is being transfered to |
Relationships
Transfers have the following relationships:
Name | Description |
---|---|
destination_location |
Locations readonly Associated Destination location |
item |
Items readonly Associated Item |
order |
Orders readonly Associated Order |
source_location |
Locations readonly Associated Source location |
Listing transfers
How to fetch a list of transfers:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/transfers' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "9d597fd3-732a-4dc2-99d6-fabd2a9fc6da",
"type": "transfers",
"attributes": {
"created_at": "2024-11-18T09:25:53.486812+00:00",
"updated_at": "2024-11-18T09:25:53.486812+00:00",
"quantity": 1,
"available_at": "2024-11-16T09:15:00.000000+00:00",
"finalized": false,
"item_id": "ebd4c0f1-6e59-44fb-9e85-7c7e89c1fa82",
"order_id": "34810cc9-084e-48c4-9b03-eb85f0ec1a36",
"source_location_id": "2bc930e6-60c2-4b0a-9073-cae5792052b7",
"destination_location_id": "2bc930e6-60c2-4b0a-9073-cae5792052b7"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/transfers
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=order,item,source_location |
fields[] |
Array List of comma seperated fields to include ?fields[transfers]=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 |
q |
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 |
available_at |
Datetime eq , not_eq , gt , gte , lt , lte |
finalized |
Boolean eq |
item_id |
Uuid eq , not_eq |
order_id |
Uuid eq , not_eq |
source_location_id |
Uuid eq , not_eq |
destination_location_id |
Uuid eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request accepts the following includes:
order
item
=>
photo
source_location
destination_location
Users
Users can be used to log into the web shop. They are useful for exposing your shop to a limited audience or verifiying that a customers can actually be reached via an email.
A user always belongs to a Customer. A customer can have multiple users. This is relevant for companies where multiple people are allowed to book orders in the name of that company. Because of this, a user should always be an actual person, not a legal person.
Depending on the setting in your Booqable account, creating a user can actually mean that you're inviting the user. In that case, the user still needs to confirm their email and set a password before the account is active. (See status)
Endpoints
GET /api/boomerang/users
GET /api/boomerang/users/{id}
POST /api/boomerang/users
PUT /api/boomerang/users/{id}
Fields
Every user 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 |
first_name |
String The first name of the user |
last_name |
String The last name of the user |
name |
String The full name of the user (first_name + last_name) |
email |
String The email of the user |
status |
String readonly One of disabled , active , invited , unconfirmed |
disabled |
Boolean writeonly When a user is disabled they cannot log into their account or create orders |
customer_id |
Uuid Associated Customer |
Relationships
Users have the following relationships:
Name | Description |
---|---|
customer |
Customers Associated Customer |
notes |
Notes readonly Associated Notes |
Listing users
How to fetch a list of users:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/users' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "0511d556-6634-444f-a9ef-290f3402c6c8",
"type": "users",
"attributes": {
"created_at": "2024-11-18T09:26:12.074705+00:00",
"updated_at": "2024-11-18T09:26:12.074705+00:00",
"first_name": "John",
"last_name": "Doe",
"name": "John Doe",
"email": "[email protected]",
"status": "active",
"customer_id": "2dd2f530-3140-4864-afee-6031b6483a0a"
},
"relationships": {}
}
],
"meta": {}
}
How to find users belonging to a customer:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/users?filter%5Bcustomer_id%5D=f3bafa39-d8cf-4286-8b31-6fede3d87b4e&include=customer' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": [
{
"id": "a4aac9e1-26b6-4306-93a7-eebf442d3611",
"type": "users",
"attributes": {
"created_at": "2024-11-18T09:26:12.549637+00:00",
"updated_at": "2024-11-18T09:26:12.549637+00:00",
"first_name": "John",
"last_name": "Doe",
"name": "John Doe",
"email": "[email protected]",
"status": "active",
"customer_id": "f3bafa39-d8cf-4286-8b31-6fede3d87b4e"
},
"relationships": {}
}
],
"meta": {}
}
HTTP Request
GET /api/boomerang/users
Request params
This request accepts the following parameters:
Name | Description |
---|---|
fields[] |
Array List of comma seperated fields to include ?fields[users]=created_at,updated_at,first_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 |
first_name |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
last_name |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
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 |
status |
String eq , not_eq , eql , not_eql , prefix , not_prefix , suffix , not_suffix , match , not_match |
customer_id |
Uuid eq , not_eq |
Meta
Results can be aggregated on:
Name | Description |
---|---|
total |
Array count |
Includes
This request does not accept any includes
Fetching a user
How to fetch a user:
curl --request GET \
--url 'https://example.booqable.com/api/boomerang/users/72e8d3b1-fcd7-4eec-9c8c-9c4266a7245d' \
--header 'content-type: application/json' \
A 200 status response looks like this:
{
"data": {
"id": "72e8d3b1-fcd7-4eec-9c8c-9c4266a7245d",
"type": "users",
"attributes": {
"created_at": "2024-11-18T09:26:10.366517+00:00",
"updated_at": "2024-11-18T09:26:10.366517+00:00",
"first_name": "John",
"last_name": "Doe",
"name": "John Doe",
"email": "[email protected]",
"status": "active",
"customer_id": "564b3db7-01f4-466d-8c54-7f554415e750"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
GET /api/boomerang/users/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=customer,disabled_by,notes |
fields[] |
Array List of comma seperated fields to include ?fields[users]=created_at,updated_at,first_name |
Includes
This request accepts the following includes:
customer
disabled_by
notes
Inviting a user
How to invite a user:
curl --request POST \
--url 'https://example.booqable.com/api/boomerang/users' \
--header 'content-type: application/json' \
--data '{
"data": {
"type": "users",
"attributes": {
"first_name": "Bob",
"last_name": "Bobsen",
"email": "[email protected]",
"customer_id": "982884a7-74e6-4596-b8f6-23ce24b4e3b5"
}
}
}'
A 201 status response looks like this:
{
"data": {
"id": "d35b853e-9b2b-4eb9-92a7-3cb02124fc77",
"type": "users",
"attributes": {
"created_at": "2024-11-18T09:26:11.605249+00:00",
"updated_at": "2024-11-18T09:26:11.617479+00:00",
"first_name": "Bob",
"last_name": "Bobsen",
"name": "Bob Bobsen",
"email": "[email protected]",
"status": "invited",
"customer_id": "982884a7-74e6-4596-b8f6-23ce24b4e3b5"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
POST /api/boomerang/users
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=customer,disabled_by,notes |
fields[] |
Array List of comma seperated fields to include ?fields[users]=created_at,updated_at,first_name |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][first_name] |
String The first name of the user |
data[attributes][last_name] |
String The last name of the user |
data[attributes][name] |
String The full name of the user (first_name + last_name) |
data[attributes][email] |
String The email of the user |
data[attributes][disabled] |
Boolean When a user is disabled they cannot log into their account or create orders |
data[attributes][customer_id] |
Uuid Associated Customer |
Includes
This request accepts the following includes:
customer
disabled_by
notes
Updating a user
How to update a user:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/users/38cf8587-6092-4448-817e-0d6dda33ed52' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "38cf8587-6092-4448-817e-0d6dda33ed52",
"type": "users",
"attributes": {
"first_name": "Bobba"
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "38cf8587-6092-4448-817e-0d6dda33ed52",
"type": "users",
"attributes": {
"created_at": "2024-11-18T09:26:09.872981+00:00",
"updated_at": "2024-11-18T09:26:09.926979+00:00",
"first_name": "Bobba",
"last_name": "Doe",
"name": "Bobba Doe",
"email": "[email protected]",
"status": "active",
"customer_id": "6ef395d6-9fe9-4f08-9078-3c6a4b3eccde"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/users/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=customer,disabled_by,notes |
fields[] |
Array List of comma seperated fields to include ?fields[users]=created_at,updated_at,first_name |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][first_name] |
String The first name of the user |
data[attributes][last_name] |
String The last name of the user |
data[attributes][name] |
String The full name of the user (first_name + last_name) |
data[attributes][email] |
String The email of the user |
data[attributes][disabled] |
Boolean When a user is disabled they cannot log into their account or create orders |
data[attributes][customer_id] |
Uuid Associated Customer |
Includes
This request accepts the following includes:
customer
disabled_by
notes
Enabling a user
How to enable a user:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/users/525a3aaf-f158-4232-a3af-2548763575db' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "525a3aaf-f158-4232-a3af-2548763575db",
"type": "users",
"attributes": {
"disabled": false
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "525a3aaf-f158-4232-a3af-2548763575db",
"type": "users",
"attributes": {
"created_at": "2024-11-18T09:26:10.858173+00:00",
"updated_at": "2024-11-18T09:26:10.934780+00:00",
"first_name": "John",
"last_name": "Doe",
"name": "John Doe",
"email": "[email protected]",
"status": "active",
"customer_id": "5128b52c-aab3-4967-8d74-a0c0a83dd082"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/users/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=customer,disabled_by,notes |
fields[] |
Array List of comma seperated fields to include ?fields[users]=created_at,updated_at,first_name |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][first_name] |
String The first name of the user |
data[attributes][last_name] |
String The last name of the user |
data[attributes][name] |
String The full name of the user (first_name + last_name) |
data[attributes][email] |
String The email of the user |
data[attributes][disabled] |
Boolean When a user is disabled they cannot log into their account or create orders |
data[attributes][customer_id] |
Uuid Associated Customer |
Includes
This request accepts the following includes:
customer
disabled_by
notes
Disabling a user
How to disable a user:
curl --request PUT \
--url 'https://example.booqable.com/api/boomerang/users/be93edff-cc93-427d-90f1-31aa1e9d46e7' \
--header 'content-type: application/json' \
--data '{
"data": {
"id": "be93edff-cc93-427d-90f1-31aa1e9d46e7",
"type": "users",
"attributes": {
"disabled": true
}
}
}'
A 200 status response looks like this:
{
"data": {
"id": "be93edff-cc93-427d-90f1-31aa1e9d46e7",
"type": "users",
"attributes": {
"created_at": "2024-11-18T09:26:09.385905+00:00",
"updated_at": "2024-11-18T09:26:09.440300+00:00",
"first_name": "John",
"last_name": "Doe",
"name": "John Doe",
"email": "[email protected]",
"status": "disabled",
"customer_id": "1addab35-b05e-4388-a537-95f8bbb4d79d"
},
"relationships": {}
},
"meta": {}
}
HTTP Request
PUT /api/boomerang/users/{id}
Request params
This request accepts the following parameters:
Name | Description |
---|---|
include |
String List of comma seperated relationships ?include=customer,disabled_by,notes |
fields[] |
Array List of comma seperated fields to include ?fields[users]=created_at,updated_at,first_name |
Request body
This request accepts the following body:
Name | Description |
---|---|
data[attributes][first_name] |
String The first name of the user |
data[attributes][last_name] |
String The last name of the user |
data[attributes][name] |
String The full name of the user (first_name + last_name) |
data[attributes][email] |
String The email of the user |
data[attributes][disabled] |
Boolean When a user is disabled they cannot log into their account or create orders |
data[attributes][customer_id] |
Uuid Associated Customer |
Includes
This request accepts the following includes:
customer
disabled_by
notes