NAV

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:

When side posting is supported, it will be mentioned in the resource-specific documentation.

The following resources support advanced searching with POST requests:

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

  1. Go to your account settings page {company-name-here}.booqable.com/employees/current
  2. Name your new token
  3. 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:

  1. Go to your account settings page {company-name-here}.booqable.com/employees/current
  2. Name your new authentication method
  3. Insert your public key (for ES256 and RS256 only)
  4. 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:

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": "cb1bd46b-eefb-4f9b-9dce-d7f2c1914989",
      "type": "barcodes",
      "attributes": {
        "created_at": "2024-11-11T09:27:56.048009+00:00",
        "updated_at": "2024-11-11T09:27:56.048009+00:00",
        "number": "http://bqbl.it/cb1bd46b-eefb-4f9b-9dce-d7f2c1914989",
        "barcode_type": "qr_code",
        "image_url": "http://company-name-261.lvh.me:/barcodes/cb1bd46b-eefb-4f9b-9dce-d7f2c1914989/image",
        "owner_id": "33dc0731-791b-4d98-ad4f-cc976731b98b",
        "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%2F3fec859b-3f38-408b-be60-c0e2ad8f96af&include=owner' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "3fec859b-3f38-408b-be60-c0e2ad8f96af",
      "type": "barcodes",
      "attributes": {
        "created_at": "2024-11-11T09:27:55.411569+00:00",
        "updated_at": "2024-11-11T09:27:55.411569+00:00",
        "number": "http://bqbl.it/3fec859b-3f38-408b-be60-c0e2ad8f96af",
        "barcode_type": "qr_code",
        "image_url": "http://company-name-260.lvh.me:/barcodes/3fec859b-3f38-408b-be60-c0e2ad8f96af/image",
        "owner_id": "ac0db166-0a5d-42e1-81c9-5eca73c787ba",
        "owner_type": "customers"
      },
      "relationships": {
        "owner": {
          "data": {
            "type": "customers",
            "id": "ac0db166-0a5d-42e1-81c9-5eca73c787ba"
          }
        }
      }
    }
  ],
  "included": [
    {
      "id": "ac0db166-0a5d-42e1-81c9-5eca73c787ba",
      "type": "customers",
      "attributes": {
        "created_at": "2024-11-11T09:27:55.369973+00:00",
        "updated_at": "2024-11-11T09:27:55.413654+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=aHR0cDovL2JxYmwuaXQvYThmYzI4MmUtMGEzZS00NGZmLWIyYmQtM2NiMmIzODk0N2Yy&include=owner' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "a8fc282e-0a3e-44ff-b2bd-3cb2b38947f2",
      "type": "barcodes",
      "attributes": {
        "created_at": "2024-11-11T09:27:57.121066+00:00",
        "updated_at": "2024-11-11T09:27:57.121066+00:00",
        "number": "http://bqbl.it/a8fc282e-0a3e-44ff-b2bd-3cb2b38947f2",
        "barcode_type": "qr_code",
        "image_url": "http://company-name-262.lvh.me:/barcodes/a8fc282e-0a3e-44ff-b2bd-3cb2b38947f2/image",
        "owner_id": "9e422e73-6923-4482-b3d9-172bbd352986",
        "owner_type": "customers"
      },
      "relationships": {
        "owner": {
          "data": {
            "type": "customers",
            "id": "9e422e73-6923-4482-b3d9-172bbd352986"
          }
        }
      }
    }
  ],
  "included": [
    {
      "id": "9e422e73-6923-4482-b3d9-172bbd352986",
      "type": "customers",
      "attributes": {
        "created_at": "2024-11-11T09:27:57.082182+00:00",
        "updated_at": "2024-11-11T09:27:57.122675+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/2c762dc7-630d-40d2-a80e-fded24518e57?include=owner' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "2c762dc7-630d-40d2-a80e-fded24518e57",
    "type": "barcodes",
    "attributes": {
      "created_at": "2024-11-11T09:27:59.639649+00:00",
      "updated_at": "2024-11-11T09:27:59.639649+00:00",
      "number": "http://bqbl.it/2c762dc7-630d-40d2-a80e-fded24518e57",
      "barcode_type": "qr_code",
      "image_url": "http://company-name-266.lvh.me:/barcodes/2c762dc7-630d-40d2-a80e-fded24518e57/image",
      "owner_id": "7ca6fb8e-56ab-46da-b1ee-676dcdff3d6b",
      "owner_type": "customers"
    },
    "relationships": {
      "owner": {
        "data": {
          "type": "customers",
          "id": "7ca6fb8e-56ab-46da-b1ee-676dcdff3d6b"
        }
      }
    }
  },
  "included": [
    {
      "id": "7ca6fb8e-56ab-46da-b1ee-676dcdff3d6b",
      "type": "customers",
      "attributes": {
        "created_at": "2024-11-11T09:27:59.594473+00:00",
        "updated_at": "2024-11-11T09:27:59.641601+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": "f6b37d08-612e-4705-98d7-73c7cad3d313",
          "owner_type": "customers"
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "59e1e8fc-8842-4995-8aad-11a00b1221f6",
    "type": "barcodes",
    "attributes": {
      "created_at": "2024-11-11T09:27:59.041516+00:00",
      "updated_at": "2024-11-11T09:27:59.041516+00:00",
      "number": "http://bqbl.it/59e1e8fc-8842-4995-8aad-11a00b1221f6",
      "barcode_type": "qr_code",
      "image_url": "http://company-name-265.lvh.me:/barcodes/59e1e8fc-8842-4995-8aad-11a00b1221f6/image",
      "owner_id": "f6b37d08-612e-4705-98d7-73c7cad3d313",
      "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/da7633d9-71ba-4e96-8dae-82e7a1959709' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "da7633d9-71ba-4e96-8dae-82e7a1959709",
        "type": "barcodes",
        "attributes": {
          "number": "https://myfancysite.com"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "da7633d9-71ba-4e96-8dae-82e7a1959709",
    "type": "barcodes",
    "attributes": {
      "created_at": "2024-11-11T09:27:58.306395+00:00",
      "updated_at": "2024-11-11T09:27:58.375449+00:00",
      "number": "https://myfancysite.com",
      "barcode_type": "qr_code",
      "image_url": "http://company-name-264.lvh.me:/barcodes/da7633d9-71ba-4e96-8dae-82e7a1959709/image",
      "owner_id": "6203590a-4250-47c4-bf5d-69e97b2177f5",
      "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/5f4eaf84-39ee-4651-b87c-f66693cd14c1' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "5f4eaf84-39ee-4651-b87c-f66693cd14c1",
    "type": "barcodes",
    "attributes": {
      "created_at": "2024-11-11T09:27:57.614215+00:00",
      "updated_at": "2024-11-11T09:27:57.614215+00:00",
      "number": "http://bqbl.it/5f4eaf84-39ee-4651-b87c-f66693cd14c1",
      "barcode_type": "qr_code",
      "image_url": "http://company-name-263.lvh.me:/barcodes/5f4eaf84-39ee-4651-b87c-f66693cd14c1/image",
      "owner_id": "2a91a976-99c0-40d2-92ea-ab19995e2115",
      "owner_type": "customers"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/barcodes/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=owner
fields[] Array
List of comma seperated fields to include ?fields[barcodes]=created_at,updated_at,number

Includes

This request accepts the following includes:

owner => photo

product => photo

Bundle items

Bundle items define which products and product groups are associated with a bundle. When bundles are planned on an order the quantity and discount percentage defined in a bundle item will apply.

When product_id is left blank, and the associated product group has variations, the variation needs to be specified when adding this bundle to an order. See the book_bundle action under OrderFulfilments.

Endpoints

GET /api/boomerang/bundle_items

GET /api/boomerang/bundle_items/{id}

POST /api/boomerang/bundle_items

PUT /api/boomerang/bundle_items/{id}

DELETE /api/boomerang/bundle_items/{id}

Fields

Every bundle item has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
quantity Integer
The quantity of the item
discount_percentage Float
The discount percentage for this product when rented out in a bundle
position Integer
Position of the product in bundle list
bundle_id Uuid
The associated Bundle
product_group_id Uuid
The associated Product group
product_id Uuid nullable
The associated Product

Relationships

Bundle items have the following relationships:

Name Description
bundle Bundles readonly
Associated Bundle
product Products readonly
Associated Product
product_group Product groups
Associated Product group

Listing bundle items

How to fetch a list of bundle items:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/bundle_items?filter%5Bbundle_id%5D=1a627101-598c-4493-a00e-b142476cc202' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "d322ed2b-eb38-4348-8cae-20ad5cd09396",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2024-11-11T09:24:52.746091+00:00",
        "updated_at": "2024-11-11T09:24:52.746091+00:00",
        "quantity": 2,
        "discount_percentage": 15.0,
        "position": 1,
        "bundle_id": "1a627101-598c-4493-a00e-b142476cc202",
        "product_group_id": "c84b1418-f148-4b2e-8357-60e47bf66483",
        "product_id": "2d2991bc-e83b-4099-859c-79f692b9b3eb"
      },
      "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/cae096c1-2612-4fff-bbdc-4b28d2b50d7d' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "cae096c1-2612-4fff-bbdc-4b28d2b50d7d",
    "type": "bundle_items",
    "attributes": {
      "created_at": "2024-11-11T09:24:51.085152+00:00",
      "updated_at": "2024-11-11T09:24:51.085152+00:00",
      "quantity": 2,
      "discount_percentage": 15.0,
      "position": 1,
      "bundle_id": "9cdc556a-9135-4348-9c2c-0baf194e1e7b",
      "product_group_id": "96a12d0f-fa27-4aab-ac21-1cbe320281bd",
      "product_id": "d8796f54-eefb-4a9d-b5cd-1fcd75349f7e"
    },
    "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": "c9590b97-f238-4893-b210-ea9a1183658e",
          "product_group_id": "3e56fee0-8795-4f55-815b-165abd2148bf",
          "product_id": "41965170-4bc0-4956-980f-bee6f54ec866",
          "quantity": 2,
          "discount_percentage": 15
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "9fb67d3f-c176-46d9-ac23-4cedfd878666",
    "type": "bundle_items",
    "attributes": {
      "created_at": "2024-11-11T09:24:49.482389+00:00",
      "updated_at": "2024-11-11T09:24:49.482389+00:00",
      "quantity": 2,
      "discount_percentage": 15.0,
      "position": 2,
      "bundle_id": "c9590b97-f238-4893-b210-ea9a1183658e",
      "product_group_id": "3e56fee0-8795-4f55-815b-165abd2148bf",
      "product_id": "41965170-4bc0-4956-980f-bee6f54ec866"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/bundle_items

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=bundle,product,product_group
fields[] Array
List of comma seperated fields to include ?fields[bundle_items]=created_at,updated_at,quantity

Request body

This request accepts the following body:

Name Description
data[attributes][quantity] Integer
The quantity of the item
data[attributes][discount_percentage] Float
The discount percentage for this product when rented out in a bundle
data[attributes][position] Integer
Position of the product in bundle list
data[attributes][bundle_id] Uuid
The associated Bundle
data[attributes][product_group_id] Uuid
The associated Product group
data[attributes][product_id] Uuid
The associated Product

Includes

This request accepts the following includes:

bundle

product => photo

product_group => photo

Updating a bundle item

How to update a bundle item:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/bundle_items/eb933bc9-b533-422a-8d75-1cd0719bb623' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "eb933bc9-b533-422a-8d75-1cd0719bb623",
        "type": "bundle_items",
        "attributes": {
          "quantity": 3,
          "discount_percentage": 20
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "eb933bc9-b533-422a-8d75-1cd0719bb623",
    "type": "bundle_items",
    "attributes": {
      "created_at": "2024-11-11T09:24:51.854380+00:00",
      "updated_at": "2024-11-11T09:24:51.931983+00:00",
      "quantity": 3,
      "discount_percentage": 20.0,
      "position": 1,
      "bundle_id": "6eaccf3a-5322-4def-8258-28668481f951",
      "product_group_id": "bf7c92b1-b88e-4455-a4bf-7b1bf7173d13",
      "product_id": "ccf299ff-f512-4dee-8298-05232940de45"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/bundle_items/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=bundle,product,product_group
fields[] Array
List of comma seperated fields to include ?fields[bundle_items]=created_at,updated_at,quantity

Request body

This request accepts the following body:

Name Description
data[attributes][quantity] Integer
The quantity of the item
data[attributes][discount_percentage] Float
The discount percentage for this product when rented out in a bundle
data[attributes][position] Integer
Position of the product in bundle list
data[attributes][bundle_id] Uuid
The associated Bundle
data[attributes][product_group_id] Uuid
The associated Product group
data[attributes][product_id] Uuid
The associated Product

Includes

This request accepts the following includes:

bundle

product => photo

product_group => photo

Deleting a bundle item

How to delete a bundle item:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/bundle_items/cceac46e-72d8-4f19-b51f-d26372fbe97a' \
    --header 'content-type: application/json' \
    --data '{}'

A 200 status response looks like this:

  {
  "data": {
    "id": "cceac46e-72d8-4f19-b51f-d26372fbe97a",
    "type": "bundle_items",
    "attributes": {
      "created_at": "2024-11-11T09:24:50.262994+00:00",
      "updated_at": "2024-11-11T09:24:50.262994+00:00",
      "quantity": 2,
      "discount_percentage": 15.0,
      "position": 1,
      "bundle_id": "13851f7f-4443-4bec-a97a-bbb1fb875dc4",
      "product_group_id": "8dda0a1c-e3b6-4ba8-8171-2b45d5b4bc2b",
      "product_id": "a1df8493-384c-4106-b32f-a87cddf1725c"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/bundle_items/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] Array
List of comma seperated fields to include ?fields[bundle_items]=created_at,updated_at,quantity

Includes

This request does not accept any includes

Bundles

Bundles allow for a single product to be made up of multiple other products. This makes it possible to track the status of multiple smaller products within a single larger product (the bundle).

Endpoints

GET /api/boomerang/bundles

POST api/boomerang/bundles/search

GET /api/boomerang/bundles/{id}

POST /api/boomerang/bundles

PUT /api/boomerang/bundles/{id}

DELETE /api/boomerang/bundles/{id}

Fields

Every bundle has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
archived Boolean readonly
Whether item is archived
archived_at Datetime nullable readonly
When the item was archived
type String readonly
One of product_groups, products, bundles
name String
Name of the item
slug String
Slug of the item
product_type String readonly
One of rental, consumable, service
extra_information String nullable
Extra information about the item, shown on orders and documents
photo_url String readonly
Main photo url
remote_photo_url String writeonly
Url to an image on the web
photo_base64 String writeonly
Base64 encoded photo, use this field to store a main photo
description String nullable
Description used in the online store
excerpt String
Excerpt used in the online store
show_in_store Boolean
Whether to show this item in the online
sorting_weight Integer
Defines sort order in the online store, the lower the weight - the higher it shows up in lists
discountable Boolean
Whether discounts should be applied to items in this bundle
taxable Boolean
Whether item is taxable
bundle_items_attributes Array writeonly
The bundle items to associate
seo_title String
SEO title tag
seo_description String
SEO meta description tag
tag_list Array
List of tags
photo_id Uuid
The associated Photo
tax_category_id Uuid
The associated Tax category

Relationships

Bundles have the following relationships:

Name Description
bundle_items Bundle items readonly
Associated Bundle items
inventory_levels Inventory levels readonly
Associated Inventory levels
photo Photos readonly
Associated Photo
tax_category Tax categories readonly
Associated Tax category

Listing bundles

How to fetch a list of bundles:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/bundles' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "466ca9df-7601-4b10-b804-7545f091d184",
      "type": "bundles",
      "attributes": {
        "created_at": "2024-11-11T09:26:07.621917+00:00",
        "updated_at": "2024-11-11T09:26:07.621917+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": "936bdddc-76d4-4aac-a3a2-0a53578103ed"
    },
    {
      "id": "e2a2fc6e-f3e6-452e-9a12-64357542c87c"
    },
    {
      "id": "423b75db-f322-4207-b4c1-cee0c2e30505"
    }
  ]
}

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/7327d1d5-e276-4866-add9-8b98db5692dd' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "7327d1d5-e276-4866-add9-8b98db5692dd",
    "type": "bundles",
    "attributes": {
      "created_at": "2024-11-11T09:26:10.841136+00:00",
      "updated_at": "2024-11-11T09:26:10.841136+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": "95ca97a8-6eaf-432f-8713-b10560c34702",
              "product_id": "b519a8f1-f68a-4a9b-bef6-44cb14edcad3"
            },
            {
              "quantity": 2,
              "discount_percentage": 15,
              "product_group_id": "6b068bdc-1773-4f38-9f40-1c7d59b868dd",
              "product_id": "37346267-ff69-43a0-ab1c-f568ac583d7b"
            }
          ]
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "53d4a998-87dc-49f5-aef7-96597ee8fff1",
    "type": "bundles",
    "attributes": {
      "created_at": "2024-11-11T09:26:04.748382+00:00",
      "updated_at": "2024-11-11T09:26:05.087253+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": "a9affb7c-3507-4187-abd2-12a8ae545a35"
          },
          {
            "type": "bundle_items",
            "id": "ee64f962-2f0f-41ed-8549-431d7d40ff63"
          },
          {
            "type": "bundle_items",
            "id": "d93554a6-f001-492d-b942-51c2bc78f10a"
          },
          {
            "type": "bundle_items",
            "id": "e6f59d4f-fb13-4fce-9a0b-6f585e9c0cef"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "a9affb7c-3507-4187-abd2-12a8ae545a35",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2024-11-11T09:26:04.751737+00:00",
        "updated_at": "2024-11-11T09:26:04.751737+00:00",
        "quantity": 2,
        "discount_percentage": 10.0,
        "position": 1,
        "bundle_id": "53d4a998-87dc-49f5-aef7-96597ee8fff1",
        "product_group_id": "95ca97a8-6eaf-432f-8713-b10560c34702",
        "product_id": "b519a8f1-f68a-4a9b-bef6-44cb14edcad3"
      },
      "relationships": {}
    },
    {
      "id": "ee64f962-2f0f-41ed-8549-431d7d40ff63",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2024-11-11T09:26:04.753871+00:00",
        "updated_at": "2024-11-11T09:26:04.753871+00:00",
        "quantity": 2,
        "discount_percentage": 15.0,
        "position": 2,
        "bundle_id": "53d4a998-87dc-49f5-aef7-96597ee8fff1",
        "product_group_id": "6b068bdc-1773-4f38-9f40-1c7d59b868dd",
        "product_id": "37346267-ff69-43a0-ab1c-f568ac583d7b"
      },
      "relationships": {}
    },
    {
      "id": "d93554a6-f001-492d-b942-51c2bc78f10a",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2024-11-11T09:26:04.755569+00:00",
        "updated_at": "2024-11-11T09:26:04.755569+00:00",
        "quantity": 2,
        "discount_percentage": 10.0,
        "position": 3,
        "bundle_id": "53d4a998-87dc-49f5-aef7-96597ee8fff1",
        "product_group_id": "95ca97a8-6eaf-432f-8713-b10560c34702",
        "product_id": "b519a8f1-f68a-4a9b-bef6-44cb14edcad3"
      },
      "relationships": {}
    },
    {
      "id": "e6f59d4f-fb13-4fce-9a0b-6f585e9c0cef",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2024-11-11T09:26:04.757299+00:00",
        "updated_at": "2024-11-11T09:26:04.757299+00:00",
        "quantity": 2,
        "discount_percentage": 15.0,
        "position": 4,
        "bundle_id": "53d4a998-87dc-49f5-aef7-96597ee8fff1",
        "product_group_id": "6b068bdc-1773-4f38-9f40-1c7d59b868dd",
        "product_id": "37346267-ff69-43a0-ab1c-f568ac583d7b"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

POST /api/boomerang/bundles

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=photo,bundle_items,tax_category
fields[] Array
List of comma seperated fields to include ?fields[bundles]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the item
data[attributes][slug] String
Slug of the item
data[attributes][extra_information] String
Extra information about the item, shown on orders and documents
data[attributes][remote_photo_url] String
Url to an image on the web
data[attributes][photo_base64] String
Base64 encoded photo, use this field to store a main photo
data[attributes][excerpt] String
Excerpt used in the online store
data[attributes][show_in_store] Boolean
Whether to show this item in the online
data[attributes][sorting_weight] Integer
Defines sort order in the online store, the lower the weight - the higher it shows up in lists
data[attributes][discountable] Boolean
Whether discounts should be applied to items in this bundle
data[attributes][taxable] Boolean
Whether item is taxable
data[attributes][bundle_items_attributes][] Array
The bundle items to associate
data[attributes][seo_title] String
SEO title tag
data[attributes][seo_description] String
SEO meta description tag
data[attributes][tag_list][] Array
List of tags
data[attributes][photo_id] Uuid
The associated Photo
data[attributes][tax_category_id] Uuid
The associated Tax category

Includes

This request accepts the following includes:

photo

bundle_items => product_group => photo

product => photo

tax_category

Updating a bundle

How to update a bundle with bundle items:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/bundles/518bd918-fdc6-4704-b219-d933f5c545c2' \
    --header 'content-type: application/json' \
    --data '{
      "include": "bundle_items",
      "data": {
        "id": "518bd918-fdc6-4704-b219-d933f5c545c2",
        "type": "bundles",
        "attributes": {
          "name": "iPad Pro Bundle",
          "bundle_items_attributes": [
            {
              "id": "a2debff5-21e5-404f-b1d1-8812b2cb55e3",
              "_destroy": true
            },
            {
              "quantity": 2,
              "discount_percentage": 15,
              "product_group_id": "218550ba-66fb-4ca4-a416-4e64443d11ee",
              "product_id": "b3107ecb-8cfc-467c-bedc-30e789e8eac7"
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "518bd918-fdc6-4704-b219-d933f5c545c2",
    "type": "bundles",
    "attributes": {
      "created_at": "2024-11-11T09:26:08.327430+00:00",
      "updated_at": "2024-11-11T09:26:09.444866+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": "986ab07d-2451-4846-a06b-ff77ec229d14"
          },
          {
            "type": "bundle_items",
            "id": "7bcaa97f-0f9e-43e1-9c1a-867fc3a9105a"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "986ab07d-2451-4846-a06b-ff77ec229d14",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2024-11-11T09:26:09.198270+00:00",
        "updated_at": "2024-11-11T09:26:09.198270+00:00",
        "quantity": 2,
        "discount_percentage": 15.0,
        "position": 2,
        "bundle_id": "518bd918-fdc6-4704-b219-d933f5c545c2",
        "product_group_id": "218550ba-66fb-4ca4-a416-4e64443d11ee",
        "product_id": "b3107ecb-8cfc-467c-bedc-30e789e8eac7"
      },
      "relationships": {}
    },
    {
      "id": "7bcaa97f-0f9e-43e1-9c1a-867fc3a9105a",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2024-11-11T09:26:09.201539+00:00",
        "updated_at": "2024-11-11T09:26:09.201539+00:00",
        "quantity": 2,
        "discount_percentage": 15.0,
        "position": 3,
        "bundle_id": "518bd918-fdc6-4704-b219-d933f5c545c2",
        "product_group_id": "218550ba-66fb-4ca4-a416-4e64443d11ee",
        "product_id": "b3107ecb-8cfc-467c-bedc-30e789e8eac7"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

PUT /api/boomerang/bundles/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=photo,bundle_items,tax_category
fields[] Array
List of comma seperated fields to include ?fields[bundles]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the item
data[attributes][slug] String
Slug of the item
data[attributes][extra_information] String
Extra information about the item, shown on orders and documents
data[attributes][remote_photo_url] String
Url to an image on the web
data[attributes][photo_base64] String
Base64 encoded photo, use this field to store a main photo
data[attributes][excerpt] String
Excerpt used in the online store
data[attributes][show_in_store] Boolean
Whether to show this item in the online
data[attributes][sorting_weight] Integer
Defines sort order in the online store, the lower the weight - the higher it shows up in lists
data[attributes][discountable] Boolean
Whether discounts should be applied to items in this bundle
data[attributes][taxable] Boolean
Whether item is taxable
data[attributes][bundle_items_attributes][] Array
The bundle items to associate
data[attributes][seo_title] String
SEO title tag
data[attributes][seo_description] String
SEO meta description tag
data[attributes][tag_list][] Array
List of tags
data[attributes][photo_id] Uuid
The associated Photo
data[attributes][tax_category_id] Uuid
The associated Tax category

Includes

This request accepts the following includes:

photo

bundle_items => product_group => photo

product => photo

tax_category

Archiving a bundle

How to delete a bundle:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/bundles/7b8b5cfa-4a8e-4050-8d9f-53050a8f0ec5' \
    --header 'content-type: application/json' \
    --data '{}'

A 200 status response looks like this:

  {
  "data": {
    "id": "7b8b5cfa-4a8e-4050-8d9f-53050a8f0ec5",
    "type": "bundles",
    "attributes": {
      "created_at": "2024-11-11T09:26:10.106843+00:00",
      "updated_at": "2024-11-11T09:26:10.199566+00:00",
      "archived": true,
      "archived_at": "2024-11-11T09:26:10.199566+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": "15c3caee-2f15-45b1-b4e3-6d62f2768180",
    "type": "companies",
    "attributes": {
      "created_at": "2024-11-11T09:23:00.552789+00:00",
      "updated_at": "2024-11-11T09:23:00.563925+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": "1afc1bac1e6cec2d73d97e4c42bdbcbe",
      "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": "1d07eb8a-dba3-4f10-9953-348e280fb1d3",
    "type": "companies",
    "attributes": {
      "subscription": {
        "trial_ends_at": "2024-11-25T09:23:01.556Z",
        "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": "01444ec4-cbed-4e40-8741-ca7eea4ab461",
        "type": "companies",
        "attributes": {
          "name": "iRent LLC"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "01444ec4-cbed-4e40-8741-ca7eea4ab461",
    "type": "companies",
    "attributes": {
      "created_at": "2024-11-11T09:23:01.006853+00:00",
      "updated_at": "2024-11-11T09:23:01.056029+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": "d8415fc1269e68b0db754eeac1d2e036",
      "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": "625d5fe4-01b8-4243-9b10-bc8073b1b824",
      "type": "countries",
      "attributes": {
        "created_at": "2024-11-11T09:25:32.073230+00:00",
        "updated_at": "2024-11-11T09:25:32.073230+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": "e5047f74-e368-4e78-9d04-ef07a3ce9c87",
      "type": "coupons",
      "attributes": {
        "created_at": "2024-11-11T09:28:22.634091+00:00",
        "updated_at": "2024-11-11T09:28:22.634091+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/d1a3c27b-9c36-4bd5-904f-2024000b5063' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "d1a3c27b-9c36-4bd5-904f-2024000b5063",
    "type": "coupons",
    "attributes": {
      "created_at": "2024-11-11T09:28:20.133759+00:00",
      "updated_at": "2024-11-11T09:28:20.133759+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": "a5af1c50-ee3b-4e03-942b-241e7a84bb2c",
    "type": "coupons",
    "attributes": {
      "created_at": "2024-11-11T09:28:20.656969+00:00",
      "updated_at": "2024-11-11T09:28:20.656969+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/27d29e1a-cf99-49c6-a96f-1b852ccce67a' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "27d29e1a-cf99-49c6-a96f-1b852ccce67a",
        "type": "coupons",
        "attributes": {
          "identifier": "SUMMER30OFF",
          "coupon_type": "percentage",
          "value": 30
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "a9a7edd7-35bc-4280-a034-dcb64d9ee5e1",
    "type": "coupons",
    "attributes": {
      "created_at": "2024-11-11T09:28:21.666437+00:00",
      "updated_at": "2024-11-11T09:28:21.692777+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/de676e97-77ab-4c7e-86e3-94baaf471e18' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "de676e97-77ab-4c7e-86e3-94baaf471e18",
        "type": "coupons",
        "attributes": {
          "active": false
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "c865429e-ff16-4a53-9189-ca6ec5db1256",
    "type": "coupons",
    "attributes": {
      "created_at": "2024-11-11T09:28:21.174150+00:00",
      "updated_at": "2024-11-11T09:28:21.197447+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/4120c815-1cfa-483d-935c-222bac127e9c' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "4120c815-1cfa-483d-935c-222bac127e9c",
    "type": "coupons",
    "attributes": {
      "created_at": "2024-11-11T09:28:22.156601+00:00",
      "updated_at": "2024-11-11T09:28:22.171659+00:00",
      "archived": true,
      "archived_at": "2024-11-11T09:28:22.171659+00:00",
      "identifier": "SUMMER20OFF",
      "coupon_type": "percentage",
      "value": 20,
      "active": true
    }
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/coupons/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] Array
List of comma seperated fields to include ?fields[coupons]=created_at,updated_at,archived

Includes

This request does not accept any includes

Customers

Customers are an essential part of your business. You can manage settings and custom data. Stored customer information like addresses, customer tax profiles, discounts, and customized security deposits are applied to associated orders when created or when assigned a new customer.

Endpoints

GET /api/boomerang/customers

POST api/boomerang/customers/search

GET /api/boomerang/customers/{id}

POST /api/boomerang/customers

PUT /api/boomerang/customers/{id}

DELETE /api/boomerang/customers/{id}

Fields

Every customer has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
archived Boolean readonly
Whether customer is archived
archived_at Datetime nullable readonly
When the customer was archived
number Integer readonly
The assigned number
name String
Person or Company name
email String nullable
E-mail address used for communication
deposit_type String
One of default, none, percentage_total, percentage, fixed
deposit_value Float
The value to use for deposit_type
discount_percentage Float
Default discount applied to each new order for this customer
legal_type String
Either person or commercial
email_marketing_consented Boolean
Whether the customer has consented to receive email marketing
email_marketing_consent_updated_at Datetime readonly
When the email marketing consent was last updated
properties Hash readonly
A hash containing all basic property values (include properties if you need more detailed information about properties)
properties_attributes Array writeonly
Create or update multiple properties associated with this customer
tag_list Array
Case insensitive tag list
merge_suggestion_customer_id Uuid
The associated Merge suggestion customer
tax_region_id Uuid nullable
The associated Tax region

Relationships

Customers have the following relationships:

Name Description
barcode Barcodes
Associated Barcode
merge_suggestion_customer Customers readonly
Associated Merge suggestion customer
notes Notes readonly
Associated Notes
properties Properties readonly
Associated Properties
tax_region Tax regions readonly
Associated Tax region

Listing customers

How to fetch a list of customers:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/customers' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "bb74d461-34c2-40db-987f-26010c89ab2f",
      "type": "customers",
      "attributes": {
        "created_at": "2024-11-11T09:22:41.920005+00:00",
        "updated_at": "2024-11-11T09:22:41.920005+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": "9ea43367-ace9-4b9c-b725-0805a4ecd90f"
    },
    {
      "id": "c6a36ddf-599a-4558-8bae-a7b83bd7fdec"
    }
  ]
}

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/3abba5f1-8a48-485b-b394-c14f51da119f?include=barcode%2Cproperties' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "3abba5f1-8a48-485b-b394-c14f51da119f",
    "type": "customers",
    "attributes": {
      "created_at": "2024-11-11T09:22:43.635880+00:00",
      "updated_at": "2024-11-11T09:22:43.635880+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": "c790f62c-26dd-4805-a11d-0f83d63cbc7c",
    "type": "customers",
    "attributes": {
      "created_at": "2024-11-11T09:22:40.347353+00:00",
      "updated_at": "2024-11-11T09:22:40.347353+00:00",
      "archived": false,
      "archived_at": null,
      "number": 2,
      "name": "John Doe",
      "email": "[email protected]",
      "deposit_type": "default",
      "deposit_value": 0.0,
      "discount_percentage": 0.0,
      "legal_type": "person",
      "email_marketing_consented": false,
      "email_marketing_consent_updated_at": null,
      "properties": {},
      "tag_list": [],
      "merge_suggestion_customer_id": null,
      "tax_region_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/customers

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=barcode,properties,tax_region
fields[] Array
List of comma seperated fields to include ?fields[customers]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Person or Company name
data[attributes][email] String
E-mail address used for communication
data[attributes][deposit_type] String
One of default, none, percentage_total, percentage, fixed
data[attributes][deposit_value] Float
The value to use for deposit_type
data[attributes][discount_percentage] Float
Default discount applied to each new order for this customer
data[attributes][legal_type] String
Either person or commercial
data[attributes][email_marketing_consented] Boolean
Whether the customer has consented to receive email marketing
data[attributes][properties_attributes][] Array
Create or update multiple properties associated with this customer
data[attributes][tag_list][] Array
Case insensitive tag list
data[attributes][merge_suggestion_customer_id] Uuid
The associated Merge suggestion customer
data[attributes][tax_region_id] Uuid
The associated Tax region

Includes

This request accepts the following includes:

barcode

properties

tax_region

Updating a customer

How to update a customer:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/customers/982155dd-b9cd-4dfa-a737-f10e051d8ad3' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "982155dd-b9cd-4dfa-a737-f10e051d8ad3",
        "type": "customers",
        "attributes": {
          "name": "Jane Doe"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "982155dd-b9cd-4dfa-a737-f10e051d8ad3",
    "type": "customers",
    "attributes": {
      "created_at": "2024-11-11T09:22:37.551842+00:00",
      "updated_at": "2024-11-11T09:22:37.633929+00:00",
      "archived": false,
      "archived_at": null,
      "number": 1,
      "name": "Jane Doe",
      "email": "[email protected]",
      "deposit_type": "default",
      "deposit_value": 0.0,
      "discount_percentage": 0.0,
      "legal_type": "person",
      "email_marketing_consented": false,
      "email_marketing_consent_updated_at": null,
      "properties": {},
      "tag_list": [],
      "merge_suggestion_customer_id": null,
      "tax_region_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/customers/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=barcode,properties,tax_region
fields[] Array
List of comma seperated fields to include ?fields[customers]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Person or Company name
data[attributes][email] String
E-mail address used for communication
data[attributes][deposit_type] String
One of default, none, percentage_total, percentage, fixed
data[attributes][deposit_value] Float
The value to use for deposit_type
data[attributes][discount_percentage] Float
Default discount applied to each new order for this customer
data[attributes][legal_type] String
Either person or commercial
data[attributes][email_marketing_consented] Boolean
Whether the customer has consented to receive email marketing
data[attributes][properties_attributes][] Array
Create or update multiple properties associated with this customer
data[attributes][tag_list][] Array
Case insensitive tag list
data[attributes][merge_suggestion_customer_id] Uuid
The associated Merge suggestion customer
data[attributes][tax_region_id] Uuid
The associated Tax region

Includes

This request accepts the following includes:

barcode

properties

tax_region

Archiving a customer

How to archive a customer:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/customers/be7f7225-6db4-4cfd-a828-b704530df084' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "be7f7225-6db4-4cfd-a828-b704530df084",
    "type": "customers",
    "attributes": {
      "created_at": "2024-11-11T09:22:38.747118+00:00",
      "updated_at": "2024-11-11T09:22:38.856036+00:00",
      "archived": true,
      "archived_at": "2024-11-11T09:22:38.856036+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:

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": "1d5508e3-0810-4f56-8449-b21b080c30e9",
      "type": "default_properties",
      "attributes": {
        "created_at": "2024-11-11T09:23:55.425100+00:00",
        "updated_at": "2024-11-11T09:23:55.425100+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/e34cc054-090f-4772-9b53-ba77fa20014a?include=owner' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "e34cc054-090f-4772-9b53-ba77fa20014a",
    "type": "default_properties",
    "attributes": {
      "created_at": "2024-11-11T09:23:53.223296+00:00",
      "updated_at": "2024-11-11T09:23:53.223296+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": "7d11f23e-27c4-4c54-84c6-2c93bed12ccb",
    "type": "default_properties",
    "attributes": {
      "created_at": "2024-11-11T09:23:54.927161+00:00",
      "updated_at": "2024-11-11T09:23:54.927161+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/11b54da4-2c0d-47ed-84fe-184278d0dab4' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "11b54da4-2c0d-47ed-84fe-184278d0dab4",
        "type": "default_properties",
        "attributes": {
          "property_type": "text_field"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "11b54da4-2c0d-47ed-84fe-184278d0dab4",
    "type": "default_properties",
    "attributes": {
      "created_at": "2024-11-11T09:23:54.394923+00:00",
      "updated_at": "2024-11-11T09:23:54.417077+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/e28ddea1-8dd8-40cc-abd4-f8143e740701' \
    --header 'content-type: application/json' \
    --data '{}'

A 200 status response looks like this:

  {
  "data": {
    "id": "e28ddea1-8dd8-40cc-abd4-f8143e740701",
    "type": "default_properties",
    "attributes": {
      "created_at": "2024-11-11T09:23:53.833236+00:00",
      "updated_at": "2024-11-11T09:23:53.833236+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:

Quotes and contracts are always finalized; to make a revision, archive the document, make changes to the order, and create a new one.

Invoices are automatically generated and updated based on changes made to an order. When an invoice is finalized, and further changes are made to the order, a new invoice is created with prorated changes. The payment status of the invoice is automatically updated when payments are made for the associated order.

Endpoints

GET /api/boomerang/documents

POST api/boomerang/documents/search

GET /api/boomerang/documents/{id}

POST /api/boomerang/documents

PUT /api/boomerang/documents/{id}

DELETE /api/boomerang/documents/{id}

Fields

Every document has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
archived Boolean readonly
Whether document is archived
archived_at Datetime nullable readonly
When the document was archived
document_type String
One of invoice, contract, quote
number Integer
The document number, must be unique per type. Automatically generated if left blank.
prefix String
Add a prefix to document numbers to make it easier to identify different documents. You can add dynamic values (like a year or order number) and custom prefixes e.g. {year}-{customer_number}.
prefix_with_number String readonly
Rendered prefix with document number
date Date
Date the document was finalized
due_date Date
The latest date by which the invoice must be fully paid
name String
Customer name. If left blank, automatically populated with the customer name of the associated order
address String
Customer Address. If left blank, automatically populated with the customer address of the associated order
reference String
A project number or other reference
revised Boolean
Whether document is revised (applies only to invoice)
finalized Boolean
Whether document is finalized (quote and contract are always finalized)
sent Boolean
Whether document is sent (with Booqable)
confirmed Boolean
Whether document is confirmed, applies to quote and contract
status String
One of confirmed, unconfirmed, revised, partially_paid, payment_due, paid, process_deposit, overpaid
signature_url String readonly
Url where the signature is stored
deposit_type String nullable
One of none, percentage_total, percentage, fixed
deposit_value Float
The value to use for deposit_type
tag_list Array
Case insensitive tag list
price_in_cents Integer readonly
Subtotal excl. taxes (excl. deposit)
grand_total_in_cents Integer readonly
Total excl. taxes (excl. deposit)
grand_total_with_tax_in_cents Integer readonly
Amount incl. taxes (excl. deposit)
discount_in_cents Integer readonly
Discount (incl. or excl. taxes based on tax_strategy
coupon_discount_in_cents Integer readonly
Coupon discount (incl. or excl. taxes based on tax_strategy
total_discount_in_cents Integer readonly
Total discount (incl. or excl. taxes based on tax_strategy
deposit_in_cents Integer readonly
Deposit
deposit_paid_in_cents Integer readonly
How much of the deposit is paid
deposit_refunded_in_cents Integer readonly
How much of the deposit is refunded
deposit_held_in_cents Integer readonly
Amount of deposit held
deposit_to_refund_in_cents Integer readonly
Amount of deposit (still) to be refunded
to_be_paid_in_cents Integer readonly
Amount that (still) has to be paid
paid_in_cents Integer readonly
How much was paid
tax_in_cents Integer readonly
Total tax
discount_percentage Float
The discount percentage applied to this order
order_id Uuid
The associated Order
customer_id Uuid nullable
The associated Customer
tax_region_id Uuid nullable
The associated Tax region
coupon_id Uuid nullable
The associated Coupon
body String readonly
Custom content displayed on a document, agreement details on a contract, for instance. Applicable to quote and contract. Populated with setting {document_type}.body, but can also be overridden for a specific document
footer String readonly
The footer of a document. Populated with setting {document_type}.footer, but can also be overridden for a specific document

Relationships

Documents have the following relationships:

Name Description
coupon Coupons
Associated Coupon
customer Customers
Associated Customer
lines Lines readonly
Associated Lines
order Orders
Associated Order
tax_region Tax regions
Associated Tax region
tax_values Tax values readonly
Associated Tax values

Listing documents

How to fetch a list of documents:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/documents' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "aa94bc3c-b0aa-49e5-a5d2-f2690753e397",
      "type": "documents",
      "attributes": {
        "created_at": "2024-11-11T09:26:31.482122+00:00",
        "updated_at": "2024-11-11T09:26:31.527103+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": "c9d370cc-7efc-42b8-87e2-7dd1ff7316d3",
        "customer_id": "1c406039-7524-4384-b7e3-94d563687daf",
        "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-08T09:26:29.202Z"
                  }
                },
                {
                  "date": {
                    "lte": "2024-11-14T09:26:29.203Z"
                  }
                }
              ]
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "bca47eec-5da4-4e2a-835a-0b653aafc9e7"
    },
    {
      "id": "144303e1-6029-4070-8108-9f2de3a15c96"
    }
  ]
}

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/d65e8312-5c8d-4a41-9e9f-e374332b3ff4' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "d65e8312-5c8d-4a41-9e9f-e374332b3ff4",
    "type": "documents",
    "attributes": {
      "created_at": "2024-11-11T09:26:24.112767+00:00",
      "updated_at": "2024-11-11T09:26:24.156286+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": "264f4506-3472-420f-a55c-f6e397f41f32",
      "customer_id": "84396dc4-f9ed-490b-8ac2-7659b501efe1",
      "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": "1b2c9fc3-336b-4c79-9e1c-5181ff08d8a1"
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "c16ae463-5839-4a0c-88c2-58009b23596c",
    "type": "documents",
    "attributes": {
      "created_at": "2024-11-11T09:26:17.438412+00:00",
      "updated_at": "2024-11-11T09:26:17.449302+00:00",
      "archived": false,
      "archived_at": null,
      "document_type": "contract",
      "number": 1,
      "prefix": null,
      "prefix_with_number": "1",
      "date": "2024-11-11",
      "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": "1b2c9fc3-336b-4c79-9e1c-5181ff08d8a1",
      "customer_id": "b9a0296b-ba5f-40e9-a084-ba60b62358eb",
      "tax_region_id": null,
      "coupon_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/documents

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=customer,order,tax_region
fields[] Array
List of comma seperated fields to include ?fields[documents]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][document_type] String
One of invoice, contract, quote
data[attributes][number] Integer
The document number, must be unique per type. Automatically generated if left blank.
data[attributes][prefix] String
Add a prefix to document numbers to make it easier to identify different documents. You can add dynamic values (like a year or order number) and custom prefixes e.g. {year}-{customer_number}.
data[attributes][date] Date
Date the document was finalized
data[attributes][due_date] Date
The latest date by which the invoice must be fully paid
data[attributes][name] String
Customer name. If left blank, automatically populated with the customer name of the associated order
data[attributes][address] String
Customer Address. If left blank, automatically populated with the customer address of the associated order
data[attributes][reference] String
A project number or other reference
data[attributes][revised] Boolean
Whether document is revised (applies only to invoice)
data[attributes][finalized] Boolean
Whether document is finalized (quote and contract are always finalized)
data[attributes][sent] Boolean
Whether document is sent (with Booqable)
data[attributes][confirmed] Boolean
Whether document is confirmed, applies to quote and contract
data[attributes][status] String
One of confirmed, unconfirmed, revised, partially_paid, payment_due, paid, process_deposit, overpaid
data[attributes][deposit_type] String
One of none, percentage_total, percentage, fixed
data[attributes][deposit_value] Float
The value to use for deposit_type
data[attributes][tag_list][] Array
Case insensitive tag list
data[attributes][discount_percentage] Float
The discount percentage applied to this order
data[attributes][order_id] Uuid
The associated Order
data[attributes][customer_id] Uuid
The associated Customer
data[attributes][tax_region_id] Uuid
The associated Tax region
data[attributes][coupon_id] Uuid
The associated Coupon

Includes

This request accepts the following includes:

customer

order

tax_region

lines => item => photo

tax_values

coupon

Updating a document

How to update a document:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/documents/09a6352d-7308-40e8-ad9b-d52f2c7a1975' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "09a6352d-7308-40e8-ad9b-d52f2c7a1975",
        "type": "documents",
        "attributes": {
          "name": "Jane Doe"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "09a6352d-7308-40e8-ad9b-d52f2c7a1975",
    "type": "documents",
    "attributes": {
      "created_at": "2024-11-11T09:26:13.182251+00:00",
      "updated_at": "2024-11-11T09:26:13.965758+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": "887f6d85-0d10-46e3-876f-182afc391eb4",
      "customer_id": "3372171d-a726-4736-b7b8-f226f8e29cbf",
      "tax_region_id": null,
      "coupon_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/documents/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=customer,order,tax_region
fields[] Array
List of comma seperated fields to include ?fields[documents]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][document_type] String
One of invoice, contract, quote
data[attributes][number] Integer
The document number, must be unique per type. Automatically generated if left blank.
data[attributes][prefix] String
Add a prefix to document numbers to make it easier to identify different documents. You can add dynamic values (like a year or order number) and custom prefixes e.g. {year}-{customer_number}.
data[attributes][date] Date
Date the document was finalized
data[attributes][due_date] Date
The latest date by which the invoice must be fully paid
data[attributes][name] String
Customer name. If left blank, automatically populated with the customer name of the associated order
data[attributes][address] String
Customer Address. If left blank, automatically populated with the customer address of the associated order
data[attributes][reference] String
A project number or other reference
data[attributes][revised] Boolean
Whether document is revised (applies only to invoice)
data[attributes][finalized] Boolean
Whether document is finalized (quote and contract are always finalized)
data[attributes][sent] Boolean
Whether document is sent (with Booqable)
data[attributes][confirmed] Boolean
Whether document is confirmed, applies to quote and contract
data[attributes][status] String
One of confirmed, unconfirmed, revised, partially_paid, payment_due, paid, process_deposit, overpaid
data[attributes][deposit_type] String
One of none, percentage_total, percentage, fixed
data[attributes][deposit_value] Float
The value to use for deposit_type
data[attributes][tag_list][] Array
Case insensitive tag list
data[attributes][discount_percentage] Float
The discount percentage applied to this order
data[attributes][order_id] Uuid
The associated Order
data[attributes][customer_id] Uuid
The associated Customer
data[attributes][tax_region_id] Uuid
The associated Tax region
data[attributes][coupon_id] Uuid
The associated Coupon

Includes

This request accepts the following includes:

customer

order

tax_region

lines => item => photo

tax_values

coupon

Archiving a document

When archiving an invoice make sure delete_invoices permission is enabled.

How to archive a document:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/documents/41b1451b-ff75-43c1-8c4a-c84026e4483a' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "41b1451b-ff75-43c1-8c4a-c84026e4483a",
    "type": "documents",
    "attributes": {
      "created_at": "2024-11-11T09:26:20.688494+00:00",
      "updated_at": "2024-11-11T09:26:21.376745+00:00",
      "archived": true,
      "archived_at": "2024-11-11T09:26:21.376745+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": "f97d6954-3791-4f93-9908-c69849b48073",
      "customer_id": "d0a01e5c-2bd3-44b4-83e3-6508f886b26e",
      "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": "1859e1b8-fa8b-44d9-b8d2-ea7fca8f7684",
      "type": "email_templates",
      "attributes": {
        "created_at": "2024-11-11T09:26:33.242078+00:00",
        "updated_at": "2024-11-11T09:26:33.242078+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/27736548-3415-4975-9e2a-769ea15f6666' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "27736548-3415-4975-9e2a-769ea15f6666",
    "type": "email_templates",
    "attributes": {
      "created_at": "2024-11-11T09:26:35.402154+00:00",
      "updated_at": "2024-11-11T09:26:35.402154+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": "38fffdfd-a543-4473-be58-d32a434a7c76",
    "type": "email_templates",
    "attributes": {
      "created_at": "2024-11-11T09:26:32.663763+00:00",
      "updated_at": "2024-11-11T09:26:32.663763+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/15f98db6-be8c-4edc-ac84-7aecb0f02109' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "15f98db6-be8c-4edc-ac84-7aecb0f02109",
        "type": "email_templates",
        "attributes": {
          "name": "Order confirmation"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "15f98db6-be8c-4edc-ac84-7aecb0f02109",
    "type": "email_templates",
    "attributes": {
      "created_at": "2024-11-11T09:26:33.740075+00:00",
      "updated_at": "2024-11-11T09:26:33.756961+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/10d9fdbb-1d5a-439c-bd54-1266b5eb0acf' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "10d9fdbb-1d5a-439c-bd54-1266b5eb0acf",
        "type": "email_templates",
        "attributes": {
          "name": "Order confirmation"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "10d9fdbb-1d5a-439c-bd54-1266b5eb0acf",
    "type": "email_templates",
    "attributes": {
      "created_at": "2024-11-11T09:26:34.319421+00:00",
      "updated_at": "2024-11-11T09:26:34.339401+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/4a609131-5bc6-4ffc-8f8b-28002fb4696e' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "4a609131-5bc6-4ffc-8f8b-28002fb4696e",
    "type": "email_templates",
    "attributes": {
      "created_at": "2024-11-11T09:26:34.827271+00:00",
      "updated_at": "2024-11-11T09:26:34.827271+00:00",
      "name": "Sales Tax",
      "identifier": "sales_tax",
      "subject": "This is a subject!",
      "context": "all",
      "body": "Hi there user!",
      "default": false,
      "automated": false
    }
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/email_templates/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] Array
List of comma seperated fields to include ?fields[email_templates]=created_at,updated_at,name

Includes

This request does not accept any includes

Emails

Emails allow you to easily communicate with your customers by using optional templates. Booqable keeps a history of e-mail being sent for orders or customers.

Endpoints

GET /api/boomerang/emails

POST /api/boomerang/emails

Fields

Every email has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
subject String
Email subject
body String
Email body
recipients String
Comma seperated list of recipient email addresses, all addresses must be valid for the email to send.
has_error Boolean readonly
Whether any errors occur when sending this email
sent Boolean readonly
Whether the email was sent successfully
document_ids Array
Documents to send as attachments to the email
order_id Uuid
The associated Order
customer_id Uuid
The associated Customer
email_template_id Uuid
The associated Email template
employee_id Uuid readonly
The associated Employee

Relationships

Emails have the following relationships:

Name Description
customer Customers readonly
Associated Customer
email_template Email templates readonly
Associated Email template
employee Employees readonly
Associated Employee
order Orders readonly
Associated Order

Listing emails

How to fetch a list of emails:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/emails' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "0e87f78d-a4dc-4f3c-a983-06fb1120ba8c",
      "type": "emails",
      "attributes": {
        "created_at": "2024-11-11T09:24:46.398095+00:00",
        "updated_at": "2024-11-11T09:24:46.398095+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": "dfc81bc9-9bfc-434c-9270-a95973b5ae11",
        "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=5718f23e-eb49-46ec-8b4f-9edaf0feb2fb' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "92afc5e3-462a-4670-bd40-3b2686887ab4",
      "type": "emails",
      "attributes": {
        "created_at": "2024-11-11T09:24:45.870513+00:00",
        "updated_at": "2024-11-11T09:24:45.902063+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": "5718f23e-eb49-46ec-8b4f-9edaf0feb2fb",
        "customer_id": "dc6f2ea1-b9f3-4456-9d98-830910bc39c7",
        "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": "7a5b4435-7024-4263-ae51-0fcb067ad0ea",
          "order_id": "5a9a75aa-8dfa-4a4f-9c48-733c300b2c61",
          "customer_id": "de098264-6177-430c-b84a-49c0098f6322",
          "document_ids": [
            "881b50a4-b6be-48b9-89e5-337a49bf4921"
          ]
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "4595dba1-33dd-481c-80fc-3c57a26a53c2",
    "type": "emails",
    "attributes": {
      "created_at": "2024-11-11T09:24:03.856921+00:00",
      "updated_at": "2024-11-11T09:24:03.856921+00:00",
      "subject": "Order confirmation",
      "body": "Hi {{customer.name}}",
      "recipients": "[email protected],[email protected]",
      "has_error": false,
      "sent": false,
      "document_ids": [
        "881b50a4-b6be-48b9-89e5-337a49bf4921"
      ],
      "order_id": "5a9a75aa-8dfa-4a4f-9c48-733c300b2c61",
      "customer_id": "de098264-6177-430c-b84a-49c0098f6322",
      "email_template_id": "7a5b4435-7024-4263-ae51-0fcb067ad0ea",
      "employee_id": "38414e83-0ed9-4c74-9cbf-9c0e5bc9c342"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/emails

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=customer,order,email_template
fields[] Array
List of comma seperated fields to include ?fields[emails]=created_at,updated_at,subject

Request body

This request accepts the following body:

Name Description
data[attributes][subject] String
Email subject
data[attributes][body] String
Email body
data[attributes][recipients] String
Comma seperated list of recipient email addresses, all addresses must be valid for the email to send.
data[attributes][document_ids][] Array
Documents to send as attachments to the email
data[attributes][order_id] Uuid
The associated Order
data[attributes][customer_id] Uuid
The associated Customer
data[attributes][email_template_id] Uuid
The associated Email template

Includes

This request accepts the following includes:

customer

order

email_template

Employees

Employees give access to a Booqable account. You can set different permissions for each employee and let other people use Booqable without giving them access to sensitive information (or taking other unwanted actions).

Employees also allow you to streamline Booqable's interface for specific roles or use cases. For example, if you create an account for someone dedicated to looking after your financials and accounting, it wouldn't need to manage your products and stock levels.

Endpoints

GET /api/boomerang/employees

GET /api/boomerang/employees/{id}

PUT /api/boomerang/employees/{id}

Fields

Every employee has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
name String readonly
Full name of the employee
firstname String
First name of the employee
lastname String
Last name of the employee
locale String
Locale of the employee, used as application locale
email String
Employee's e-mail address
unconfirmed_email String readonly
Unconfirmed e-mail address if present
viewed_whats_new_at Datetime
Date when this employee viewed product updates for the last time (Used internally by Booqable)
current_password String writeonly
Current password, needed to update password or email address
password String writeonly
Set a new password
password_confirmation String writeonly
Confirm new password
active Boolean
Whether this employee is active (counts towards billing)
deactivated_at Datetime writeonly
Employee deactivation date
owner Boolean readonly
Whether this employee is the account owner
confirmed Boolean readonly
Whether this employee confirmed it's email address
time_to_confirm Integer readonly
Time in days left to confirm
permissions Array
Any of: reports, products, settings, security_settings, account, exports, cancel_orders, revert_orders, delete_invoices, make_invoice_revisions, override_rental_period. All permissions are always returned when this feature is not included in the current pricing plan or if the employee is the account owner
avatar_base64 String writeonly
Base64 encoded avatar
remove_avatar Boolean writeonly
Remove current avatar
has_two_factor_autentication Boolean readonly
Whether two factor authentication is enabled
avatar_url String readonly
Url to avatar
large_avatar_url String readonly
Url to avatar (Large)
third_party_id String readonly
ID used for third party tools

Listing employees

How to fetch a list of employees:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/employees' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "7db0f706-811f-443d-90c5-877a53191b3a",
      "type": "employees",
      "attributes": {
        "created_at": "2024-11-11T09:23:08.569690+00:00",
        "updated_at": "2024-11-11T09:23:08.573219+00:00",
        "name": "John Doe",
        "firstname": "John",
        "lastname": "Doe",
        "locale": null,
        "email": "[email protected]",
        "unconfirmed_email": null,
        "viewed_whats_new_at": "2024-11-11T09:23:08.564617+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/47f93c2b-b94a-4e0d-b267-42c14998b15c' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "47f93c2b-b94a-4e0d-b267-42c14998b15c",
    "type": "employees",
    "attributes": {
      "created_at": "2024-11-11T09:23:10.601145+00:00",
      "updated_at": "2024-11-11T09:23:10.601145+00:00",
      "name": "John Doe",
      "firstname": "John",
      "lastname": "Doe",
      "locale": null,
      "email": "[email protected]",
      "unconfirmed_email": null,
      "viewed_whats_new_at": "2024-11-11T09:23:10.596047+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/6f8ac366-88bb-4d13-97a1-19d187039698' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "6f8ac366-88bb-4d13-97a1-19d187039698",
        "type": "employees",
        "attributes": {
          "firstname": "Jane"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "6f8ac366-88bb-4d13-97a1-19d187039698",
    "type": "employees",
    "attributes": {
      "created_at": "2024-11-11T09:23:10.161159+00:00",
      "updated_at": "2024-11-11T09:23:10.185184+00:00",
      "name": "Jane Doe",
      "firstname": "Jane",
      "lastname": "Doe",
      "locale": null,
      "email": "[email protected]",
      "unconfirmed_email": null,
      "viewed_whats_new_at": "2024-11-11T09:23:10.157156+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/aeec72e5-8d36-4d91-ab6a-18669b234b4e' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "aeec72e5-8d36-4d91-ab6a-18669b234b4e",
        "type": "employees",
        "attributes": {
          "active": false
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "aeec72e5-8d36-4d91-ab6a-18669b234b4e",
    "type": "employees",
    "attributes": {
      "created_at": "2024-11-11T09:23:09.065595+00:00",
      "updated_at": "2024-11-11T09:23:09.093914+00:00",
      "name": "John Doe",
      "firstname": "John",
      "lastname": "Doe",
      "locale": null,
      "email": "[email protected]",
      "unconfirmed_email": null,
      "viewed_whats_new_at": "2024-11-11T09:23:09.059653+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/9ac1b617-e92b-47d8-8770-92d8869e0059' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "9ac1b617-e92b-47d8-8770-92d8869e0059",
        "type": "employees",
        "attributes": {
          "permissions": [
            "reports",
            "settings"
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "9ac1b617-e92b-47d8-8770-92d8869e0059",
    "type": "employees",
    "attributes": {
      "created_at": "2024-11-11T09:23:09.592148+00:00",
      "updated_at": "2024-11-11T09:23:09.619729+00:00",
      "name": "John Doe",
      "firstname": "John",
      "lastname": "Doe",
      "locale": null,
      "email": "[email protected]",
      "unconfirmed_email": null,
      "viewed_whats_new_at": "2024-11-11T09:23:09.587119+00:00",
      "active": true,
      "owner": false,
      "confirmed": true,
      "time_to_confirm": 0,
      "permissions": [
        "reports",
        "settings"
      ],
      "has_two_factor_autentication": false,
      "avatar_url": "https://gravatar.com/avatar/35f5782642e9fa0f6cfff5a552e2ae97.png?d=404",
      "large_avatar_url": "https://gravatar.com/avatar/35f5782642e9fa0f6cfff5a552e2ae97.png?d=mm&size=200"
    }
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/employees/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] Array
List of comma seperated fields to include ?fields[employees]=created_at,updated_at,name

Request body

This request accepts the following body:

Name Description
data[attributes][firstname] String
First name of the employee
data[attributes][lastname] String
Last name of the employee
data[attributes][locale] String
Locale of the employee, used as application locale
data[attributes][email] String
Employee's e-mail address
data[attributes][viewed_whats_new_at] Datetime
Date when this employee viewed product updates for the last time (Used internally by Booqable)
data[attributes][current_password] String
Current password, needed to update password or email address
data[attributes][password] String
Set a new password
data[attributes][password_confirmation] String
Confirm new password
data[attributes][active] Boolean
Whether this employee is active (counts towards billing)
data[attributes][deactivated_at] Datetime
Employee deactivation date
data[attributes][permissions][] Array
Any of: reports, products, settings, security_settings, account, exports, cancel_orders, revert_orders, delete_invoices, make_invoice_revisions, override_rental_period. All permissions are always returned when this feature is not included in the current pricing plan or if the employee is the account owner
data[attributes][avatar_base64] String
Base64 encoded avatar
data[attributes][remove_avatar] Boolean
Remove current avatar

Includes

This request does not accept any includes

Inventory levels

Inventory levels provide information on item availability. It describes availability, stock counts, and planned quantities for given items.

Endpoints

GET /api/boomerang/inventory_levels

Fields

Every inventory level has the following fields:

Name Description
id Uuid readonly
item_id Uuid
The associated Item
order_id Uuid readonly
Return data for all items on an order
location_id Uuid
The associated Location
location_available Integer readonly
The available quantity for the given location
location_stock_count Integer readonly
The quantity of stock present for the given the location
location_plannable Integer readonly
The number of products that can be planned for the given location
location_planned Integer readonly
The planned quantity for the given location
location_needed Integer readonly
The needed quantity for the given location. This quantity does not contain what has already been returned for an order (planned - stopped)
cluster_available Integer readonly
The available quantity for the cluster the given location is part of
cluster_stock_count Integer readonly
The stock count for the cluster the given location is part of
cluster_plannable Integer readonly
The planned quantity for the cluster the given location is part of
cluster_planned Integer readonly
The planned quantity for the cluster the given location is part of
cluster_needed Integer readonly
The needed quantity for the cluster the given location is part of. This quantity does not contain what has already been returned for an order (planned - stopped)

Relationships

Inventory levels have the following relationships:

Name Description
item Items readonly
Associated Item
location Locations readonly
Associated Location

Obtaining inventory levels for a product

How to fetch inventory levels for a product:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/inventory_levels?filter%5Bfrom%5D=2022-01-01+09%3A00%3A00&filter%5Bitem_id%5D=75dace79-c256-4dd3-a7a0-2cdf09741a85&filter%5Btill%5D=2022-01-02+09%3A00%3A00' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "bfd97ae2-11e6-5cb1-83fc-c7e05ec2c053",
      "type": "inventory_levels",
      "attributes": {
        "item_id": "75dace79-c256-4dd3-a7a0-2cdf09741a85",
        "order_id": null,
        "location_id": "d5475880-7a79-4315-918b-17f7f63bb52a",
        "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=2b9bdc22-e6e2-4812-ae01-27b27f8a5592&filter%5Blocation_id%5D=0e4d2d89-832e-4dd5-9ba2-f4c61d880d02&filter%5Btill%5D=2022-01-02+09%3A00%3A00' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "b65e3e9a-9757-5c09-94f8-f7e0ff5877b8",
      "type": "inventory_levels",
      "attributes": {
        "item_id": "2b9bdc22-e6e2-4812-ae01-27b27f8a5592",
        "order_id": null,
        "location_id": "0e4d2d89-832e-4dd5-9ba2-f4c61d880d02",
        "location_available": 0,
        "location_stock_count": 0,
        "location_plannable": 0,
        "location_planned": 0,
        "location_needed": 0,
        "cluster_available": 0,
        "cluster_stock_count": 0,
        "cluster_plannable": 0,
        "cluster_planned": 0,
        "cluster_needed": 0
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/inventory_levels

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=item,location
fields[] Array
List of comma seperated fields to include ?fields[inventory_levels]=item_id,order_id,location_id
filter Hash
The filters to apply ?filter[attribute][eq]=value
sort String
How to sort the data ?sort=attribute1,-attribute2
meta Hash
Metadata to send along ?meta[total][]=count
page[number] String
The page to request
page[size] String
The amount of items per page (max 100)

Filters

This request can be filtered on:

Name Description
item_id Uuid
eq
order_id Uuid
eq
location_id Uuid
eq
from Datetime required
eq
till Datetime required
eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

item

location

Invoice finalizations

Pro forma invoices are automatically generated and updated when changes are made to an order. The InvoiceFinalizationResource resource allows to request the finalization of the current pro forma invoice. Further changes to the order will trigger a new pro forma invoice to be generated with prorated changes.

Fields

Every invoice finalization has the following fields:

Name Description
id Uuid readonly
document_id Uuid
The associated Document

Relationships

Invoice finalizations have the following relationships:

Name Description
document Documents
Associated Document

Finalize invoice

Finalize a pro forma invoice:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/invoice_finalizations' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "invoice_finalization",
        "attributes": {
          "document_id": "cfc43f8e-4d7a-4234-8061-8f18f72f0f06"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "257fb362-4105-570f-a938-931e32a87f01",
    "type": "invoice_finalizations",
    "attributes": {
      "document_id": "cfc43f8e-4d7a-4234-8061-8f18f72f0f06"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/invoice_finalizations

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=document
fields[] Array
List of comma seperated fields to include ?fields[invoice_finalizations]=document_id

Request body

This request accepts the following body:

Name Description
data[attributes][document_id] Uuid
The associated Document

Includes

This request accepts the following includes:

document => order => documents

Invoice revisions

Revises the last finalized invoice for an order by combining it with the current pro forma invoice and creating a new finalized invoice.

Creating a revision requires that there is a finalized invoice, and that there is a pro forma invoice (i.e. changes must have been made to the order since the last finalized invoice).

Fields

Every invoice revision has the following fields:

Name Description
id Uuid readonly
order_id Uuid
The associated Order
revised_invoice_id Uuid readonly
The associated Revised invoice
revision_invoice_id Uuid readonly
The associated Revision invoice

Relationships

Invoice revisions have the following relationships:

Name Description
order Orders
Associated Order
revised_invoice Documents readonly
Associated Revised invoice
revision_invoice Documents readonly
Associated Revision invoice

Revise invoice

Revise a finalized invoice:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/invoice_revisions' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "invoice_revisions",
        "attributes": {
          "order_id": "adda955e-8a0b-4840-803b-7a4125f3c41f"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "7d8c0096-5485-5d2a-ba30-6979b30cf608",
    "type": "invoice_revisions",
    "attributes": {
      "order_id": "adda955e-8a0b-4840-803b-7a4125f3c41f",
      "revised_invoice_id": "0a48168e-481c-41aa-8830-679441ecc4e7",
      "revision_invoice_id": "de69e083-1a4e-43ac-b047-b5b4a2ccda9a"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/invoice_revisions

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=order,revised_invoice,revision_invoice
fields[] Array
List of comma seperated fields to include ?fields[invoice_revisions]=order_id,revised_invoice_id,revision_invoice_id

Request body

This request accepts the following body:

Name Description
data[attributes][order_id] Uuid
The associated Order

Includes

This request accepts the following includes:

order

revised_invoice

revision_invoice

Items

The Item resource gives the ability to fetch the following resources:

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:

Relationships

For this resource relationships are described in the following resources:

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": "677da3b8-fbcf-45e0-9ebd-ac90c60c5634",
      "type": "bundles",
      "attributes": {
        "created_at": "2024-11-11T09:25:21.078148+00:00",
        "updated_at": "2024-11-11T09:25:21.078148+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": "e43f5d9c-7d5d-436e-afd4-de4ba61a197b",
      "type": "product_groups",
      "attributes": {
        "created_at": "2024-11-11T09:25:21.232994+00:00",
        "updated_at": "2024-11-11T09:25:21.248385+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": "5df9eca1-b141-416c-924b-0ed71b0b976d",
        "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": "6a48acc1-ff47-4372-8010-133718cb05d3",
      "type": "products",
      "attributes": {
        "created_at": "2024-11-11T09:25:21.238509+00:00",
        "updated_at": "2024-11-11T09:25:21.238509+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": "5df9eca1-b141-416c-924b-0ed71b0b976d",
        "price_ruleset_id": null,
        "price_structure_id": null,
        "variation_values": [],
        "allow_shortage": true,
        "shortage_limit": 3,
        "product_group_id": "e43f5d9c-7d5d-436e-afd4-de4ba61a197b"
      },
      "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": "53eaaf9e-24a6-4d46-81b1-19467a66d0e2"
    },
    {
      "id": "e2c420a3-42a9-4a09-b61d-70c9375b2231"
    },
    {
      "id": "55657e49-d054-495c-8f3e-0403e742a94a"
    },
    {
      "id": "f9f2eb27-92a1-4f85-8da7-1f9737416361"
    },
    {
      "id": "3f2b29d5-ffbf-45bc-832c-06152771ed46"
    }
  ]
}

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/ae7eecd2-c5ba-4065-bbaa-26c36893355d' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "ae7eecd2-c5ba-4065-bbaa-26c36893355d",
    "type": "product_groups",
    "attributes": {
      "created_at": "2024-11-11T09:25:24.701768+00:00",
      "updated_at": "2024-11-11T09:25:24.714237+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": "2f15ba83-fb25-46d6-89e0-40c30e41dfa5",
      "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:

Fields

Every item price has the following fields:

Name Description
id Uuid readonly
item_id Uuid
The associated Item
from Datetime
Start of charge period
till Datetime
End of charge period
original_charge_length Integer readonly
Length of charge period before charge rules are applied
charge_length Integer
Length of charge period in seconds
original_charge_label String readonly
Label of charge period before charge rules are applied
charge_label String readonly
Label for the charge period
original_price_each_in_cents Integer readonly
Price per item before charge rules are applied
price_each_in_cents Integer readonly
Final price per item
price_rule_values Hash readonly
What price rules were applied
price_structure_id Uuid
The associated Price structure
price_ruleset_id Uuid
The associated Price ruleset
price_tile_id Uuid readonly
The associated Price tile

Relationships

Item prices have the following relationships:

Name Description
item Items readonly
Associated Item
price_ruleset Price rulesets readonly
Associated Price ruleset
price_structure Price structures readonly
Associated Price structure
price_tile Price tiles readonly
Associated Price tile

Calcuating the price of products and/or bundles

Calculating price for a period:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/item_prices?filter%5Bfrom%5D=2030-01-01+12%3A00%3A00+UTC&filter%5Bitem_id%5D%5B%5D=67a3f87a-c747-43bc-8bac-c419c4f1b955&filter%5Bitem_id%5D%5B%5D=663572ee-d47e-4f9b-84ff-1787455aec67&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": "2644dcca-78d4-4648-969c-f757df61c0fa",
      "type": "item_prices",
      "attributes": {
        "item_id": "67a3f87a-c747-43bc-8bac-c419c4f1b955",
        "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": "67a3f87a-c747-43bc-8bac-c419c4f1b955"
          }
        }
      }
    },
    {
      "id": "3b78ff27-1736-4de5-a29d-262c7a4aec25",
      "type": "item_prices",
      "attributes": {
        "item_id": "663572ee-d47e-4f9b-84ff-1787455aec67",
        "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": "663572ee-d47e-4f9b-84ff-1787455aec67"
          }
        }
      }
    }
  ],
  "included": [
    {
      "id": "67a3f87a-c747-43bc-8bac-c419c4f1b955",
      "type": "products",
      "attributes": {
        "created_at": "2024-11-11T09:22:46.054480+00:00",
        "updated_at": "2024-11-11T09:22:46.054480+00:00",
        "archived": false,
        "archived_at": null,
        "type": "products",
        "name": "Product 1000018",
        "group_name": "Product 1000018",
        "slug": "product-1000018",
        "sku": "PRODUCT 1000018",
        "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": "3b006dd8-1939-4e95-b0b2-b23f8376d3c6"
      },
      "relationships": {}
    },
    {
      "id": "663572ee-d47e-4f9b-84ff-1787455aec67",
      "type": "products",
      "attributes": {
        "created_at": "2024-11-11T09:22:46.447262+00:00",
        "updated_at": "2024-11-11T09:22:46.447262+00:00",
        "archived": false,
        "archived_at": null,
        "type": "products",
        "name": "Product 1000019",
        "group_name": "Product 1000019",
        "slug": "product-1000019",
        "sku": "PRODUCT 1000019",
        "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": "f4691c55-5deb-4582-8ffd-c98e46bdc698"
      },
      "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=f0358876-7327-4144-94e7-a5b1734463f0&include=item' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "d7455fef-9c6f-48d1-8239-ddcbe0949642",
      "type": "item_prices",
      "attributes": {
        "item_id": "f0358876-7327-4144-94e7-a5b1734463f0",
        "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": "f0358876-7327-4144-94e7-a5b1734463f0"
          }
        }
      }
    }
  ],
  "included": [
    {
      "id": "f0358876-7327-4144-94e7-a5b1734463f0",
      "type": "products",
      "attributes": {
        "created_at": "2024-11-11T09:22:44.559602+00:00",
        "updated_at": "2024-11-11T09:22:44.559602+00:00",
        "archived": false,
        "archived_at": null,
        "type": "products",
        "name": "Product 1000016",
        "group_name": "Product 1000016",
        "slug": "product-1000016",
        "sku": "PRODUCT 1000016",
        "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": "45184560-8bd6-4393-b0fd-fceedbc5e3ee"
      },
      "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:

  1. Custom lines Lines created through the resource that don't have a planning associated with it. Can be of one of type charge, section.

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

Nested lines contain information about individual items in a bundle; for these lines, the quantity and price information can not be updated directly but should be updated through the parent line instead.

Endpoints

GET /api/boomerang/lines

GET /api/boomerang/lines/{id}

POST /api/boomerang/lines

PUT /api/boomerang/lines/{id}

DELETE /api/boomerang/lines/{id}

Fields

Every line has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
archived Boolean readonly
Whether line is archived
archived_at Datetime nullable readonly
When the line was archived
title String nullable
Title of the line
extra_information String nullable
Extra information about the line
quantity Integer
The quantity to calculate with. When updating quantity of a line with an associated planning, the planning also gets updated, which may lead to a shortage error
original_price_each_in_cents Integer readonly
The original price of the product (without price rule adjustments)
original_charge_length Integer readonly
The original charge length of the product (without price rule adjustments)
original_charge_label String nullable
The original charge label of the product (without price rule adjustments)
price_each_in_cents Integer
Price of each line
price_in_cents Integer readonly
Price of each line x quantity
display_price_in_cents Integer readonly
Price of this line to display based on the tax setting of the company (inclusive vs. exclusive)
position Integer nullable
Which position the line has
charge_label String nullable
Charge label
charge_length Integer nullable
The charge length in seconds. It can be different than the time planned. Set to null to recalculate pricing based on order period and apply price rules.
price_rule_values Hash nullable readonly
Breakdown of applied price rules
discountable Boolean
Whether line is discountable
taxable Boolean
Whether line is taxable
line_type String
One of section, deposit_charge, proration, charge, legacy_migration, delivery_rate
relevant Boolean readonly
Whether line is relevant. If not, line has no visible change, it's only used for reporting
confirm_shortage Boolean writeonly
Whether to confirm a shortage when updating quantity on a line
order_id Uuid
The associated Order
item_id Uuid nullable
The associated Item
tax_category_id Uuid nullable
The associated Tax category
price_structure_id Uuid
The associated Price structure
price_tile_id Uuid
The associated Price tile
planning_id Uuid
The associated Planning
parent_line_id Uuid
The associated Parent line
owner_id Uuid
ID of its owner
owner_type String
One of orders, documents, carts

Relationships

Lines have the following relationships:

Name Description
item Items readonly
Associated Item
nested_lines Lines readonly
Associated Nested lines
order Orders readonly
Associated Order
owner Order
Associated Owner
parent_line Lines readonly
Associated Parent line
planning Plannings readonly
Associated Planning
price_structure Price structures readonly
Associated Price structure
price_tile Price tiles readonly
Associated Price tile
tax_category Tax categories readonly
Associated Tax category

Listing lines

How to fetch a list of lines:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/lines' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "a0e92f14-87cf-4ea1-9963-749dd2fb659a",
      "type": "lines",
      "attributes": {
        "created_at": "2024-11-11T09:26:47.697848+00:00",
        "updated_at": "2024-11-11T09:26:47.730578+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": "688dbe40-269d-4600-a83e-41f8aa394127",
        "item_id": "d4429771-5daf-4a22-ba2a-e65e53b7b778",
        "tax_category_id": "08b39321-1909-481e-b27e-2c40640f6516",
        "price_structure_id": null,
        "price_tile_id": null,
        "planning_id": "59e9ee44-349c-496a-a103-734ca4d569d2",
        "parent_line_id": null,
        "owner_id": "688dbe40-269d-4600-a83e-41f8aa394127",
        "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/6174e592-6fe7-4cde-8281-bee99baaef2e' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "6174e592-6fe7-4cde-8281-bee99baaef2e",
    "type": "lines",
    "attributes": {
      "created_at": "2024-11-11T09:26:50.025415+00:00",
      "updated_at": "2024-11-11T09:26:50.056127+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": "5e6689ad-f900-4289-81e8-0073b192a7b3",
      "item_id": "35bc0cda-9418-4148-8cfa-05556f435486",
      "tax_category_id": "9a104a52-7d44-4c27-bc58-6a26e6c83a4a",
      "price_structure_id": null,
      "price_tile_id": null,
      "planning_id": "f2a1ef20-fd56-4ddc-9443-d29f1f054db9",
      "parent_line_id": null,
      "owner_id": "5e6689ad-f900-4289-81e8-0073b192a7b3",
      "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": "ea72b725-c3ac-45e4-91f5-804269392ef6",
          "owner_type": "orders",
          "price_each_in_cents": 1000
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "fc2146b3-685d-4f6a-bec8-429e55eeab6e",
    "type": "lines",
    "attributes": {
      "created_at": "2024-11-11T09:26:56.265404+00:00",
      "updated_at": "2024-11-11T09:26:56.274639+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": "ea72b725-c3ac-45e4-91f5-804269392ef6",
      "item_id": null,
      "tax_category_id": null,
      "price_structure_id": null,
      "price_tile_id": null,
      "planning_id": null,
      "parent_line_id": null,
      "owner_id": "ea72b725-c3ac-45e4-91f5-804269392ef6",
      "owner_type": "orders"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/lines

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=order,owner,tax_category
fields[] Array
List of comma seperated fields to include ?fields[lines]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][title] String
Title of the line
data[attributes][extra_information] String
Extra information about the line
data[attributes][quantity] Integer
The quantity to calculate with. When updating quantity of a line with an associated planning, the planning also gets updated, which may lead to a shortage error
data[attributes][original_charge_label] String
The original charge label of the product (without price rule adjustments)
data[attributes][price_each_in_cents] Integer
Price of each line
data[attributes][position] Integer
Which position the line has
data[attributes][charge_label] String
Charge label
data[attributes][charge_length] Integer
The charge length in seconds. It can be different than the time planned. Set to null to recalculate pricing based on order period and apply price rules.
data[attributes][discountable] Boolean
Whether line is discountable
data[attributes][taxable] Boolean
Whether line is taxable
data[attributes][line_type] String
One of section, deposit_charge, proration, charge, legacy_migration, delivery_rate
data[attributes][confirm_shortage] Boolean
Whether to confirm a shortage when updating quantity on a line
data[attributes][order_id] Uuid
The associated Order
data[attributes][item_id] Uuid
The associated Item
data[attributes][tax_category_id] Uuid
The associated Tax category
data[attributes][price_structure_id] Uuid
The associated Price structure
data[attributes][price_tile_id] Uuid
The associated Price tile
data[attributes][planning_id] Uuid
The associated Planning
data[attributes][parent_line_id] Uuid
The associated Parent line
data[attributes][owner_id] Uuid
ID of its owner
data[attributes][owner_type] String
One of orders, documents, carts

Includes

This request accepts the following includes:

order => tax_values

owner => tax_values

tax_category

parent_line

nested_lines => planning

planning => item => photo

Updating a line

Change information, pricing, or increase the quantity of a line. Note that when updating the quantity of a line associated with a planning, the quantity of the planninig will also be updated, which may result in a shortage error.

Order totals are automatically re-calculated after updating a line and an invoice sync will be triggered if changes are relevant.

How to update a line:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/lines/ff146b3f-bf90-410b-82d9-83e4f5fab652' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "ff146b3f-bf90-410b-82d9-83e4f5fab652",
        "type": "lines",
        "attributes": {
          "price_each_in_cents": 1000
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "ff146b3f-bf90-410b-82d9-83e4f5fab652",
    "type": "lines",
    "attributes": {
      "created_at": "2024-11-11T09:26:45.423033+00:00",
      "updated_at": "2024-11-11T09:26:46.181720+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": "be63aede-c1f7-4de6-9464-e66b3f43ee81",
      "item_id": "57529c46-d282-4b80-a35c-38bbb93c85bd",
      "tax_category_id": "21a0545a-6090-4dad-90df-c92844bc066a",
      "price_structure_id": null,
      "price_tile_id": null,
      "planning_id": "87267097-45c5-4f7c-924a-c1361d395b2e",
      "parent_line_id": null,
      "owner_id": "be63aede-c1f7-4de6-9464-e66b3f43ee81",
      "owner_type": "orders"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/lines/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=order,owner,tax_category
fields[] Array
List of comma seperated fields to include ?fields[lines]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][title] String
Title of the line
data[attributes][extra_information] String
Extra information about the line
data[attributes][quantity] Integer
The quantity to calculate with. When updating quantity of a line with an associated planning, the planning also gets updated, which may lead to a shortage error
data[attributes][original_charge_label] String
The original charge label of the product (without price rule adjustments)
data[attributes][price_each_in_cents] Integer
Price of each line
data[attributes][position] Integer
Which position the line has
data[attributes][charge_label] String
Charge label
data[attributes][charge_length] Integer
The charge length in seconds. It can be different than the time planned. Set to null to recalculate pricing based on order period and apply price rules.
data[attributes][discountable] Boolean
Whether line is discountable
data[attributes][taxable] Boolean
Whether line is taxable
data[attributes][line_type] String
One of section, deposit_charge, proration, charge, legacy_migration, delivery_rate
data[attributes][confirm_shortage] Boolean
Whether to confirm a shortage when updating quantity on a line
data[attributes][order_id] Uuid
The associated Order
data[attributes][item_id] Uuid
The associated Item
data[attributes][tax_category_id] Uuid
The associated Tax category
data[attributes][price_structure_id] Uuid
The associated Price structure
data[attributes][price_tile_id] Uuid
The associated Price tile
data[attributes][planning_id] Uuid
The associated Planning
data[attributes][parent_line_id] Uuid
The associated Parent line
data[attributes][owner_id] Uuid
ID of its owner
data[attributes][owner_type] String
One of orders, documents, carts

Includes

This request accepts the following includes:

order => tax_values

owner => tax_values

tax_category

parent_line

nested_lines => planning

planning => item => photo

Archiving a line

How to delete a line:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/lines/586bd59d-e603-46ba-8f15-c88eb7ef33fb' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "586bd59d-e603-46ba-8f15-c88eb7ef33fb",
    "type": "lines",
    "attributes": {
      "created_at": "2024-11-11T09:26:51.917728+00:00",
      "updated_at": "2024-11-11T09:26:52.679237+00:00",
      "archived": true,
      "archived_at": "2024-11-11T09:26:52.679237+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": "5b15cfc9-6997-451a-8abb-96507489ef8b",
      "item_id": "1df16a8b-4d4e-4ca6-983d-f473c97fd4a8",
      "tax_category_id": "1a53981d-058a-4b96-96c4-6bc0e5924be4",
      "price_structure_id": null,
      "price_tile_id": null,
      "planning_id": "c03a8060-8764-4eee-84bc-a15f53ffa02a",
      "parent_line_id": null,
      "owner_id": "5b15cfc9-6997-451a-8abb-96507489ef8b",
      "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": "10bc11bc-5a88-4468-a615-0881b54ba769",
      "type": "locations",
      "attributes": {
        "created_at": "2024-11-11T09:25:54.401551+00:00",
        "updated_at": "2024-11-11T09:25:54.406405+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Warehouse",
        "code": "LOC1000052",
        "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/71317010-fba3-48bb-bf3b-ce3034e3a643' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "71317010-fba3-48bb-bf3b-ce3034e3a643",
    "type": "locations",
    "attributes": {
      "created_at": "2024-11-11T09:26:00.294738+00:00",
      "updated_at": "2024-11-11T09:26:00.299457+00:00",
      "archived": false,
      "archived_at": null,
      "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": {}
}

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": [
            "5a76cad7-8207-403e-8128-5cd90e07403d"
          ]
        }
      },
      "include": "clusters"
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "5c0b5efc-0f77-4ff0-8e4a-34df967b6606",
    "type": "locations",
    "attributes": {
      "created_at": "2024-11-11T09:25:59.782341+00:00",
      "updated_at": "2024-11-11T09:25:59.798860+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": [
        "5a76cad7-8207-403e-8128-5cd90e07403d"
      ],
      "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": "5a76cad7-8207-403e-8128-5cd90e07403d"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "5a76cad7-8207-403e-8128-5cd90e07403d",
      "type": "clusters",
      "attributes": {
        "created_at": "2024-11-11T09:25:59.738903+00:00",
        "updated_at": "2024-11-11T09:25:59.738903+00:00",
        "name": "North",
        "location_ids": [
          "5c0b5efc-0f77-4ff0-8e4a-34df967b6606"
        ]
      },
      "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/3237ff36-f1dc-495d-8bac-41f39d9685a7' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "3237ff36-f1dc-495d-8bac-41f39d9685a7",
        "type": "locations",
        "attributes": {
          "name": "Old warehouse",
          "cluster_ids": [
            "251a6c89-ff44-46f5-94b4-2a896ef080d9",
            "ec5891a6-fa3f-4bab-802f-ba17d1d9b233"
          ]
        }
      },
      "include": "clusters"
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "3237ff36-f1dc-495d-8bac-41f39d9685a7",
    "type": "locations",
    "attributes": {
      "created_at": "2024-11-11T09:25:55.213988+00:00",
      "updated_at": "2024-11-11T09:25:55.290908+00:00",
      "archived": false,
      "archived_at": null,
      "name": "Old warehouse",
      "code": "LOC1000053",
      "location_type": "rental",
      "address_line_1": "Blokhuisplein 40",
      "address_line_2": "Department II",
      "zipcode": "8911LJ",
      "city": "Leeuwarden",
      "region": "Friesland",
      "country": "Netherlands",
      "cluster_ids": [
        "251a6c89-ff44-46f5-94b4-2a896ef080d9",
        "ec5891a6-fa3f-4bab-802f-ba17d1d9b233"
      ],
      "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": "251a6c89-ff44-46f5-94b4-2a896ef080d9"
          },
          {
            "type": "clusters",
            "id": "ec5891a6-fa3f-4bab-802f-ba17d1d9b233"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "251a6c89-ff44-46f5-94b4-2a896ef080d9",
      "type": "clusters",
      "attributes": {
        "created_at": "2024-11-11T09:25:55.226932+00:00",
        "updated_at": "2024-11-11T09:25:55.226932+00:00",
        "name": "North",
        "location_ids": [
          "3237ff36-f1dc-495d-8bac-41f39d9685a7"
        ]
      },
      "relationships": {}
    },
    {
      "id": "ec5891a6-fa3f-4bab-802f-ba17d1d9b233",
      "type": "clusters",
      "attributes": {
        "created_at": "2024-11-11T09:25:55.233545+00:00",
        "updated_at": "2024-11-11T09:25:55.233545+00:00",
        "name": "Central",
        "location_ids": [
          "3237ff36-f1dc-495d-8bac-41f39d9685a7"
        ]
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

Disassociating cluster resulting in shortage error:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/locations/84b48b05-b9e2-4892-bd73-553d32a9645c' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "84b48b05-b9e2-4892-bd73-553d32a9645c",
        "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": "2b6a3570-6dec-4855-a6bc-24384af5782c",
            "mutation": 0,
            "order_ids": [
              "745c35d8-1259-4700-be12-a4b2b8ce27a4"
            ],
            "location_id": "84b48b05-b9e2-4892-bd73-553d32a9645c",
            "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:

How to archive a location:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/locations/e549be7a-3886-4213-b543-b318319d3e98' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "e549be7a-3886-4213-b543-b318319d3e98",
    "type": "locations",
    "attributes": {
      "created_at": "2024-11-11T09:25:51.823403+00:00",
      "updated_at": "2024-11-11T09:25:51.862487+00:00",
      "archived": true,
      "archived_at": "2024-11-11T09:25:51.862487+00:00",
      "name": "Warehouse",
      "code": "LOC1000048",
      "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/22637814-4a13-4888-ada7-751c46f7df2d' \
    --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": [
          "07740eee-50b6-416c-88f0-fa76538f1c98"
        ]
      }
    }
  ]
}

Failure due to active stock at location:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/locations/8e4980cf-aa6f-4b02-941a-3b932730fe2c' \
    --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": [
          "e9412b33-b894-4091-a5a6-a774d84d907c"
        ]
      }
    }
  ]
}

HTTP Request

DELETE /api/boomerang/locations/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] Array
List of comma seperated fields to include ?fields[locations]=created_at,updated_at,archived

Includes

This request does not accept any includes

Notes

Allows you to leave notes attached to other resources.

Endpoints

GET /api/boomerang/notes

GET /api/boomerang/notes/{id}

POST /api/boomerang/notes

DELETE /api/boomerang/notes/{id}

Fields

Every note has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
body String
The content of the note
owner_id Uuid
ID of the resource the note is attached to
owner_type String
The resource type of the owner. One of orders, documents, product_groups, bundles, products, customers, stock_items, users
employee_id Uuid readonly
The associated Employee

Relationships

Notes have the following relationships:

Name Description
employee Employees readonly
Associated Employee
owner Customer, Product, Product group, Stock item, Bundle, Order, Document, 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": "c2dfd810-c71a-48ac-893a-5f48d1d0b428",
      "type": "notes",
      "attributes": {
        "created_at": "2024-11-11T09:25:27.870914+00:00",
        "updated_at": "2024-11-11T09:25:27.870914+00:00",
        "body": "Agreed to give this customer a 20% discount on the next order",
        "owner_id": "6d473b6f-8aaf-43ca-a43b-80d5cd1a1a22",
        "owner_type": "customers",
        "employee_id": "7038ce4c-988e-42d7-9325-e7b682f6deb4"
      },
      "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/b3e9abd5-eedd-42b3-ae9c-3debaf83e785' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "b3e9abd5-eedd-42b3-ae9c-3debaf83e785",
    "type": "notes",
    "attributes": {
      "created_at": "2024-11-11T09:25:26.528827+00:00",
      "updated_at": "2024-11-11T09:25:26.528827+00:00",
      "body": "Agreed to give this customer a 20% discount on the next order",
      "owner_id": "c5e1ea15-ae9c-4e9e-b090-e354d2ba70fa",
      "owner_type": "customers",
      "employee_id": "addbc542-7058-4f7d-9ec5-989273bdb9ec"
    },
    "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": "0f11dee1-a4da-4ef3-9b8a-3b81658d3c03",
          "owner_type": "customers"
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "2782e6ff-b9ab-40ca-8368-730312457c1f",
    "type": "notes",
    "attributes": {
      "created_at": "2024-11-11T09:25:25.755841+00:00",
      "updated_at": "2024-11-11T09:25:25.755841+00:00",
      "body": "Agreed to give this customer a 20% discount on the next order",
      "owner_id": "0f11dee1-a4da-4ef3-9b8a-3b81658d3c03",
      "owner_type": "customers",
      "employee_id": "f5cc78cb-c28f-4d7c-8880-d0c6afe48118"
    },
    "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/0953a0ee-5ab3-4273-aab5-97b2b6aaa27b' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "0953a0ee-5ab3-4273-aab5-97b2b6aaa27b",
    "type": "notes",
    "attributes": {
      "created_at": "2024-11-11T09:25:27.169982+00:00",
      "updated_at": "2024-11-11T09:25:27.169982+00:00",
      "body": "Agreed to give this customer a 20% discount on the next order",
      "owner_id": "b678d59c-fe3e-4062-812b-d456ae084d82",
      "owner_type": "customers",
      "employee_id": "d753fdfe-65dc-4029-a9b6-fcb48643c1b9"
    },
    "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

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

Customer

Artifacts

No artifacts are generated when bullk updating resources.

Endpoints

GET /api/boomerang/operations

GET /api/boomerang/operations/{id}

POST /api/boomerang/operations

Fields

Every operation has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
status String readonly
One of scheduled, in_progress, finished, failed
status_message String readonly
A UI-friendly string explaining the status & progress of the operation for the user.
finished_at Datetime readonly
The moment when the operation is finished executing.
description String readonly
Explains what the operation is doing in a short sentence.
artifact Hash readonly
An object that returns an optional artifact of the operation. E.g. a file if the operation generates a report.
error_data Array readonly
An array of strings with errors that happened during execution of the operation.
error_count Integer readonly
The number of errors that happened during the execution. See error_data.
employee_id Uuid readonly
The associated Employee
operation_data Hash
An object with the params used to initiate the operation. See the description of the operation.

Relationships

Operations have the following relationships:

Name Description
employee Employees readonly
Associated Employee

Listing operations

How to fetch a list of operations:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/operations' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "bafc9d9b-6ed5-4558-a808-ee1c712f47cd",
      "type": "operations",
      "attributes": {
        "created_at": "2024-11-11T09:26:03.417998+00:00",
        "updated_at": "2024-11-11T09:26:03.417998+00:00",
        "status": "scheduled",
        "status_message": null,
        "finished_at": null,
        "description": null,
        "artifact": {
          "url": null
        },
        "error_data": [],
        "error_count": 0,
        "employee_id": "4623ab47-89e2-48b5-8d48-79d69785999b"
      },
      "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/132a14b7-8103-4802-a02d-8c6a532a6372' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "132a14b7-8103-4802-a02d-8c6a532a6372",
    "type": "operations",
    "attributes": {
      "created_at": "2024-11-11T09:26:02.065516+00:00",
      "updated_at": "2024-11-11T09:26:02.065516+00:00",
      "status": "scheduled",
      "status_message": null,
      "finished_at": null,
      "description": null,
      "artifact": {
        "url": null
      },
      "error_data": [],
      "error_count": 0,
      "employee_id": "52cf6aee-ac9a-43df-868e-b0ac7dbf0490"
    },
    "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": "5cc3d8be-9a03-4eca-afee-f1c2aa9f9c2f",
    "type": "operations",
    "attributes": {
      "created_at": "2024-11-11T09:26:02.752979+00:00",
      "updated_at": "2024-11-11T09:26:02.752979+00:00",
      "status": "scheduled",
      "status_message": null,
      "finished_at": null,
      "description": "Archiving customers",
      "artifact": {
        "url": null
      },
      "error_data": [],
      "error_count": 0,
      "employee_id": "b7a8b5c1-c3f1-45d2-b27d-aafc1c37a81b"
    },
    "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:

An order can have multiple of the following statuses:

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:

Changing one of the following values can lead to shortages:

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
The associated Tax region
coupon_id Uuid nullable
The associated Coupon
start_location_id Uuid
The associated Start location
stop_location_id Uuid
The associated Stop location

Relationships

Orders have the following relationships:

Name Description
barcode Barcodes
Associated Barcode
coupon Coupons
Associated Coupon
customer Customers
The associated customer
documents Documents readonly
Associated Documents
lines Lines readonly
Associated Lines
notes Notes readonly
Associated Notes
order_delivery_rate Order delivery rates
Associated Order delivery rate
plannings Plannings readonly
Associated Plannings
properties Properties readonly
Associated Properties
start_location Locations readonly
The location where the customer will pick up the items.
stock_item_plannings Stock item plannings readonly
Associated Stock item plannings
stop_location Locations readonly
The location where the customer will return the items.
When the clusters feature is in use, the stop location needs to be in the same cluster as the start location.
tax_region Tax regions
Associated Tax region
tax_values Tax values readonly
Associated Tax values
transfers Transfers readonly
Associated Transfers

Listing orders

How to fetch a list of orders:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/orders' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "3e28aa28-a621-4a9a-88be-90eba2124724",
      "type": "orders",
      "attributes": {
        "created_at": "2024-11-11T09:26:56.946054+00:00",
        "updated_at": "2024-11-11T09:26:58.690456+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": "56d7b7a3-00ca-4b15-be9a-2443e068b583",
        "tax_region_id": null,
        "coupon_id": null,
        "start_location_id": "e3bec29c-a20e-49c3-bf03-b2c01eb0e5b8",
        "stop_location_id": "e3bec29c-a20e-49c3-bf03-b2c01eb0e5b8"
      },
      "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-12T09:27:23Z",
                    "lte": "2024-11-15T09:27:23Z"
                  }
                },
                {
                  "stops_at": {
                    "gte": "2024-11-12T09:27:23Z",
                    "lte": "2024-11-15T09:27:23Z"
                  }
                }
              ]
            },
            {
              "operator": "and",
              "attributes": [
                {
                  "deposit_type": "none"
                },
                {
                  "payment_status": "paid"
                }
              ]
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "93022740-b240-4e0d-8d54-33b2e50ab688"
    },
    {
      "id": "d33a6173-f41c-45cd-bfac-020c1bb42104"
    }
  ]
}

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": "245a1c75-b69a-4b49-b41d-ea4e00ff7f41",
    "type": "orders",
    "attributes": {
      "created_at": "2024-11-11T09:27:16.604537+00:00",
      "updated_at": "2024-11-11T09:27:16.613985+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": "10bfb32c-c9e2-41f6-9aff-31e5ae31351b",
      "stop_location_id": "10bfb32c-c9e2-41f6-9aff-31e5ae31351b"
    },
    "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/7c5e3d3b-2b3f-40b9-bfeb-8c408ff5d736' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "7c5e3d3b-2b3f-40b9-bfeb-8c408ff5d736",
    "type": "orders",
    "attributes": {
      "created_at": "2024-11-11T09:27:10.879665+00:00",
      "updated_at": "2024-11-11T09:27:12.779944+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