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": "25b49e65-07a5-4798-b8d8-82d31c2657df",
      "type": "barcodes",
      "attributes": {
        "created_at": "2024-11-18T09:26:07.415744+00:00",
        "updated_at": "2024-11-18T09:26:07.415744+00:00",
        "number": "http://bqbl.it/25b49e65-07a5-4798-b8d8-82d31c2657df",
        "barcode_type": "qr_code",
        "image_url": "http://company-name-155.lvh.me:/barcodes/25b49e65-07a5-4798-b8d8-82d31c2657df/image",
        "owner_id": "99cf4e58-dff8-4c43-9f4a-6448ed787c94",
        "owner_type": "customers"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

How to find an owner by a barcode number:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/barcodes?filter%5Bnumber%5D=http%3A%2F%2Fbqbl.it%2F67119cf3-f53b-42d4-bbc6-777e49b08e7a&include=owner' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "67119cf3-f53b-42d4-bbc6-777e49b08e7a",
      "type": "barcodes",
      "attributes": {
        "created_at": "2024-11-18T09:26:07.894103+00:00",
        "updated_at": "2024-11-18T09:26:07.894103+00:00",
        "number": "http://bqbl.it/67119cf3-f53b-42d4-bbc6-777e49b08e7a",
        "barcode_type": "qr_code",
        "image_url": "http://company-name-156.lvh.me:/barcodes/67119cf3-f53b-42d4-bbc6-777e49b08e7a/image",
        "owner_id": "a382b761-c5b8-4a1c-b4f3-f464b22ed4c8",
        "owner_type": "customers"
      },
      "relationships": {
        "owner": {
          "data": {
            "type": "customers",
            "id": "a382b761-c5b8-4a1c-b4f3-f464b22ed4c8"
          }
        }
      }
    }
  ],
  "included": [
    {
      "id": "a382b761-c5b8-4a1c-b4f3-f464b22ed4c8",
      "type": "customers",
      "attributes": {
        "created_at": "2024-11-18T09:26:07.857357+00:00",
        "updated_at": "2024-11-18T09:26:07.895673+00:00",
        "archived": false,
        "archived_at": null,
        "number": 1,
        "name": "John Doe",
        "email": "[email protected]",
        "deposit_type": "default",
        "deposit_value": 0.0,
        "discount_percentage": 0.0,
        "legal_type": "person",
        "email_marketing_consented": false,
        "email_marketing_consent_updated_at": null,
        "properties": {},
        "tag_list": [],
        "merge_suggestion_customer_id": null,
        "tax_region_id": null
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

How to find an owner by a barcode number containing a url:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/barcodes?filter%5Bnumber%5D=aHR0cDovL2JxYmwuaXQvNWExM2NkNGItY2UyYi00ZGNjLTg2MTItMmU3ZmE3NTNlZTFm&include=owner' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "5a13cd4b-ce2b-4dcc-8612-2e7fa753ee1f",
      "type": "barcodes",
      "attributes": {
        "created_at": "2024-11-18T09:26:08.441539+00:00",
        "updated_at": "2024-11-18T09:26:08.441539+00:00",
        "number": "http://bqbl.it/5a13cd4b-ce2b-4dcc-8612-2e7fa753ee1f",
        "barcode_type": "qr_code",
        "image_url": "http://company-name-157.lvh.me:/barcodes/5a13cd4b-ce2b-4dcc-8612-2e7fa753ee1f/image",
        "owner_id": "cab274f6-b49d-4e9b-91f7-03fd8ced276b",
        "owner_type": "customers"
      },
      "relationships": {
        "owner": {
          "data": {
            "type": "customers",
            "id": "cab274f6-b49d-4e9b-91f7-03fd8ced276b"
          }
        }
      }
    }
  ],
  "included": [
    {
      "id": "cab274f6-b49d-4e9b-91f7-03fd8ced276b",
      "type": "customers",
      "attributes": {
        "created_at": "2024-11-18T09:26:08.409630+00:00",
        "updated_at": "2024-11-18T09:26:08.442935+00:00",
        "archived": false,
        "archived_at": null,
        "number": 2,
        "name": "John Doe",
        "email": "[email protected]",
        "deposit_type": "default",
        "deposit_value": 0.0,
        "discount_percentage": 0.0,
        "legal_type": "person",
        "email_marketing_consented": false,
        "email_marketing_consent_updated_at": null,
        "properties": {},
        "tag_list": [],
        "merge_suggestion_customer_id": null,
        "tax_region_id": null
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/barcodes

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
number String
eq
barcode_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
owner_id Uuid
eq, not_eq
owner_type String
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

owner => photo

product => photo

Fetching a barcode

How to fetch a barcode:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/barcodes/6cf8d024-4f3a-4fb0-a988-99c4a53eb47a?include=owner' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "6cf8d024-4f3a-4fb0-a988-99c4a53eb47a",
    "type": "barcodes",
    "attributes": {
      "created_at": "2024-11-18T09:26:06.917405+00:00",
      "updated_at": "2024-11-18T09:26:06.917405+00:00",
      "number": "http://bqbl.it/6cf8d024-4f3a-4fb0-a988-99c4a53eb47a",
      "barcode_type": "qr_code",
      "image_url": "http://company-name-154.lvh.me:/barcodes/6cf8d024-4f3a-4fb0-a988-99c4a53eb47a/image",
      "owner_id": "9472a3f1-48cd-45ce-bb81-7d2b502b7dab",
      "owner_type": "customers"
    },
    "relationships": {
      "owner": {
        "data": {
          "type": "customers",
          "id": "9472a3f1-48cd-45ce-bb81-7d2b502b7dab"
        }
      }
    }
  },
  "included": [
    {
      "id": "9472a3f1-48cd-45ce-bb81-7d2b502b7dab",
      "type": "customers",
      "attributes": {
        "created_at": "2024-11-18T09:26:06.883946+00:00",
        "updated_at": "2024-11-18T09:26:06.919076+00:00",
        "archived": false,
        "archived_at": null,
        "number": 1,
        "name": "John Doe",
        "email": "[email protected]",
        "deposit_type": "default",
        "deposit_value": 0.0,
        "discount_percentage": 0.0,
        "legal_type": "person",
        "email_marketing_consented": false,
        "email_marketing_consent_updated_at": null,
        "properties": {},
        "tag_list": [],
        "merge_suggestion_customer_id": null,
        "tax_region_id": null
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/barcodes/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

owner => photo

product => photo

Creating a barcode

How to create a barcode:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/barcodes' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "barcodes",
        "attributes": {
          "barcode_type": "qr_code",
          "owner_id": "a1caffac-b479-4b13-a1a0-986eaf5f4c01",
          "owner_type": "customers"
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "0b4a7b6c-448e-4c1f-9e7d-a9df21b1c529",
    "type": "barcodes",
    "attributes": {
      "created_at": "2024-11-18T09:26:05.919316+00:00",
      "updated_at": "2024-11-18T09:26:05.919316+00:00",
      "number": "http://bqbl.it/0b4a7b6c-448e-4c1f-9e7d-a9df21b1c529",
      "barcode_type": "qr_code",
      "image_url": "http://company-name-152.lvh.me:/barcodes/0b4a7b6c-448e-4c1f-9e7d-a9df21b1c529/image",
      "owner_id": "a1caffac-b479-4b13-a1a0-986eaf5f4c01",
      "owner_type": "customers"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/barcodes

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][number] String
The barcode data, can be a number, code or url. Leave blank to let Booqable create one. When using a URL, it's advised to base64 encode the number before filtering.
data[attributes][barcode_type] String
One of code39, code93, code128, ean8, ean13, qr_code
data[attributes][owner_id] Uuid
ID of its owner
data[attributes][owner_type] String
The resource type of the owner. One of orders, products, customers, stock_items

Includes

This request accepts the following includes:

owner => photo

product => photo

Updating a barcode

How to update a barcode:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/barcodes/255a1d4c-e635-40af-b6ad-3a59437f3c5a' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "255a1d4c-e635-40af-b6ad-3a59437f3c5a",
        "type": "barcodes",
        "attributes": {
          "number": "https://myfancysite.com"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "255a1d4c-e635-40af-b6ad-3a59437f3c5a",
    "type": "barcodes",
    "attributes": {
      "created_at": "2024-11-18T09:26:06.392684+00:00",
      "updated_at": "2024-11-18T09:26:06.446291+00:00",
      "number": "https://myfancysite.com",
      "barcode_type": "qr_code",
      "image_url": "http://company-name-153.lvh.me:/barcodes/255a1d4c-e635-40af-b6ad-3a59437f3c5a/image",
      "owner_id": "a97d4cb9-c2b7-4b18-a3fc-a8de386b0a57",
      "owner_type": "customers"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/barcodes/{id}

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][number] String
The barcode data, can be a number, code or url. Leave blank to let Booqable create one. When using a URL, it's advised to base64 encode the number before filtering.
data[attributes][barcode_type] String
One of code39, code93, code128, ean8, ean13, qr_code
data[attributes][owner_id] Uuid
ID of its owner
data[attributes][owner_type] String
The resource type of the owner. One of orders, products, customers, stock_items

Includes

This request accepts the following includes:

owner => photo

product => photo

Destroying a barcode

How to delete a barcode:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/barcodes/a286df08-bebc-4369-9520-e73f490b1f9b' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "a286df08-bebc-4369-9520-e73f490b1f9b",
    "type": "barcodes",
    "attributes": {
      "created_at": "2024-11-18T09:26:05.289955+00:00",
      "updated_at": "2024-11-18T09:26:05.289955+00:00",
      "number": "http://bqbl.it/a286df08-bebc-4369-9520-e73f490b1f9b",
      "barcode_type": "qr_code",
      "image_url": "http://company-name-151.lvh.me:/barcodes/a286df08-bebc-4369-9520-e73f490b1f9b/image",
      "owner_id": "9a026ff4-f2c7-4c58-95f2-721265c1845c",
      "owner_type": "customers"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/barcodes/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

owner => photo

product => photo

Bundle items

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

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

Endpoints

GET /api/boomerang/bundle_items

GET /api/boomerang/bundle_items/{id}

POST /api/boomerang/bundle_items

PUT /api/boomerang/bundle_items/{id}

DELETE /api/boomerang/bundle_items/{id}

Fields

Every bundle item has the following fields:

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

Relationships

Bundle items have the following relationships:

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

Listing bundle items

How to fetch a list of bundle items:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/bundle_items?filter%5Bbundle_id%5D=388062f6-cad1-42dd-93e6-9db91605de1b' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "4991982a-64f7-4bac-99db-5a97851b163f",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2024-11-18T09:27:15.826483+00:00",
        "updated_at": "2024-11-18T09:27:15.826483+00:00",
        "quantity": 2,
        "discount_percentage": 15.0,
        "position": 1,
        "bundle_id": "388062f6-cad1-42dd-93e6-9db91605de1b",
        "product_group_id": "3ad0e0da-2448-4789-b289-0b9c98a16c30",
        "product_id": "2e8d020f-b072-4916-9804-e848687fe820"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/bundle_items

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=bundle,product,product_group
fields[] Array
List of comma seperated fields to include ?fields[bundle_items]=created_at,updated_at,quantity
filter Hash
The filters to apply ?filter[attribute][eq]=value
sort String
How to sort the data ?sort=attribute1,-attribute2
meta Hash
Metadata to send along ?meta[total][]=count
page[number] String
The page to request
page[size] String
The amount of items per page (max 100)

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
quantity Integer
eq, not_eq, gt, gte, lt, lte
discount_percentage Float
eq, not_eq, gt, gte, lt, lte
position Integer
eq, not_eq, gt, gte, lt, lte
bundle_id Uuid
eq, not_eq
product_group_id Uuid
eq, not_eq
product_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

bundle

product => photo

product_group => photo

Fetching a bundle item

How to fetch a bundle item:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/bundle_items/2e22fba6-9218-4ade-85a7-894b5b48924e' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "2e22fba6-9218-4ade-85a7-894b5b48924e",
    "type": "bundle_items",
    "attributes": {
      "created_at": "2024-11-18T09:27:15.141954+00:00",
      "updated_at": "2024-11-18T09:27:15.141954+00:00",
      "quantity": 2,
      "discount_percentage": 15.0,
      "position": 1,
      "bundle_id": "414ebd9f-d0b3-4e93-b414-aa25bab0f380",
      "product_group_id": "1f75c2af-f16c-4c24-9eae-0744525b6cfa",
      "product_id": "b5946531-44fa-417a-862a-8a57803bc4f7"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/bundle_items/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

bundle

product => photo

product_group => photo

Creating a bundle item

How to create a bundle item:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/bundle_items' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "bundle_items",
        "attributes": {
          "bundle_id": "05d7efd1-5d69-431e-9f9a-10c47386b929",
          "product_group_id": "1464dcf7-5168-42dc-92bf-059f3bb6568b",
          "product_id": "9325221e-5fb4-4646-b630-96de85920214",
          "quantity": 2,
          "discount_percentage": 15
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "284f4473-d818-41e0-96fa-1ba3d491b682",
    "type": "bundle_items",
    "attributes": {
      "created_at": "2024-11-18T09:27:14.462255+00:00",
      "updated_at": "2024-11-18T09:27:14.462255+00:00",
      "quantity": 2,
      "discount_percentage": 15.0,
      "position": 2,
      "bundle_id": "05d7efd1-5d69-431e-9f9a-10c47386b929",
      "product_group_id": "1464dcf7-5168-42dc-92bf-059f3bb6568b",
      "product_id": "9325221e-5fb4-4646-b630-96de85920214"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/bundle_items

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

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

Includes

This request accepts the following includes:

bundle

product => photo

product_group => photo

Updating a bundle item

How to update a bundle item:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/bundle_items/cab1a835-7171-4fc5-b53a-222e1b56d861' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "cab1a835-7171-4fc5-b53a-222e1b56d861",
        "type": "bundle_items",
        "attributes": {
          "quantity": 3,
          "discount_percentage": 20
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "cab1a835-7171-4fc5-b53a-222e1b56d861",
    "type": "bundle_items",
    "attributes": {
      "created_at": "2024-11-18T09:27:12.731149+00:00",
      "updated_at": "2024-11-18T09:27:12.801609+00:00",
      "quantity": 3,
      "discount_percentage": 20.0,
      "position": 1,
      "bundle_id": "48d48dd9-1fde-4569-b0d5-5b53da7bdb6b",
      "product_group_id": "9f5f0c65-9552-425d-9b77-47ae2b12b84c",
      "product_id": "33f82774-62e3-426e-adee-0489ccf37b7b"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/bundle_items/{id}

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

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

Includes

This request accepts the following includes:

bundle

product => photo

product_group => photo

Deleting a bundle item

How to delete a bundle item:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/bundle_items/55044316-637b-4cff-80d3-d0cbdd2ab2e5' \
    --header 'content-type: application/json' \
    --data '{}'

A 200 status response looks like this:

  {
  "data": {
    "id": "55044316-637b-4cff-80d3-d0cbdd2ab2e5",
    "type": "bundle_items",
    "attributes": {
      "created_at": "2024-11-18T09:27:13.489104+00:00",
      "updated_at": "2024-11-18T09:27:13.489104+00:00",
      "quantity": 2,
      "discount_percentage": 15.0,
      "position": 1,
      "bundle_id": "c63c635d-1b07-4c6d-b167-67eaa6f94e97",
      "product_group_id": "4df548ad-ef45-44b0-b8d6-0bf49675cab5",
      "product_id": "1523f4be-fc02-4225-a908-2e3472c6ae8d"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/bundle_items/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Bundles

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

Endpoints

GET /api/boomerang/bundles

POST api/boomerang/bundles/search

GET /api/boomerang/bundles/{id}

POST /api/boomerang/bundles

PUT /api/boomerang/bundles/{id}

DELETE /api/boomerang/bundles/{id}

Fields

Every bundle has the following fields:

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

Relationships

Bundles have the following relationships:

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

Listing bundles

How to fetch a list of bundles:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "b0353bb8-739c-4618-bbd5-d957c998725f",
      "type": "bundles",
      "attributes": {
        "created_at": "2024-11-18T09:27:32.591296+00:00",
        "updated_at": "2024-11-18T09:27:32.591296+00:00",
        "archived": false,
        "archived_at": null,
        "type": "bundles",
        "name": "iPad Bundle",
        "slug": "ipad-bundle",
        "product_type": "bundle",
        "extra_information": null,
        "photo_url": null,
        "description": null,
        "excerpt": null,
        "show_in_store": true,
        "sorting_weight": 0,
        "discountable": true,
        "taxable": true,
        "seo_title": null,
        "seo_description": null,
        "tag_list": [],
        "photo_id": null,
        "tax_category_id": null
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/bundles

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
q String
eq
type String
eq, not_eq
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
slug String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
product_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
extra_information String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
description String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
excerpt String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
show_in_store Boolean
eq
sorting_weight Integer
eq, not_eq, gt, gte, lt, lte
discountable Boolean
eq
taxable Boolean
eq
seo_title String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
seo_description String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
tag_list String
eq
tax_category_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count
archived Array
count
tag_list Array
count
taxable Array
count
discountable Array
count
product_type Array
count
show_in_store Array
count
tax_category_id Array
count

Includes

This request accepts the following includes:

photo

inventory_levels

Searching bundles

Use advanced search to make logical filter groups with and/or operators.

How to search for bundles:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/bundles/search' \
    --header 'content-type: application/json' \
    --data '{
      "fields": {
        "bundles": "id"
      },
      "filter": {
        "conditions": {
          "operator": "or",
          "attributes": [
            {
              "operator": "and",
              "attributes": [
                {
                  "discountable": true
                },
                {
                  "taxable": true
                }
              ]
            },
            {
              "operator": "and",
              "attributes": [
                {
                  "show_in_store": true
                },
                {
                  "taxable": true
                }
              ]
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "bdbba3e1-d05f-488f-9c29-43244fd8ef11"
    },
    {
      "id": "1c752d34-d30f-4a37-b8db-a7858bbb59a1"
    },
    {
      "id": "4df58387-8bd7-4bc2-afa5-1522bdb44cd4"
    }
  ]
}

HTTP Request

POST api/boomerang/bundles/search

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
q String
eq
type String
eq, not_eq
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
slug String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
product_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
extra_information String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
description String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
excerpt String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
show_in_store Boolean
eq
sorting_weight Integer
eq, not_eq, gt, gte, lt, lte
discountable Boolean
eq
taxable Boolean
eq
seo_title String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
seo_description String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
tag_list String
eq
tax_category_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count
archived Array
count
tag_list Array
count
taxable Array
count
discountable Array
count
product_type Array
count
show_in_store Array
count
tax_category_id Array
count

Includes

This request accepts the following includes:

photo

inventory_levels

Fetching a bundle

How to fetch a bundle:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/bundles/8fd7a566-6ae2-4635-ab0b-74c1b8f23d38' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "8fd7a566-6ae2-4635-ab0b-74c1b8f23d38",
    "type": "bundles",
    "attributes": {
      "created_at": "2024-11-18T09:27:34.191925+00:00",
      "updated_at": "2024-11-18T09:27:34.191925+00:00",
      "archived": false,
      "archived_at": null,
      "type": "bundles",
      "name": "iPad Bundle",
      "slug": "ipad-bundle",
      "product_type": "bundle",
      "extra_information": null,
      "photo_url": null,
      "description": null,
      "excerpt": null,
      "show_in_store": true,
      "sorting_weight": 0,
      "discountable": true,
      "taxable": true,
      "seo_title": null,
      "seo_description": null,
      "tag_list": [],
      "photo_id": null,
      "tax_category_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/bundles/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

photo

bundle_items => product_group => photo

products => photo

product => photo

tax_category

Creating a bundle

How to create a bundle with bundle items:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/bundles' \
    --header 'content-type: application/json' \
    --data '{
      "include": "bundle_items",
      "data": {
        "type": "bundles",
        "attributes": {
          "name": "iPad Pro Bundle",
          "bundle_items_attributes": [
            {
              "quantity": 2,
              "discount_percentage": 10,
              "product_group_id": "74548794-3d0f-4e02-bae2-75409dc296bb",
              "product_id": "2c6a10e2-5155-4dc1-9b61-3ef62ac5abf0"
            },
            {
              "quantity": 2,
              "discount_percentage": 15,
              "product_group_id": "1504ef1a-e032-47be-b271-c9738d20864f",
              "product_id": "a5223ca9-0a61-4302-a2c7-b2c10cbd91d1"
            }
          ]
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "8de9f53b-d988-457b-a131-eae9ca48e294",
    "type": "bundles",
    "attributes": {
      "created_at": "2024-11-18T09:27:33.502243+00:00",
      "updated_at": "2024-11-18T09:27:33.714539+00:00",
      "archived": false,
      "archived_at": null,
      "type": "bundles",
      "name": "iPad Pro Bundle",
      "slug": "ipad-pro-bundle",
      "product_type": "bundle",
      "extra_information": null,
      "photo_url": null,
      "description": null,
      "excerpt": null,
      "show_in_store": true,
      "sorting_weight": 0,
      "discountable": true,
      "taxable": true,
      "seo_title": null,
      "seo_description": null,
      "tag_list": [],
      "photo_id": null,
      "tax_category_id": null
    },
    "relationships": {
      "bundle_items": {
        "data": [
          {
            "type": "bundle_items",
            "id": "905ecfe6-b2bd-4be2-8b9e-5b02c5b4c678"
          },
          {
            "type": "bundle_items",
            "id": "fdf78886-9f98-4f91-97a2-1b4c9ad7f6d9"
          },
          {
            "type": "bundle_items",
            "id": "ca887ae9-8d60-4aba-bd43-ace2860602b4"
          },
          {
            "type": "bundle_items",
            "id": "92b36c77-6484-43f9-981c-66b38fd93617"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "905ecfe6-b2bd-4be2-8b9e-5b02c5b4c678",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2024-11-18T09:27:33.505420+00:00",
        "updated_at": "2024-11-18T09:27:33.505420+00:00",
        "quantity": 2,
        "discount_percentage": 10.0,
        "position": 1,
        "bundle_id": "8de9f53b-d988-457b-a131-eae9ca48e294",
        "product_group_id": "74548794-3d0f-4e02-bae2-75409dc296bb",
        "product_id": "2c6a10e2-5155-4dc1-9b61-3ef62ac5abf0"
      },
      "relationships": {}
    },
    {
      "id": "fdf78886-9f98-4f91-97a2-1b4c9ad7f6d9",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2024-11-18T09:27:33.507043+00:00",
        "updated_at": "2024-11-18T09:27:33.507043+00:00",
        "quantity": 2,
        "discount_percentage": 15.0,
        "position": 2,
        "bundle_id": "8de9f53b-d988-457b-a131-eae9ca48e294",
        "product_group_id": "1504ef1a-e032-47be-b271-c9738d20864f",
        "product_id": "a5223ca9-0a61-4302-a2c7-b2c10cbd91d1"
      },
      "relationships": {}
    },
    {
      "id": "ca887ae9-8d60-4aba-bd43-ace2860602b4",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2024-11-18T09:27:33.508436+00:00",
        "updated_at": "2024-11-18T09:27:33.508436+00:00",
        "quantity": 2,
        "discount_percentage": 10.0,
        "position": 3,
        "bundle_id": "8de9f53b-d988-457b-a131-eae9ca48e294",
        "product_group_id": "74548794-3d0f-4e02-bae2-75409dc296bb",
        "product_id": "2c6a10e2-5155-4dc1-9b61-3ef62ac5abf0"
      },
      "relationships": {}
    },
    {
      "id": "92b36c77-6484-43f9-981c-66b38fd93617",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2024-11-18T09:27:33.509767+00:00",
        "updated_at": "2024-11-18T09:27:33.509767+00:00",
        "quantity": 2,
        "discount_percentage": 15.0,
        "position": 4,
        "bundle_id": "8de9f53b-d988-457b-a131-eae9ca48e294",
        "product_group_id": "1504ef1a-e032-47be-b271-c9738d20864f",
        "product_id": "a5223ca9-0a61-4302-a2c7-b2c10cbd91d1"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

POST /api/boomerang/bundles

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

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

Includes

This request accepts the following includes:

photo

bundle_items => product_group => photo

product => photo

tax_category

Updating a bundle

How to update a bundle with bundle items:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/bundles/21c10127-fe14-4257-9e28-36fcb5f2889b' \
    --header 'content-type: application/json' \
    --data '{
      "include": "bundle_items",
      "data": {
        "id": "21c10127-fe14-4257-9e28-36fcb5f2889b",
        "type": "bundles",
        "attributes": {
          "name": "iPad Pro Bundle",
          "bundle_items_attributes": [
            {
              "id": "29f204df-5d21-40f0-b11d-01cc32953a69",
              "_destroy": true
            },
            {
              "quantity": 2,
              "discount_percentage": 15,
              "product_group_id": "911cc08b-ad27-4c46-8b6e-1181dac68cac",
              "product_id": "8e11c11b-78e2-4c90-81df-229cfbd524a5"
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "21c10127-fe14-4257-9e28-36fcb5f2889b",
    "type": "bundles",
    "attributes": {
      "created_at": "2024-11-18T09:27:30.930456+00:00",
      "updated_at": "2024-11-18T09:27:31.601203+00:00",
      "archived": false,
      "archived_at": null,
      "type": "bundles",
      "name": "iPad Pro Bundle",
      "slug": "ipad-bundle",
      "product_type": "bundle",
      "extra_information": null,
      "photo_url": null,
      "description": null,
      "excerpt": null,
      "show_in_store": true,
      "sorting_weight": 0,
      "discountable": true,
      "taxable": true,
      "seo_title": null,
      "seo_description": null,
      "tag_list": [],
      "photo_id": null,
      "tax_category_id": null
    },
    "relationships": {
      "bundle_items": {
        "data": [
          {
            "type": "bundle_items",
            "id": "1680bd15-0964-4027-87bd-4002fa099939"
          },
          {
            "type": "bundle_items",
            "id": "f86cea2f-3c23-4d7c-a87e-3b035bbf7ad5"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "1680bd15-0964-4027-87bd-4002fa099939",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2024-11-18T09:27:31.458309+00:00",
        "updated_at": "2024-11-18T09:27:31.458309+00:00",
        "quantity": 2,
        "discount_percentage": 15.0,
        "position": 2,
        "bundle_id": "21c10127-fe14-4257-9e28-36fcb5f2889b",
        "product_group_id": "911cc08b-ad27-4c46-8b6e-1181dac68cac",
        "product_id": "8e11c11b-78e2-4c90-81df-229cfbd524a5"
      },
      "relationships": {}
    },
    {
      "id": "f86cea2f-3c23-4d7c-a87e-3b035bbf7ad5",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2024-11-18T09:27:31.459817+00:00",
        "updated_at": "2024-11-18T09:27:31.459817+00:00",
        "quantity": 2,
        "discount_percentage": 15.0,
        "position": 3,
        "bundle_id": "21c10127-fe14-4257-9e28-36fcb5f2889b",
        "product_group_id": "911cc08b-ad27-4c46-8b6e-1181dac68cac",
        "product_id": "8e11c11b-78e2-4c90-81df-229cfbd524a5"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

PUT /api/boomerang/bundles/{id}

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

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

Includes

This request accepts the following includes:

photo

bundle_items => product_group => photo

product => photo

tax_category

Archiving a bundle

How to delete a bundle:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/bundles/ba4a4110-5007-48a9-bdec-0d9b70ca274e' \
    --header 'content-type: application/json' \
    --data '{}'

A 200 status response looks like this:

  {
  "data": {
    "id": "ba4a4110-5007-48a9-bdec-0d9b70ca274e",
    "type": "bundles",
    "attributes": {
      "created_at": "2024-11-18T09:27:32.079640+00:00",
      "updated_at": "2024-11-18T09:27:32.142218+00:00",
      "archived": true,
      "archived_at": "2024-11-18T09:27:32.142218+00:00",
      "type": "bundles",
      "name": "iPad Bundle",
      "slug": "ipad-bundle",
      "product_type": "bundle",
      "extra_information": null,
      "photo_url": null,
      "description": null,
      "excerpt": null,
      "show_in_store": true,
      "sorting_weight": 0,
      "discountable": true,
      "taxable": true,
      "seo_title": null,
      "seo_description": null,
      "tag_list": [],
      "photo_id": null,
      "tax_category_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/bundles/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Companies

Every action performed in a Booqable account is scoped to a company; A company holds information and configuration about an account.

Endpoints

GET /api/boomerang/companies/current

PUT /api/boomerang/companies/current

Fields

Every company has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
name String
Name of the company
slug String readonly
Company's slug, used in urls
email String
Used in customer communication, on documents and as the reply-to address for emails that are being sent
billing_email String
Used to send billing emails to
phone String
Phone number
website String
Website
address_line_1 String
First address line
address_line_2 String
Second address line
zipcode String
Zipcode
city String
City
region String
Region
country String
Country
market String
The market the company operates in
use_billing_address Boolean
Whether to use billing address on invoices received from Booqable
billing_company String
Company name (used for invoices received from Booqable)
billing_address_line_1 String
First address line (used for invoices received from Booqable)
billing_address_line_2 String
Second address line (used for invoices received from Booqable)
billing_address_zipcode String
Zipcode (used for invoices received from Booqable)
billing_address_city String
City (used for invoices received from Booqable)
billing_address_region String
Region (used for invoices received from Booqable)
billing_address_country String
Country (used for invoices received from Booqable)
logo_url String readonly
Url of the uploaded logo
logo_base64 String writeonly
To update a logo send it as base64 encoded string
remove_logo Boolean writeonly
Remove current logo
favicon_url String readonly
Company favicon url
favicon_base64 String writeonly
To upload a favicon send it as a base64 encoded string
remove_favicon Boolean writeonly
Remove current favicon
default_timezone String
Company's default timezone
currency String
Currency of the company
financial_line_1 String
First extra financial information line (line bank account) used in customer communication, on documents and as the reply-to address for emails that are being sent
financial_line_2 String
Second extra financial information line (line bank account) used in customer communication, on documents and as the reply-to address for emails that are being sent
vat_number String
Company's vat number, used in customer communication and to define tax exempts
custom_domain String
Custom domain to use for hosted store and checkout
custom_domain_validation Hash
Validation details for the custom domain
development Boolean readonly
Whether this is a development account
shop_theme_id Uuid
ID of installed shop theme
installed_online_store Boolean readonly
If the online store is installed, this boolean will return true
source String readonly
UTM source present during signup
medium String readonly
UTM medium present during signup
tenant_token String readonly
Token
pending_subscription Boolean readonly
Whether the company has a pending subscription
team_size String readonly
Team size given during signup
projected_revenue String readonly
Projected revenue size given during signup
year_business_start String readonly
Year when company started, given during signup
address String readonly
The full address
main_address_attributes Hash writeonly
A hash with the company main address fields. Use it when updating the company main address. See address property type for more information
main_address Hash readonly
A hash with the company main address fields. Use it when fetching the company. See address property type for more information
billing_address_attributes Hash writeonly
A hash with the company billing address fields. Use it when updating the company billing address. See address property type for more information
billing_address Hash readonly
A hash with the company billing address fields. Use it when fetching the company. See address property type for more information
in_europe Boolean readonly
Whether company is situated in europe
continent String readonly
Continent the company is situated
subscription Hash readonly
Details about the subscription
third_party_id String readonly
ID used for third party tools

Fetching a company

How to fetch a companies:

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

A 200 status response looks like this:

  {
  "data": {
    "id": "a1f7cf71-f008-49df-8a15-734ba9420280",
    "type": "companies",
    "attributes": {
      "created_at": "2024-11-18T09:24:27.865681+00:00",
      "updated_at": "2024-11-18T09:24:27.881598+00:00",
      "name": "iRent",
      "slug": "irent",
      "email": "[email protected]",
      "billing_email": null,
      "phone": "0581234567",
      "website": "www.booqable.com",
      "address_line_1": "Blokhuispoort",
      "address_line_2": "Leeuwarden",
      "zipcode": "8900AB",
      "city": "Leeuwarden",
      "region": null,
      "country": "the Netherlands",
      "market": "AV / Camera",
      "use_billing_address": false,
      "billing_company": null,
      "billing_address_line_1": null,
      "billing_address_line_2": null,
      "billing_address_zipcode": null,
      "billing_address_city": null,
      "billing_address_region": null,
      "billing_address_country": null,
      "logo_url": null,
      "favicon_url": null,
      "default_timezone": "UTC",
      "currency": "usd",
      "financial_line_1": "Blokhuispoort",
      "financial_line_2": "Leeuwarden",
      "vat_number": null,
      "custom_domain": null,
      "custom_domain_validation": null,
      "development": false,
      "shop_theme_id": null,
      "installed_online_store": false,
      "source": null,
      "medium": null,
      "tenant_token": "c7b0d7d18102fc4b6500dda1e81dbbf8",
      "pending_subscription": false,
      "team_size": null,
      "projected_revenue": null,
      "year_business_start": null,
      "address": "Blokhuispoort\nLeeuwarden\n8900AB Leeuwarden\nthe Netherlands",
      "main_address": {
        "meets_validation_requirements": false,
        "first_name": null,
        "last_name": null,
        "address1": "Blokhuispoort",
        "address2": "Leeuwarden",
        "city": "Leeuwarden",
        "region": null,
        "zipcode": "8900AB",
        "country": "the Netherlands",
        "country_id": null,
        "province_id": null,
        "latitude": null,
        "longitude": null,
        "value": "Blokhuispoort\nLeeuwarden\n8900AB Leeuwarden\nthe Netherlands"
      },
      "billing_address": null
    }
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/companies/current

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Fetching subscription details

The subscription has the following fields:

Name Description
trial_ends_at Datetime readonly
When the trial ends
activated Boolean readonly
Whether subscription is active
suspended Boolean readonly
Whether account is suspended
canceled Boolean readonly
Whether subscription is canceled
canceled_at Datetime readonly
When the subscription is canceled (can also be in the future)
on_hold Boolean readonly
Whether account is on-hold
needs_activation Boolean readonly
Whether account needs to activate a subscription
legacy Datetime readonly
Whether it's a legacy subscription
product String readonly
Which product is active, one of Essential, Pro, Premium, Legacy
plan_id String readonly
ID of the product (used internally by Booqable)
interval String readonly
Billing interval, one of month, year
current_period_end Datetime readonly
When the current billing period ends
quantity Integer readonly
Quantity of the subscription (used for legacy subscriptions to buy seats)
extra_employees Integer readonly
Extra employees billed for
extra_locations Integer readonly
Extra locations billed for
amount_in_cents Integer readonly
Amount in cents
discount_in_cents Integer readonly
Discount in cents
balance_in_cents Integer readonly
Balance in cents, will be deducted from the next invoice(s)
coupon String readonly
Coupon that's currently active
coupon_percent_off String* readonly
Percentage of discount on the current active coupon
coupon_duration String* readonly
Duration type of the current active coupon, one of forever, once, repeating
coupon_duration_in_months String* readonly
Amount of months the coupon is active. Only present when coupon duration is repeating.
strategy String readonly
Billing strategy, one of send_invoice, charge_automatically
source Hash readonly
Information about the payment source
enabled_features Hash readonly
Beta features that are currently enabled
allowed_features Hash readonly
List of allowed features for plan
restrictions Hash readonly
Restrictions applied to this account

How to fetch details about the company its subscription:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/companies/current?extra_fields%5Bcompanies%5D=subscription&fields%5Bcompanies%5D=subscription' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "c3920ceb-09bf-4577-85e4-60bda3d2c752",
    "type": "companies",
    "attributes": {
      "subscription": {
        "trial_ends_at": "2024-12-02T09:24:28.273Z",
        "activated": false,
        "active_subscription": false,
        "suspended": false,
        "canceled": false,
        "canceled_at": null,
        "on_hold": false,
        "needs_activation": false,
        "product": "Premium",
        "plan_id": "premium_monthly",
        "interval": "month",
        "current_period_end": null,
        "extra_employees": 0,
        "extra_locations": 0,
        "amount_in_cents": 29900,
        "discount_in_cents": 0,
        "balance_in_cents": 0,
        "coupon": null,
        "coupon_percent_off": null,
        "coupon_duration": null,
        "coupon_duration_in_months": null,
        "strategy": "charge_automatically",
        "source": null,
        "enabled_features": [],
        "allowed_features": [
          "bundles",
          "multiple_locations",
          "advanced_pricing",
          "api",
          "custom_fields",
          "overbookings",
          "customer_auth",
          "custom_domain",
          "barcodes",
          "reports",
          "permissions",
          "exports",
          "coupons",
          "shop_tracking",
          "sso",
          "iprestrictions",
          "2fa_enforcing",
          "remove_powered_by"
        ],
        "restrictions": {
          "employees": 15,
          "email_max_recipients": 2000,
          "rate_limit_max": 250,
          "rate_limit_period": 60,
          "locations": 3
        },
        "can_try_plan": true
      }
    }
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/companies/current

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Updating a company

How to update a company:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/companies/current' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "b3edd09d-8c49-4c07-b1be-0abbaf58a4f7",
        "type": "companies",
        "attributes": {
          "name": "iRent LLC"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "b3edd09d-8c49-4c07-b1be-0abbaf58a4f7",
    "type": "companies",
    "attributes": {
      "created_at": "2024-11-18T09:24:27.427109+00:00",
      "updated_at": "2024-11-18T09:24:27.484231+00:00",
      "name": "iRent LLC",
      "slug": "irent",
      "email": "[email protected]",
      "billing_email": null,
      "phone": "0581234567",
      "website": "www.booqable.com",
      "address_line_1": "Blokhuispoort",
      "address_line_2": "Leeuwarden",
      "zipcode": "8900AB",
      "city": "Leeuwarden",
      "region": null,
      "country": "the Netherlands",
      "market": "AV / Camera",
      "use_billing_address": false,
      "billing_company": null,
      "billing_address_line_1": null,
      "billing_address_line_2": null,
      "billing_address_zipcode": null,
      "billing_address_city": null,
      "billing_address_region": null,
      "billing_address_country": null,
      "logo_url": null,
      "favicon_url": null,
      "default_timezone": "UTC",
      "currency": "usd",
      "financial_line_1": "Blokhuispoort",
      "financial_line_2": "Leeuwarden",
      "vat_number": null,
      "custom_domain": null,
      "custom_domain_validation": null,
      "development": false,
      "shop_theme_id": null,
      "installed_online_store": false,
      "source": null,
      "medium": null,
      "tenant_token": "3a3bc661f2cfef523c2788aca7718954",
      "pending_subscription": false,
      "team_size": null,
      "projected_revenue": null,
      "year_business_start": null,
      "address": "Blokhuispoort\nLeeuwarden\n8900AB Leeuwarden\nthe Netherlands",
      "main_address": {
        "meets_validation_requirements": false,
        "first_name": null,
        "last_name": null,
        "address1": "Blokhuispoort",
        "address2": "Leeuwarden",
        "city": "Leeuwarden",
        "region": null,
        "zipcode": "8900AB",
        "country": "the Netherlands",
        "country_id": null,
        "province_id": null,
        "latitude": null,
        "longitude": null,
        "value": "Blokhuispoort\nLeeuwarden\n8900AB Leeuwarden\nthe Netherlands"
      },
      "billing_address": null
    }
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/companies/current

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the company
data[attributes][email] String
Used in customer communication, on documents and as the reply-to address for emails that are being sent
data[attributes][billing_email] String
Used to send billing emails to
data[attributes][phone] String
Phone number
data[attributes][website] String
Website
data[attributes][address_line_1] String
First address line
data[attributes][address_line_2] String
Second address line
data[attributes][zipcode] String
Zipcode
data[attributes][city] String
City
data[attributes][region] String
Region
data[attributes][country] String
Country
data[attributes][market] String
The market the company operates in
data[attributes][use_billing_address] Boolean
Whether to use billing address on invoices received from Booqable
data[attributes][billing_company] String
Company name (used for invoices received from Booqable)
data[attributes][billing_address_line_1] String
First address line (used for invoices received from Booqable)
data[attributes][billing_address_line_2] String
Second address line (used for invoices received from Booqable)
data[attributes][billing_address_zipcode] String
Zipcode (used for invoices received from Booqable)
data[attributes][billing_address_city] String
City (used for invoices received from Booqable)
data[attributes][billing_address_region] String
Region (used for invoices received from Booqable)
data[attributes][billing_address_country] String
Country (used for invoices received from Booqable)
data[attributes][logo_base64] String
To update a logo send it as base64 encoded string
data[attributes][remove_logo] Boolean
Remove current logo
data[attributes][favicon_base64] String
To upload a favicon send it as a base64 encoded string
data[attributes][remove_favicon] Boolean
Remove current favicon
data[attributes][default_timezone] String
Company's default timezone
data[attributes][currency] String
Currency of the company
data[attributes][financial_line_1] String
First extra financial information line (line bank account) used in customer communication, on documents and as the reply-to address for emails that are being sent
data[attributes][financial_line_2] String
Second extra financial information line (line bank account) used in customer communication, on documents and as the reply-to address for emails that are being sent
data[attributes][vat_number] String
Company's vat number, used in customer communication and to define tax exempts
data[attributes][custom_domain] String
Custom domain to use for hosted store and checkout
data[attributes][custom_domain_validation] Hash
Validation details for the custom domain
data[attributes][shop_theme_id] Uuid
ID of installed shop theme
data[attributes][main_address_attributes] Hash
A hash with the company main address fields. Use it when updating the company main address. See address property type for more information
data[attributes][billing_address_attributes] Hash
A hash with the company billing address fields. Use it when updating the company billing address. See address property type for more information

Includes

This request does not accept any includes

Countries

The Country resource describes countries, including the information required to validate the format of addresses.

Fields

Every country has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
name String readonly
Name of the country
alpha2 String readonly
ISO 3166-1 alpha-2 code
province_required Boolean readonly
Whether a province is required for addresses in this country
province_type String readonly
The province type of this country. One of county, emirate, governorate, prefecture, province, region, state, state_and_territory
form_layout String readonly
The layout of the address form
show_layout String readonly
The layout of the address when shown
zipcode_required Boolean readonly
Whether a zipcode is required for addresses in this country
zipcode_autofill String readonly
The value to use for the zipcode when autofilling
zipcode_format String readonly
The format of the zipcode, as a regular expression
zipcode_placeholder String readonly
The placeholder to use for the zipcode
zipcode_type String readonly
The zipcode type of this country. One of eircode, pincode, postal_code, postal_index, postcode, zipcode
city_autofill String readonly
The value to use for the city when autofilling

Relationships

Countries have the following relationships:

Name Description
provinces Provinces readonly
Associated Provinces

Listing countries

How to fetch a list of countries:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "5b2ee373-aa50-4628-a635-71f462318e3f",
      "type": "countries",
      "attributes": {
        "created_at": "2024-11-18T09:28:11.063134+00:00",
        "updated_at": "2024-11-18T09:28:11.063134+00:00",
        "name": "Netherlands",
        "alpha2": "NL",
        "province_required": false,
        "province_type": "province",
        "form_layout": "{country}\n{first_name}{last_name}\n{address1}\n{address2}\n{zipcode}{city}",
        "show_layout": "{first_name} {last_name}\n{address1}\n{address2}\n{zipcode} {city}\n{country}",
        "zipcode_required": true,
        "zipcode_autofill": null,
        "zipcode_format": "\\d{4} ?[A-Z]{2}",
        "zipcode_placeholder": "1234 AB",
        "zipcode_type": "postcode",
        "city_autofill": null
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/countries

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
alpha2 String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

provinces

Coupons

Create codes to discount orders by a fixed amount or a percentage. Customers can redeem the codes online at checkout. Coupons can also be added to orders.

Endpoints

GET /api/boomerang/coupons

GET /api/boomerang/coupons/{id}

POST /api/boomerang/coupons

PUT /api/boomerang/coupons/{id}

DELETE /api/boomerang/coupons/{id}

Fields

Every coupon has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
archived Boolean readonly
Whether coupon is archived
archived_at Datetime nullable readonly
When the coupon was archived
identifier String
The code that customers need to type in
coupon_type String
One of percentage, cents
value Integer
A percentage for type percentage or a value in cents for cents
active Boolean
Whether coupon can be redeemed at the moment

Listing coupons

How to fetch a list of coupons:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "97bc7585-22ff-48d0-97cb-d1cfd14eea9e",
      "type": "coupons",
      "attributes": {
        "created_at": "2024-11-18T09:25:37.498947+00:00",
        "updated_at": "2024-11-18T09:25:37.498947+00:00",
        "archived": false,
        "archived_at": null,
        "identifier": "SUMMER20OFF",
        "coupon_type": "percentage",
        "value": 20,
        "active": true
      }
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/coupons

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
identifier String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
coupon_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
value Integer
eq, not_eq, gt, gte, lt, lte
active Boolean
eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request does not accept any includes

Fetching a coupon

How to fetch a coupon:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/coupons/a2266625-ad7e-40af-8c7c-64ea1b19da27' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "a2266625-ad7e-40af-8c7c-64ea1b19da27",
    "type": "coupons",
    "attributes": {
      "created_at": "2024-11-18T09:25:36.611347+00:00",
      "updated_at": "2024-11-18T09:25:36.611347+00:00",
      "archived": false,
      "archived_at": null,
      "identifier": "SUMMER20OFF",
      "coupon_type": "percentage",
      "value": 20,
      "active": true
    }
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/coupons/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Creating a coupon

How to create a coupon:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/coupons' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "coupons",
        "attributes": {
          "identifier": "WINTERDISCOUNT",
          "coupon_type": "cents",
          "value": 2000,
          "active": true
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "627f55c8-656c-4264-b255-3da1422cc955",
    "type": "coupons",
    "attributes": {
      "created_at": "2024-11-18T09:25:36.184857+00:00",
      "updated_at": "2024-11-18T09:25:36.184857+00:00",
      "archived": false,
      "archived_at": null,
      "identifier": "WINTERDISCOUNT",
      "coupon_type": "cents",
      "value": 2000,
      "active": true
    }
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/coupons

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][identifier] String
The code that customers need to type in
data[attributes][coupon_type] String
One of percentage, cents
data[attributes][value] Integer
A percentage for type percentage or a value in cents for cents
data[attributes][active] Boolean
Whether coupon can be redeemed at the moment

Includes

This request does not accept any includes

Updating a coupon

When updating a coupon the existing one is archived and a new one gets created:

How to update a coupon:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/coupons/db9dfb8d-632f-406a-81d6-a9a4270e6282' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "db9dfb8d-632f-406a-81d6-a9a4270e6282",
        "type": "coupons",
        "attributes": {
          "identifier": "SUMMER30OFF",
          "coupon_type": "percentage",
          "value": 30
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "8852d420-c25d-4018-8ea0-bac7a29a0ab5",
    "type": "coupons",
    "attributes": {
      "created_at": "2024-11-18T09:25:35.711822+00:00",
      "updated_at": "2024-11-18T09:25:35.731980+00:00",
      "archived": false,
      "archived_at": null,
      "identifier": "SUMMER30OFF",
      "coupon_type": "percentage",
      "value": 30,
      "active": false
    }
  },
  "meta": {}
}

How to deativate a coupon:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/coupons/32afbf7d-b559-4309-99cd-70d0f3f6550d' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "32afbf7d-b559-4309-99cd-70d0f3f6550d",
        "type": "coupons",
        "attributes": {
          "active": false
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "c775e016-8140-445a-86fa-387807ae6f56",
    "type": "coupons",
    "attributes": {
      "created_at": "2024-11-18T09:25:35.258130+00:00",
      "updated_at": "2024-11-18T09:25:35.279689+00:00",
      "archived": false,
      "archived_at": null,
      "identifier": "SUMMER20OFF",
      "coupon_type": "percentage",
      "value": 20,
      "active": false
    }
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/coupons/{id}

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][identifier] String
The code that customers need to type in
data[attributes][coupon_type] String
One of percentage, cents
data[attributes][value] Integer
A percentage for type percentage or a value in cents for cents
data[attributes][active] Boolean
Whether coupon can be redeemed at the moment

Includes

This request does not accept any includes

Archiving a coupon

How to archive a coupon:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/coupons/10d811d4-300e-4e75-bfcc-00de4fbd2d8f' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "10d811d4-300e-4e75-bfcc-00de4fbd2d8f",
    "type": "coupons",
    "attributes": {
      "created_at": "2024-11-18T09:25:37.058647+00:00",
      "updated_at": "2024-11-18T09:25:37.071494+00:00",
      "archived": true,
      "archived_at": "2024-11-18T09:25:37.071494+00:00",
      "identifier": "SUMMER20OFF",
      "coupon_type": "percentage",
      "value": 20,
      "active": true
    }
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/coupons/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Customers

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

Endpoints

GET /api/boomerang/customers

POST api/boomerang/customers/search

GET /api/boomerang/customers/{id}

POST /api/boomerang/customers

PUT /api/boomerang/customers/{id}

DELETE /api/boomerang/customers/{id}

Fields

Every customer has the following fields:

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

Relationships

Customers have the following relationships:

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

Listing customers

How to fetch a list of customers:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "426b878d-e680-4002-8069-493cc89f2f4c",
      "type": "customers",
      "attributes": {
        "created_at": "2024-11-18T09:25:52.358919+00:00",
        "updated_at": "2024-11-18T09:25:52.358919+00:00",
        "archived": false,
        "archived_at": null,
        "number": 1,
        "name": "John Doe",
        "email": "[email protected]",
        "deposit_type": "default",
        "deposit_value": 0.0,
        "discount_percentage": 0.0,
        "legal_type": "person",
        "email_marketing_consented": false,
        "email_marketing_consent_updated_at": null,
        "properties": {},
        "tag_list": [],
        "merge_suggestion_customer_id": null,
        "tax_region_id": null
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/customers

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=barcode,properties,tax_region
fields[] Array
List of comma seperated fields to include ?fields[customers]=created_at,updated_at,archived
filter Hash
The filters to apply ?filter[attribute][eq]=value
sort String
How to sort the data ?sort=attribute1,-attribute2
meta Hash
Metadata to send along ?meta[total][]=count
page[number] String
The page to request
page[size] String
The amount of items per page (max 100)

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq, gt
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
number Integer
eq, not_eq, gt, gte, lt, lte
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
email String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
deposit_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
deposit_value Float
eq, not_eq, gt, gte, lt, lte
discount_percentage Float
eq, not_eq, gt, gte, lt, lte
legal_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
email_marketing_consented Boolean
eq
tag_list String
eq
merge_suggestion_customer_id Uuid
eq, not_eq
tax_region_id Uuid
eq, not_eq
q String
eq
conditions Hash
eq

Meta

Results can be aggregated on:

Name Description
total Array
count
archived Array
count
legal_type Array
count
tag_list Array
count
discount_percentage Array
maximum, minimum, average

Includes

This request accepts the following includes:

barcode

properties

tax_region

Searching customers

Use advanced search to make logical filter groups with and/or operators.

How to search for customers:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/customers/search' \
    --header 'content-type: application/json' \
    --data '{
      "fields": {
        "customers": "id"
      },
      "filter": {
        "conditions": {
          "operator": "and",
          "attributes": [
            {
              "operator": "or",
              "attributes": [
                {
                  "name": "john"
                },
                {
                  "name": "jane"
                }
              ]
            },
            {
              "operator": "and",
              "attributes": [
                {
                  "discount_percentage": {
                    "gte": 50
                  }
                },
                {
                  "deposit_type": "none"
                }
              ]
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "7c37ff2f-d2b3-47c4-8969-f5661df164d2"
    },
    {
      "id": "04b130ec-ff38-46e6-8c67-1c36542e0ab4"
    }
  ]
}

HTTP Request

POST api/boomerang/customers/search

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=barcode,properties,tax_region
fields[] Array
List of comma seperated fields to include ?fields[customers]=created_at,updated_at,archived
filter Hash
The filters to apply ?filter[attribute][eq]=value
sort String
How to sort the data ?sort=attribute1,-attribute2
meta Hash
Metadata to send along ?meta[total][]=count
page[number] String
The page to request
page[size] String
The amount of items per page (max 100)

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq, gt
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
number Integer
eq, not_eq, gt, gte, lt, lte
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
email String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
deposit_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
deposit_value Float
eq, not_eq, gt, gte, lt, lte
discount_percentage Float
eq, not_eq, gt, gte, lt, lte
legal_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
email_marketing_consented Boolean
eq
tag_list String
eq
merge_suggestion_customer_id Uuid
eq, not_eq
tax_region_id Uuid
eq, not_eq
q String
eq
conditions Hash
eq

Meta

Results can be aggregated on:

Name Description
total Array
count
archived Array
count
legal_type Array
count
tag_list Array
count
discount_percentage Array
maximum, minimum, average

Includes

This request accepts the following includes:

barcode

properties

tax_region

Fetching a customer

How to fetch a customers:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/customers/e4a4664b-fda8-48a1-a7ca-3e4d1ade64e8?include=barcode%2Cproperties' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "e4a4664b-fda8-48a1-a7ca-3e4d1ade64e8",
    "type": "customers",
    "attributes": {
      "created_at": "2024-11-18T09:25:47.819935+00:00",
      "updated_at": "2024-11-18T09:25:47.819935+00:00",
      "archived": false,
      "archived_at": null,
      "number": 1,
      "name": "John Doe",
      "email": "[email protected]",
      "deposit_type": "default",
      "deposit_value": 0.0,
      "discount_percentage": 0.0,
      "legal_type": "person",
      "email_marketing_consented": false,
      "email_marketing_consent_updated_at": null,
      "properties": {},
      "tag_list": [],
      "merge_suggestion_customer_id": null,
      "tax_region_id": null
    },
    "relationships": {
      "properties": {
        "data": []
      },
      "barcode": {
        "data": null
      }
    }
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/customers/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

barcode

properties

tax_region

Creating a customer

How to create a customer:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/customers' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "customers",
        "attributes": {
          "name": "John Doe",
          "email": "[email protected]"
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "ae77c22f-fe76-40ed-8bdd-b96801be9b44",
    "type": "customers",
    "attributes": {
      "created_at": "2024-11-18T09:25:50.593549+00:00",
      "updated_at": "2024-11-18T09:25:50.593549+00:00",
      "archived": false,
      "archived_at": null,
      "number": 2,
      "name": "John Doe",
      "email": "[email protected]",
      "deposit_type": "default",
      "deposit_value": 0.0,
      "discount_percentage": 0.0,
      "legal_type": "person",
      "email_marketing_consented": false,
      "email_marketing_consent_updated_at": null,
      "properties": {},
      "tag_list": [],
      "merge_suggestion_customer_id": null,
      "tax_region_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/customers

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

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

Includes

This request accepts the following includes:

barcode

properties

tax_region

Updating a customer

How to update a customer:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/customers/fbf904ac-3550-4276-8beb-60e6b98395b5' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "fbf904ac-3550-4276-8beb-60e6b98395b5",
        "type": "customers",
        "attributes": {
          "name": "Jane Doe"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "fbf904ac-3550-4276-8beb-60e6b98395b5",
    "type": "customers",
    "attributes": {
      "created_at": "2024-11-18T09:25:51.477474+00:00",
      "updated_at": "2024-11-18T09:25:51.540752+00:00",
      "archived": false,
      "archived_at": null,
      "number": 1,
      "name": "Jane Doe",
      "email": "[email protected]",
      "deposit_type": "default",
      "deposit_value": 0.0,
      "discount_percentage": 0.0,
      "legal_type": "person",
      "email_marketing_consented": false,
      "email_marketing_consent_updated_at": null,
      "properties": {},
      "tag_list": [],
      "merge_suggestion_customer_id": null,
      "tax_region_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/customers/{id}

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

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

Includes

This request accepts the following includes:

barcode

properties

tax_region

Archiving a customer

How to archive a customer:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/customers/1f63c9b6-3a5d-4d2f-8791-8ad60eed97e2' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "1f63c9b6-3a5d-4d2f-8791-8ad60eed97e2",
    "type": "customers",
    "attributes": {
      "created_at": "2024-11-18T09:25:49.629777+00:00",
      "updated_at": "2024-11-18T09:25:49.696143+00:00",
      "archived": true,
      "archived_at": "2024-11-18T09:25:49.696143+00:00",
      "number": 1,
      "name": "John Doe",
      "email": "[email protected]",
      "deposit_type": "default",
      "deposit_value": 0.0,
      "discount_percentage": 0.0,
      "legal_type": "person",
      "email_marketing_consented": false,
      "email_marketing_consent_updated_at": null,
      "properties": {},
      "tag_list": [],
      "merge_suggestion_customer_id": null,
      "tax_region_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/customers/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Default properties

Booqable comes with standard fields but you can also add custom properties to capture additional data. Default properties show up in forms within Booqable and can be connected to checkout fields. Default properties are searchable, show up in exports and can be used in email templates. The actual values of those properties are stored in the Property resource.

Properties inherit their fields from a default property when they are connected. When creating properties, they are mapped with their default when one of the following fields correspond:

Endpoints

GET /api/boomerang/default_properties

GET /api/boomerang/default_properties/{id}

POST /api/boomerang/default_properties

PUT /api/boomerang/default_properties/{id}

DELETE /api/boomerang/default_properties/{id}

Fields

Every default property has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
name String
Name of the property (used as label and to compute identifier if left blank)
identifier String
Key that will be used in exports, responses and custom field variables in templates
position Integer
Which position the property has
property_type String
One of address, date_field, email, phone, select, text_area, text_field
show_on Array
Array of items to show this custom field on. Any of contract, invoice, packing, quote
validation_required Boolean
Whether this property has to be validated
owner_type String
The resource type of the owner. One of orders, product_groups, customers, users
select_options Array
For type select. The select options as array.
editable Boolean readonly
Whether this property is editable

Listing default properties

How to fetch a list of default properties:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/default_properties?include=owner' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "46f30c3c-3d7a-4e4f-b7e1-d3cbbef07356",
      "type": "default_properties",
      "attributes": {
        "created_at": "2024-11-18T09:28:11.920201+00:00",
        "updated_at": "2024-11-18T09:28:11.920201+00:00",
        "name": "Phone",
        "identifier": "phone",
        "position": 1,
        "property_type": "phone",
        "show_on": [],
        "validation_required": false,
        "owner_type": "customers",
        "select_options": [],
        "editable": true
      }
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/default_properties

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
identifier String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
validation_required Boolean
eq
owner_type String
eq, not_eq
editable Boolean
eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request does not accept any includes

Fetching a default property

How to fetch a default properties:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/default_properties/32f343af-8c07-4f7f-8e85-32380143879e?include=owner' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "32f343af-8c07-4f7f-8e85-32380143879e",
    "type": "default_properties",
    "attributes": {
      "created_at": "2024-11-18T09:28:12.803812+00:00",
      "updated_at": "2024-11-18T09:28:12.803812+00:00",
      "name": "Phone",
      "identifier": "phone",
      "position": 1,
      "property_type": "phone",
      "show_on": [],
      "validation_required": false,
      "owner_type": "customers",
      "select_options": [],
      "editable": true
    }
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/default_properties/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Creating a default property

How to create a default property and assign it to an owner:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/default_properties' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "default_properties",
        "attributes": {
          "name": "Mobile phone",
          "property_type": "phone",
          "owner_type": "customers"
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "596a7a1f-1e78-42fc-b4ef-6956d69ae71d",
    "type": "default_properties",
    "attributes": {
      "created_at": "2024-11-18T09:28:13.243347+00:00",
      "updated_at": "2024-11-18T09:28:13.243347+00:00",
      "name": "Mobile phone",
      "identifier": "mobile_phone",
      "position": 2,
      "property_type": "phone",
      "show_on": [],
      "validation_required": false,
      "owner_type": "customers",
      "select_options": [],
      "editable": true
    }
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/default_properties

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the property (used as label and to compute identifier if left blank)
data[attributes][identifier] String
Key that will be used in exports, responses and custom field variables in templates
data[attributes][position] Integer
Which position the property has
data[attributes][property_type] String
One of address, date_field, email, phone, select, text_area, text_field
data[attributes][show_on][] Array
Array of items to show this custom field on. Any of contract, invoice, packing, quote
data[attributes][validation_required] Boolean
Whether this property has to be validated
data[attributes][owner_type] String
The resource type of the owner. One of orders, product_groups, customers, users
data[attributes][select_options][] Array
For type select. The select options as array.

Includes

This request does not accept any includes

Updating a default property

How to update a default property:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/default_properties/fe38bfc6-c36a-468d-8108-076330dbb4f1' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "fe38bfc6-c36a-468d-8108-076330dbb4f1",
        "type": "default_properties",
        "attributes": {
          "property_type": "text_field"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "fe38bfc6-c36a-468d-8108-076330dbb4f1",
    "type": "default_properties",
    "attributes": {
      "created_at": "2024-11-18T09:28:11.483635+00:00",
      "updated_at": "2024-11-18T09:28:11.504558+00:00",
      "name": "Phone",
      "identifier": "phone",
      "position": 1,
      "property_type": "text_field",
      "show_on": [],
      "validation_required": false,
      "owner_type": "customers",
      "select_options": [],
      "editable": true
    }
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/default_properties/{id}

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the property (used as label and to compute identifier if left blank)
data[attributes][identifier] String
Key that will be used in exports, responses and custom field variables in templates
data[attributes][position] Integer
Which position the property has
data[attributes][property_type] String
One of address, date_field, email, phone, select, text_area, text_field
data[attributes][show_on][] Array
Array of items to show this custom field on. Any of contract, invoice, packing, quote
data[attributes][validation_required] Boolean
Whether this property has to be validated
data[attributes][owner_type] String
The resource type of the owner. One of orders, product_groups, customers, users
data[attributes][select_options][] Array
For type select. The select options as array.

Includes

This request does not accept any includes

Deleting a default property

How to delete a default property:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/default_properties/598542e6-7c5b-433c-80d7-5e345147420f' \
    --header 'content-type: application/json' \
    --data '{}'

A 200 status response looks like this:

  {
  "data": {
    "id": "598542e6-7c5b-433c-80d7-5e345147420f",
    "type": "default_properties",
    "attributes": {
      "created_at": "2024-11-18T09:28:12.351031+00:00",
      "updated_at": "2024-11-18T09:28:12.351031+00:00",
      "name": "Phone",
      "identifier": "phone",
      "position": 1,
      "property_type": "phone",
      "show_on": [],
      "validation_required": false,
      "owner_type": "customers",
      "select_options": [],
      "editable": true
    }
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/default_properties/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Documents

Documents hold financial and or legal information about an order. There are three types of documents: quote, contract, invoice.

When creating quotes and contracts, the following data is copied from the current state of the order:

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

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

Endpoints

GET /api/boomerang/documents

POST api/boomerang/documents/search

GET /api/boomerang/documents/{id}

POST /api/boomerang/documents

PUT /api/boomerang/documents/{id}

DELETE /api/boomerang/documents/{id}

Fields

Every document has the following fields:

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

Relationships

Documents have the following relationships:

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

Listing documents

How to fetch a list of documents:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "11ff3f1e-fbe4-4a32-8b19-4494802b111a",
      "type": "documents",
      "attributes": {
        "created_at": "2024-11-18T09:22:40.328524+00:00",
        "updated_at": "2024-11-18T09:22:40.370462+00:00",
        "archived": false,
        "archived_at": null,
        "document_type": "invoice",
        "number": null,
        "prefix": null,
        "prefix_with_number": null,
        "date": null,
        "due_date": null,
        "name": "John Doe",
        "address": null,
        "reference": null,
        "revised": false,
        "finalized": false,
        "sent": false,
        "confirmed": false,
        "status": "payment_due",
        "signature_url": null,
        "deposit_type": "percentage",
        "deposit_value": 10.0,
        "tag_list": [],
        "price_in_cents": 80250,
        "grand_total_in_cents": 72225,
        "grand_total_with_tax_in_cents": 87392,
        "discount_in_cents": 8025,
        "coupon_discount_in_cents": 0,
        "total_discount_in_cents": 8025,
        "deposit_in_cents": 10000,
        "deposit_paid_in_cents": 0,
        "deposit_refunded_in_cents": 0,
        "deposit_held_in_cents": 0,
        "deposit_to_refund_in_cents": 0,
        "to_be_paid_in_cents": 97392,
        "paid_in_cents": 0,
        "tax_in_cents": 15167,
        "discount_percentage": 10.0,
        "order_id": "0d54da2e-139c-4559-a362-9f8fa3e6168c",
        "customer_id": "d1f21921-e866-4717-91c1-427d3d4c0d10",
        "tax_region_id": null,
        "coupon_id": null
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/documents

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq, gt
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
document_type String
eq, not_eq
number Integer
eq, not_eq, gt, gte, lt, lte
prefix String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
prefix_with_number String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
date Date
eq, not_eq, gt, gte, lt, lte
due_date Date
eq, not_eq, gt, gte, lt, lte
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
address String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
revised Boolean
eq
finalized Boolean
eq
sent Boolean
eq
confirmed Boolean
eq
status String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
deposit_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
tag_list String
eq
price_in_cents Integer
eq, not_eq, gt, gte, lt, lte
grand_total_in_cents Integer
eq, not_eq, gt, gte, lt, lte
grand_total_with_tax_in_cents Integer
eq, not_eq, gt, gte, lt, lte
discount_in_cents Integer
eq, not_eq, gt, gte, lt, lte
coupon_discount_in_cents Integer
eq, not_eq, gt, gte, lt, lte
total_discount_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_paid_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_refunded_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_held_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_to_refund_in_cents Integer
eq, not_eq, gt, gte, lt, lte
to_be_paid_in_cents Integer
eq, not_eq, gt, gte, lt, lte
paid_in_cents Integer
eq, not_eq, gt, gte, lt, lte
tax_in_cents Integer
eq, not_eq, gt, gte, lt, lte
discount_percentage Float
eq, not_eq, gt, gte, lt, lte
order_id Uuid
eq, not_eq
customer_id Uuid
eq, not_eq
tax_region_id Uuid
eq, not_eq
coupon_id Uuid
eq, not_eq
q String
eq
date_or_created_at Datetime
eq, not_eq, gt, gte, lt, lte, between
conditions Hash
eq

Meta

Results can be aggregated on:

Name Description
total Array
count
status Array
count
tag_list Array
count
tax_strategy Array
count
currency Array
count
deposit_type Array
count
price_in_cents Array
sum, maximum, minimum, average
grand_total_in_cents Array
sum, maximum, minimum, average
grand_total_with_tax_in_cents Array
sum, maximum, minimum, average
discount_in_cents Array
sum, maximum, minimum, average
coupon_discount_in_cents Array
sum, maximum, minimum, average
total_discount_in_cents Array
sum, maximum, minimum, average
deposit_in_cents Array
sum, maximum, minimum, average
deposit_paid_in_cents Array
sum, maximum, minimum, average
deposit_refunded_in_cents Array
sum, maximum, minimum, average
deposit_held_in_cents Array
sum, maximum, minimum, average
deposit_to_refund_in_cents Array
sum, maximum, minimum, average
to_be_paid_in_cents Array
sum, maximum, minimum, average
paid_in_cents Array
sum, maximum, minimum, average
tax_in_cents Array
sum, maximum, minimum, average
discount_percentage Array
maximum, minimum, average

Includes

This request accepts the following includes:

customer

order

Searching documents

Use advanced search to make logical filter groups with and/or operators.

How to search for documents:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/documents/search' \
    --header 'content-type: application/json' \
    --data '{
      "fields": {
        "documents": "id"
      },
      "filter": {
        "conditions": {
          "operator": "and",
          "attributes": [
            {
              "operator": "or",
              "attributes": [
                {
                  "status": "paid"
                },
                {
                  "deposit_type": "none"
                }
              ]
            },
            {
              "operator": "and",
              "attributes": [
                {
                  "date": {
                    "gte": "2024-11-15T09:22:49.766Z"
                  }
                },
                {
                  "date": {
                    "lte": "2024-11-21T09:22:49.767Z"
                  }
                }
              ]
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "10264790-6e8f-4ac6-bd03-172f160b30af"
    },
    {
      "id": "51863522-12f1-43ec-8d44-c2ab15dc1962"
    }
  ]
}

HTTP Request

POST api/boomerang/documents/search

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq, gt
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
document_type String
eq, not_eq
number Integer
eq, not_eq, gt, gte, lt, lte
prefix String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
prefix_with_number String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
date Date
eq, not_eq, gt, gte, lt, lte
due_date Date
eq, not_eq, gt, gte, lt, lte
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
address String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
revised Boolean
eq
finalized Boolean
eq
sent Boolean
eq
confirmed Boolean
eq
status String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
deposit_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
tag_list String
eq
price_in_cents Integer
eq, not_eq, gt, gte, lt, lte
grand_total_in_cents Integer
eq, not_eq, gt, gte, lt, lte
grand_total_with_tax_in_cents Integer
eq, not_eq, gt, gte, lt, lte
discount_in_cents Integer
eq, not_eq, gt, gte, lt, lte
coupon_discount_in_cents Integer
eq, not_eq, gt, gte, lt, lte
total_discount_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_paid_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_refunded_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_held_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_to_refund_in_cents Integer
eq, not_eq, gt, gte, lt, lte
to_be_paid_in_cents Integer
eq, not_eq, gt, gte, lt, lte
paid_in_cents Integer
eq, not_eq, gt, gte, lt, lte
tax_in_cents Integer
eq, not_eq, gt, gte, lt, lte
discount_percentage Float
eq, not_eq, gt, gte, lt, lte
order_id Uuid
eq, not_eq
customer_id Uuid
eq, not_eq
tax_region_id Uuid
eq, not_eq
coupon_id Uuid
eq, not_eq
q String
eq
date_or_created_at Datetime
eq, not_eq, gt, gte, lt, lte, between
conditions Hash
eq

Meta

Results can be aggregated on:

Name Description
total Array
count
status Array
count
tag_list Array
count
tax_strategy Array
count
currency Array
count
deposit_type Array
count
price_in_cents Array
sum, maximum, minimum, average
grand_total_in_cents Array
sum, maximum, minimum, average
grand_total_with_tax_in_cents Array
sum, maximum, minimum, average
discount_in_cents Array
sum, maximum, minimum, average
coupon_discount_in_cents Array
sum, maximum, minimum, average
total_discount_in_cents Array
sum, maximum, minimum, average
deposit_in_cents Array
sum, maximum, minimum, average
deposit_paid_in_cents Array
sum, maximum, minimum, average
deposit_refunded_in_cents Array
sum, maximum, minimum, average
deposit_held_in_cents Array
sum, maximum, minimum, average
deposit_to_refund_in_cents Array
sum, maximum, minimum, average
to_be_paid_in_cents Array
sum, maximum, minimum, average
paid_in_cents Array
sum, maximum, minimum, average
tax_in_cents Array
sum, maximum, minimum, average
discount_percentage Array
maximum, minimum, average

Includes

This request accepts the following includes:

customer

order

Fetching a document

How to fetch a documents:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/documents/97a3f965-aaa4-4a68-bfd2-564a53b798e0' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "97a3f965-aaa4-4a68-bfd2-564a53b798e0",
    "type": "documents",
    "attributes": {
      "created_at": "2024-11-18T09:22:37.088068+00:00",
      "updated_at": "2024-11-18T09:22:37.129851+00:00",
      "archived": false,
      "archived_at": null,
      "document_type": "invoice",
      "number": null,
      "prefix": null,
      "prefix_with_number": null,
      "date": null,
      "due_date": null,
      "name": "John Doe",
      "address": null,
      "reference": null,
      "revised": false,
      "finalized": false,
      "sent": false,
      "confirmed": false,
      "status": "payment_due",
      "signature_url": null,
      "deposit_type": "percentage",
      "deposit_value": 10.0,
      "tag_list": [],
      "price_in_cents": 80250,
      "grand_total_in_cents": 72225,
      "grand_total_with_tax_in_cents": 87392,
      "discount_in_cents": 8025,
      "coupon_discount_in_cents": 0,
      "total_discount_in_cents": 8025,
      "deposit_in_cents": 10000,
      "deposit_paid_in_cents": 0,
      "deposit_refunded_in_cents": 0,
      "deposit_held_in_cents": 0,
      "deposit_to_refund_in_cents": 0,
      "to_be_paid_in_cents": 97392,
      "paid_in_cents": 0,
      "tax_in_cents": 15167,
      "discount_percentage": 10.0,
      "order_id": "8030192f-ff16-4b14-a1e0-ff1550bc246c",
      "customer_id": "40a363f1-c9a9-49e5-8e51-379656357939",
      "tax_region_id": null,
      "coupon_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/documents/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

customer

order

tax_region

lines => item => photo

tax_values

coupon

Creating a document

How to create a contract:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/documents' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "documents",
        "attributes": {
          "document_type": "contract",
          "order_id": "fad366e0-be1c-474c-ac8d-a701144b20d1"
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "ce2629d6-57fb-4b61-a0c5-23b3b0cee6ba",
    "type": "documents",
    "attributes": {
      "created_at": "2024-11-18T09:22:53.190064+00:00",
      "updated_at": "2024-11-18T09:22:53.200443+00:00",
      "archived": false,
      "archived_at": null,
      "document_type": "contract",
      "number": 1,
      "prefix": null,
      "prefix_with_number": "1",
      "date": "2024-11-18",
      "due_date": null,
      "name": "John Doe",
      "address": "",
      "reference": null,
      "revised": false,
      "finalized": true,
      "sent": false,
      "confirmed": false,
      "status": "unconfirmed",
      "signature_url": null,
      "deposit_type": "percentage",
      "deposit_value": 10.0,
      "tag_list": [],
      "price_in_cents": 80250,
      "grand_total_in_cents": 72225,
      "grand_total_with_tax_in_cents": 87392,
      "discount_in_cents": 8025,
      "coupon_discount_in_cents": 0,
      "total_discount_in_cents": 8025,
      "deposit_in_cents": 10000,
      "deposit_paid_in_cents": 0,
      "deposit_refunded_in_cents": 0,
      "deposit_held_in_cents": 0,
      "deposit_to_refund_in_cents": 0,
      "to_be_paid_in_cents": 0,
      "paid_in_cents": 0,
      "tax_in_cents": 15167,
      "discount_percentage": 10.0,
      "order_id": "fad366e0-be1c-474c-ac8d-a701144b20d1",
      "customer_id": "2808ad2c-682b-4192-a646-90e2177c35d0",
      "tax_region_id": null,
      "coupon_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/documents

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

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

Includes

This request accepts the following includes:

customer

order

tax_region

lines => item => photo

tax_values

coupon

Updating a document

How to update a document:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/documents/7a92c678-2710-4480-886e-26e386731a9a' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "7a92c678-2710-4480-886e-26e386731a9a",
        "type": "documents",
        "attributes": {
          "name": "Jane Doe"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "7a92c678-2710-4480-886e-26e386731a9a",
    "type": "documents",
    "attributes": {
      "created_at": "2024-11-18T09:22:32.940922+00:00",
      "updated_at": "2024-11-18T09:22:33.870466+00:00",
      "archived": false,
      "archived_at": null,
      "document_type": "invoice",
      "number": null,
      "prefix": null,
      "prefix_with_number": null,
      "date": null,
      "due_date": null,
      "name": "Jane Doe",
      "address": null,
      "reference": null,
      "revised": false,
      "finalized": false,
      "sent": false,
      "confirmed": false,
      "status": "payment_due",
      "signature_url": null,
      "deposit_type": "percentage",
      "deposit_value": 10.0,
      "tag_list": [],
      "price_in_cents": 80250,
      "grand_total_in_cents": 72225,
      "grand_total_with_tax_in_cents": 87392,
      "discount_in_cents": 8025,
      "coupon_discount_in_cents": 0,
      "total_discount_in_cents": 8025,
      "deposit_in_cents": 10000,
      "deposit_paid_in_cents": 0,
      "deposit_refunded_in_cents": 0,
      "deposit_held_in_cents": 0,
      "deposit_to_refund_in_cents": 0,
      "to_be_paid_in_cents": 97392,
      "paid_in_cents": 0,
      "tax_in_cents": 15167,
      "discount_percentage": 10.0,
      "order_id": "0d8ff387-a1a7-4d16-bc64-9a528981ada7",
      "customer_id": "ec3857e3-be29-4510-9fe3-3467d33208c5",
      "tax_region_id": null,
      "coupon_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/documents/{id}

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

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

Includes

This request accepts the following includes:

customer

order

tax_region

lines => item => photo

tax_values

coupon

Archiving a document

When archiving an invoice make sure delete_invoices permission is enabled.

How to archive a document:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/documents/2086dfe0-1e76-4aee-a6eb-0980a25c5db6' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "2086dfe0-1e76-4aee-a6eb-0980a25c5db6",
    "type": "documents",
    "attributes": {
      "created_at": "2024-11-18T09:22:43.501609+00:00",
      "updated_at": "2024-11-18T09:22:44.347570+00:00",
      "archived": true,
      "archived_at": "2024-11-18T09:22:44.347570+00:00",
      "document_type": "invoice",
      "number": null,
      "prefix": null,
      "prefix_with_number": null,
      "date": null,
      "due_date": null,
      "name": "John Doe",
      "address": null,
      "reference": null,
      "revised": false,
      "finalized": false,
      "sent": false,
      "confirmed": false,
      "status": "payment_due",
      "signature_url": null,
      "deposit_type": "percentage",
      "deposit_value": 10.0,
      "tag_list": [],
      "price_in_cents": 80250,
      "grand_total_in_cents": 72225,
      "grand_total_with_tax_in_cents": 87392,
      "discount_in_cents": 8025,
      "coupon_discount_in_cents": 0,
      "total_discount_in_cents": 8025,
      "deposit_in_cents": 10000,
      "deposit_paid_in_cents": 0,
      "deposit_refunded_in_cents": 0,
      "deposit_held_in_cents": 0,
      "deposit_to_refund_in_cents": 0,
      "to_be_paid_in_cents": 97392,
      "paid_in_cents": 0,
      "tax_in_cents": 15167,
      "discount_percentage": 10.0,
      "order_id": "a920249f-97bb-4061-a238-717837f751f2",
      "customer_id": "89b7eaff-6361-467b-ae74-41dfc31a80d3",
      "tax_region_id": null,
      "coupon_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/documents/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Email templates

Email templates allow for creating pre-filled emails with dynamic data. Booqable comes with automated templates which can be updated but not deleted.

For more information about using variables for dynamic data in e-mail templates see our help center

Endpoints

GET /api/boomerang/email_templates

GET /api/boomerang/email_templates/{id}

POST /api/boomerang/email_templates

PUT /api/boomerang/email_templates/{id}

DELETE /api/boomerang/email_templates/{id}

Fields

Every email template has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
name String
Name of the template
identifier String readonly
A unique identifier assigned to this template
subject String
Email subject line template
context String
Which resource or process the template applies to. One of order, invoice, document, all, payment, user
body String
Email body template
default Boolean readonly
Whether this is a system default template
automated Boolean readonly
When true, this template is used by built-in features and can not be deleted. Updating is possible.

Listing email templates

How to fetch a list of email templates:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "37092548-5c64-42cd-b57b-de0abacff3ed",
      "type": "email_templates",
      "attributes": {
        "created_at": "2024-11-18T09:26:04.817973+00:00",
        "updated_at": "2024-11-18T09:26:04.817973+00:00",
        "name": "Webshop confirmation",
        "identifier": "webshop_confirmation",
        "subject": "We received your order",
        "context": "all",
        "body": "We'll get started on it right away",
        "default": false,
        "automated": false
      }
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/email_templates

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
identifier String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
context String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
default Boolean
eq
automated Boolean
eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request does not accept any includes

Fetching an email template

How to fetch an email templates:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/email_templates/47fe8a8b-84de-4535-b2b9-8bd902bfbafd' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "47fe8a8b-84de-4535-b2b9-8bd902bfbafd",
    "type": "email_templates",
    "attributes": {
      "created_at": "2024-11-18T09:26:03.482844+00:00",
      "updated_at": "2024-11-18T09:26:03.482844+00:00",
      "name": "Webshop confirmation",
      "identifier": "webshop_confirmation",
      "subject": "We received your order",
      "context": "all",
      "body": "We'll get started on it right away",
      "default": false,
      "automated": false
    }
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/email_templates/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

emails

Creating an email template

How to create a email template:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/email_templates' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "email_templates",
        "attributes": {
          "name": "Webshop confirmation",
          "subject": "We received your order (#{{order.number}})",
          "body": "We'll get started on it right away. Your order number is #{{order.number}}.",
          "context": "order"
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "fa4dff43-bd40-49cc-8b30-941786e297b9",
    "type": "email_templates",
    "attributes": {
      "created_at": "2024-11-18T09:26:04.338810+00:00",
      "updated_at": "2024-11-18T09:26:04.338810+00:00",
      "name": "Webshop confirmation",
      "identifier": "webshop_confirmation",
      "subject": "We received your order (#{{order.number}})",
      "context": "order",
      "body": "We'll get started on it right away. Your order number is #{{order.number}}.",
      "default": false,
      "automated": false
    }
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/email_templates

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the template
data[attributes][subject] String
Email subject line template
data[attributes][context] String
Which resource or process the template applies to. One of order, invoice, document, all, payment, user
data[attributes][body] String
Email body template

Includes

This request does not accept any includes

Updating an email template

How to update an email template:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/email_templates/dc289c47-d737-447a-bde7-6f19b2e7f0ef' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "dc289c47-d737-447a-bde7-6f19b2e7f0ef",
        "type": "email_templates",
        "attributes": {
          "name": "Order confirmation"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "dc289c47-d737-447a-bde7-6f19b2e7f0ef",
    "type": "email_templates",
    "attributes": {
      "created_at": "2024-11-18T09:26:02.603849+00:00",
      "updated_at": "2024-11-18T09:26:02.619850+00:00",
      "name": "Order confirmation",
      "identifier": "webshop_confirmation",
      "subject": "We received your order",
      "context": "all",
      "body": "We'll get started on it right away",
      "default": false,
      "automated": false
    }
  },
  "meta": {}
}

How to update a default email template:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/email_templates/b6bc6d4c-4055-4427-aad7-eb1eaf14ab52' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "b6bc6d4c-4055-4427-aad7-eb1eaf14ab52",
        "type": "email_templates",
        "attributes": {
          "name": "Order confirmation"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "b6bc6d4c-4055-4427-aad7-eb1eaf14ab52",
    "type": "email_templates",
    "attributes": {
      "created_at": "2024-11-18T09:26:03.043535+00:00",
      "updated_at": "2024-11-18T09:26:03.061583+00:00",
      "name": "Order confirmation",
      "identifier": "webshop_confirmation",
      "subject": "We received your order",
      "context": "all",
      "body": "We'll get started on it right away",
      "default": true,
      "automated": false
    }
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/email_templates/{id}

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the template
data[attributes][subject] String
Email subject line template
data[attributes][context] String
Which resource or process the template applies to. One of order, invoice, document, all, payment, user
data[attributes][body] String
Email body template

Includes

This request does not accept any includes

Deleting an email template

How to delete a email template:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/email_templates/3f990a3b-f0f0-483c-9dfe-79eebff169d5' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "3f990a3b-f0f0-483c-9dfe-79eebff169d5",
    "type": "email_templates",
    "attributes": {
      "created_at": "2024-11-18T09:26:03.894505+00:00",
      "updated_at": "2024-11-18T09:26:03.894505+00:00",
      "name": "Sales Tax",
      "identifier": "sales_tax",
      "subject": "This is a subject!",
      "context": "all",
      "body": "Hi there user!",
      "default": false,
      "automated": false
    }
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/email_templates/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Emails

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

Endpoints

GET /api/boomerang/emails

POST /api/boomerang/emails

Fields

Every email has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the email was created by the user, or automatically by Booqable. At this time, the email has not been sent yet.
updated_at Datetime readonly
The last time the email was updated. Typically this is updated after a delivery attempt has failed.
subject String
Email subject
body String
Email body
recipients String
Comma seperated list of recipient email addresses, all addresses must be valid for the email to send.
has_error Boolean readonly
Whether any errors occur when sending this email
sent Boolean readonly
Whether the email was sent successfully
document_ids Array
Documents to send as attachments to the email
order_id Uuid
Order the email is associated with, will be used to fill template data
customer_id Uuid
Customer the email is associated with, will be used to fill template data
email_template_id Uuid
Which email template to use
employee_id Uuid readonly
Employee who sent the email

Relationships

Emails have the following relationships:

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

Listing emails

How to fetch a list of emails:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "83bc50bb-d429-418a-b9cd-36157e0cadcf",
      "type": "emails",
      "attributes": {
        "created_at": "2024-11-18T09:24:36.598633+00:00",
        "updated_at": "2024-11-18T09:24:36.598633+00:00",
        "subject": "Order confirmation",
        "body": "We hereby confirm your order with number #123",
        "recipients": "[email protected]",
        "has_error": false,
        "sent": false,
        "document_ids": [],
        "order_id": null,
        "customer_id": "8e6aa32d-1435-4a70-bbef-501228f00bd0",
        "email_template_id": null,
        "employee_id": null
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

How to fetch a list of emails for a specific order:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/emails?filter%5Border_id%5D=7842da1b-991d-4c37-aae7-6a520653c9a6' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "8788daef-9728-4ff7-9486-a9210f1fb1ba",
      "type": "emails",
      "attributes": {
        "created_at": "2024-11-18T09:24:36.012151+00:00",
        "updated_at": "2024-11-18T09:24:36.069583+00:00",
        "subject": "Order confirmation",
        "body": "We hereby confirm your order with number #123",
        "recipients": "[email protected]",
        "has_error": false,
        "sent": false,
        "document_ids": [],
        "order_id": "7842da1b-991d-4c37-aae7-6a520653c9a6",
        "customer_id": "647bc1a0-2617-451e-885b-c295065bc207",
        "email_template_id": null,
        "employee_id": null
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/emails

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
has_error Boolean
eq
sent Boolean
eq
order_id Uuid
eq, not_eq
customer_id Uuid
eq, not_eq
email_template_id Uuid
eq, not_eq
employee_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count
has_error Array
count

Includes

This request accepts the following includes:

customer

order

Creating and sending an email

How to create and send an email:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/emails' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "emails",
        "attributes": {
          "recipients": "[email protected],[email protected]",
          "subject": "Order confirmation",
          "body": "Hi {{customer.name}}",
          "email_template_id": "dc972425-c1d6-4ebf-b82d-c7fe8a5218ce",
          "order_id": "f46d4ab2-fbfe-4792-b97e-62738d1abb94",
          "customer_id": "1e1ade55-39c2-4f3f-b47e-b5c597320262",
          "document_ids": [
            "f543d51d-4ef0-49d8-9ae0-f1571fd9169b"
          ]
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "f3ef879c-d1ce-4fe9-85bb-a6958e301f2f",
    "type": "emails",
    "attributes": {
      "created_at": "2024-11-18T09:24:37.344876+00:00",
      "updated_at": "2024-11-18T09:24:37.344876+00:00",
      "subject": "Order confirmation",
      "body": "Hi {{customer.name}}",
      "recipients": "[email protected],[email protected]",
      "has_error": false,
      "sent": false,
      "document_ids": [
        "f543d51d-4ef0-49d8-9ae0-f1571fd9169b"
      ],
      "order_id": "f46d4ab2-fbfe-4792-b97e-62738d1abb94",
      "customer_id": "1e1ade55-39c2-4f3f-b47e-b5c597320262",
      "email_template_id": "dc972425-c1d6-4ebf-b82d-c7fe8a5218ce",
      "employee_id": "0489674e-9a2b-4185-a060-c780a3dd7df2"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/emails

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

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

Includes

This request accepts the following includes:

customer

order

email_template

Employees

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

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

Endpoints

GET /api/boomerang/employees

GET /api/boomerang/employees/{id}

PUT /api/boomerang/employees/{id}

Fields

Every employee has the following fields:

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

Listing employees

How to fetch a list of employees:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "5aa2f064-74f3-46cd-b662-d1bd54e7f8eb",
      "type": "employees",
      "attributes": {
        "created_at": "2024-11-18T09:24:25.163452+00:00",
        "updated_at": "2024-11-18T09:24:25.166948+00:00",
        "name": "John Doe",
        "firstname": "John",
        "lastname": "Doe",
        "locale": null,
        "email": "[email protected]",
        "unconfirmed_email": null,
        "viewed_whats_new_at": "2024-11-18T09:24:25.158591+00:00",
        "active": true,
        "owner": true,
        "confirmed": true,
        "time_to_confirm": 0,
        "permissions": [
          "reports",
          "products",
          "settings",
          "security_settings",
          "account",
          "exports",
          "cancel_orders",
          "revert_orders",
          "delete_invoices",
          "make_invoice_revisions",
          "override_rental_period"
        ],
        "has_two_factor_autentication": false,
        "avatar_url": "https://gravatar.com/avatar/6a6c19fea4a3676970167ce51f39e6ee.png?d=404",
        "large_avatar_url": "https://gravatar.com/avatar/6a6c19fea4a3676970167ce51f39e6ee.png?d=mm&size=200"
      }
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/employees

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
locale String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
email String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
active Boolean
eq
deactivated_at Datetime
eq, not_eq, gt, gte, lt, lte
owner Boolean
eq
confirmed Boolean
eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request does not accept any includes

Fetching an employee

How to fetch a employee:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/employees/6e4d3c0b-8001-4576-848e-d4411010b8e7' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "6e4d3c0b-8001-4576-848e-d4411010b8e7",
    "type": "employees",
    "attributes": {
      "created_at": "2024-11-18T09:24:25.604353+00:00",
      "updated_at": "2024-11-18T09:24:25.604353+00:00",
      "name": "John Doe",
      "firstname": "John",
      "lastname": "Doe",
      "locale": null,
      "email": "[email protected]",
      "unconfirmed_email": null,
      "viewed_whats_new_at": "2024-11-18T09:24:25.599422+00:00",
      "active": true,
      "owner": true,
      "confirmed": true,
      "time_to_confirm": 0,
      "permissions": [
        "reports",
        "products",
        "settings",
        "security_settings",
        "account",
        "exports",
        "cancel_orders",
        "revert_orders",
        "delete_invoices",
        "make_invoice_revisions",
        "override_rental_period"
      ],
      "has_two_factor_autentication": false,
      "avatar_url": "https://gravatar.com/avatar/6a6c19fea4a3676970167ce51f39e6ee.png?d=404",
      "large_avatar_url": "https://gravatar.com/avatar/6a6c19fea4a3676970167ce51f39e6ee.png?d=mm&size=200"
    }
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/employees/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Updating an employee

How to update an employee:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/employees/0b202bdc-80a5-48be-bd99-072857cf930a' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "0b202bdc-80a5-48be-bd99-072857cf930a",
        "type": "employees",
        "attributes": {
          "firstname": "Jane"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "0b202bdc-80a5-48be-bd99-072857cf930a",
    "type": "employees",
    "attributes": {
      "created_at": "2024-11-18T09:24:27.013583+00:00",
      "updated_at": "2024-11-18T09:24:27.040407+00:00",
      "name": "Jane Doe",
      "firstname": "Jane",
      "lastname": "Doe",
      "locale": null,
      "email": "[email protected]",
      "unconfirmed_email": null,
      "viewed_whats_new_at": "2024-11-18T09:24:27.008326+00:00",
      "active": true,
      "owner": false,
      "confirmed": true,
      "time_to_confirm": 0,
      "permissions": [
        "reports",
        "products",
        "settings",
        "security_settings",
        "account",
        "exports",
        "cancel_orders",
        "revert_orders",
        "delete_invoices",
        "make_invoice_revisions",
        "override_rental_period"
      ],
      "has_two_factor_autentication": false,
      "avatar_url": "https://gravatar.com/avatar/35f5782642e9fa0f6cfff5a552e2ae97.png?d=404",
      "large_avatar_url": "https://gravatar.com/avatar/35f5782642e9fa0f6cfff5a552e2ae97.png?d=mm&size=200"
    }
  },
  "meta": {}
}

How to de-activate an employee:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/employees/909a2efe-3a1d-4b6c-9193-e31b84d40453' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "909a2efe-3a1d-4b6c-9193-e31b84d40453",
        "type": "employees",
        "attributes": {
          "active": false
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "909a2efe-3a1d-4b6c-9193-e31b84d40453",
    "type": "employees",
    "attributes": {
      "created_at": "2024-11-18T09:24:26.507428+00:00",
      "updated_at": "2024-11-18T09:24:26.532265+00:00",
      "name": "John Doe",
      "firstname": "John",
      "lastname": "Doe",
      "locale": null,
      "email": "[email protected]",
      "unconfirmed_email": null,
      "viewed_whats_new_at": "2024-11-18T09:24:26.503196+00:00",
      "active": false,
      "owner": false,
      "confirmed": true,
      "time_to_confirm": 0,
      "permissions": [
        "reports",
        "products",
        "settings",
        "security_settings",
        "account",
        "exports",
        "cancel_orders",
        "revert_orders",
        "delete_invoices",
        "make_invoice_revisions",
        "override_rental_period"
      ],
      "has_two_factor_autentication": false,
      "avatar_url": "https://gravatar.com/avatar/35f5782642e9fa0f6cfff5a552e2ae97.png?d=404",
      "large_avatar_url": "https://gravatar.com/avatar/35f5782642e9fa0f6cfff5a552e2ae97.png?d=mm&size=200"
    }
  },
  "meta": {}
}

How to set permissions:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/employees/f0fd8fa5-e4b4-4b3e-bca3-f8a1fe55f2fe' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "f0fd8fa5-e4b4-4b3e-bca3-f8a1fe55f2fe",
        "type": "employees",
        "attributes": {
          "permissions": [
            "reports",
            "settings"
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "f0fd8fa5-e4b4-4b3e-bca3-f8a1fe55f2fe",
    "type": "employees",
    "attributes": {
      "created_at": "2024-11-18T09:24:26.030031+00:00",
      "updated_at": "2024-11-18T09:24:26.060940+00:00",
      "name": "John Doe",
      "firstname": "John",
      "lastname": "Doe",
      "locale": null,
      "email": "[email protected]",
      "unconfirmed_email": null,
      "viewed_whats_new_at": "2024-11-18T09:24:26.025874+00:00",
      "active": true,
      "owner": false,
      "confirmed": true,
      "time_to_confirm": 0,
      "permissions": [
        "reports",
        "settings"
      ],
      "has_two_factor_autentication": false,
      "avatar_url": "https://gravatar.com/avatar/35f5782642e9fa0f6cfff5a552e2ae97.png?d=404",
      "large_avatar_url": "https://gravatar.com/avatar/35f5782642e9fa0f6cfff5a552e2ae97.png?d=mm&size=200"
    }
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/employees/{id}

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

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

Includes

This request does not accept any includes

Inventory levels

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

Endpoints

GET /api/boomerang/inventory_levels

Fields

Every inventory level has the following fields:

Name Description
id Uuid readonly
Primary key
item_id Uuid
ID of the item to return data for, this can be a single ID or an array of multiple IDs
order_id Uuid readonly
Return data for all items on an order
location_id Uuid
ID of the location to filter for
location_available Integer readonly
The available quantity for the given location
location_stock_count Integer readonly
The quantity of stock present for the given the location
location_plannable Integer readonly
The number of products that can be planned for the given location
location_planned Integer readonly
The planned quantity for the given location
location_needed Integer readonly
The needed quantity for the given location. This quantity does not contain what has already been returned for an order (planned - stopped)
cluster_available Integer readonly
The available quantity for the cluster the given location is part of
cluster_stock_count Integer readonly
The stock count for the cluster the given location is part of
cluster_plannable Integer readonly
The planned quantity for the cluster the given location is part of
cluster_planned Integer readonly
The planned quantity for the cluster the given location is part of
cluster_needed Integer readonly
The needed quantity for the cluster the given location is part of. This quantity does not contain what has already been returned for an order (planned - stopped)

Relationships

Inventory levels have the following relationships:

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

Obtaining inventory levels for a product

How to fetch inventory levels for a product:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/inventory_levels?filter%5Bfrom%5D=2022-01-01+09%3A00%3A00&filter%5Bitem_id%5D=a03e4620-e8e0-437f-b9a0-96127061323e&filter%5Btill%5D=2022-01-02+09%3A00%3A00' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "05034a0f-58e0-50a4-807e-4366e96a9a39",
      "type": "inventory_levels",
      "attributes": {
        "item_id": "a03e4620-e8e0-437f-b9a0-96127061323e",
        "order_id": null,
        "location_id": "cf55d954-2575-4f32-8dd1-fcb74047315e",
        "location_available": 0,
        "location_stock_count": 0,
        "location_plannable": 0,
        "location_planned": 0,
        "location_needed": 0,
        "cluster_available": 0,
        "cluster_stock_count": 0,
        "cluster_plannable": 0,
        "cluster_planned": 0,
        "cluster_needed": 0
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/inventory_levels

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

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

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

item

location

Obtaining inventory levels for a product for a specific location

How to fetch inventory levels for a product for a specific location:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/inventory_levels?filter%5Bfrom%5D=2022-01-01+09%3A00%3A00&filter%5Bitem_id%5D=0d67a100-8165-4d05-a716-198cb24f95a1&filter%5Blocation_id%5D=e6255162-f185-4952-9f2a-bfc999b77750&filter%5Btill%5D=2022-01-02+09%3A00%3A00' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "1d04d639-bd64-5d25-aa65-63dd4b3507fb",
      "type": "inventory_levels",
      "attributes": {
        "item_id": "0d67a100-8165-4d05-a716-198cb24f95a1",
        "order_id": null,
        "location_id": "e6255162-f185-4952-9f2a-bfc999b77750",
        "location_available": 0,
        "location_stock_count": 0,
        "location_plannable": 0,
        "location_planned": 0,
        "location_needed": 0,
        "cluster_available": 0,
        "cluster_stock_count": 0,
        "cluster_plannable": 0,
        "cluster_planned": 0,
        "cluster_needed": 0
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/inventory_levels

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

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

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

item

location

Invoice finalizations

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

Fields

Every invoice finalization has the following fields:

Name Description
id Uuid readonly
Primary key
document_id Uuid
ID of the invoice that needs to be finalized.

Relationships

Invoice finalizations have the following relationships:

Name Description
document Documents
Associated Document

Finalize invoice

Finalize a pro forma invoice:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/invoice_finalizations' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "invoice_finalization",
        "attributes": {
          "document_id": "20fd22d6-d71e-4b85-bd3f-38c00c9aa08f"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "a397344b-3089-56a2-b290-798457c48c5c",
    "type": "invoice_finalizations",
    "attributes": {
      "document_id": "20fd22d6-d71e-4b85-bd3f-38c00c9aa08f"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/invoice_finalizations

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][document_id] Uuid
ID of the invoice that needs to be finalized.

Includes

This request accepts the following includes:

document => order => documents

Invoice revisions

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

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

Fields

Every invoice revision has the following fields:

Name Description
id Uuid readonly
Primary key
order_id Uuid
ID of the order for which the invoice needs to be revised.
revised_invoice_id Uuid readonly
Document ID of the finalized invoice that was revised.
revision_invoice_id Uuid readonly
Associated Revision invoice

Relationships

Invoice revisions have the following relationships:

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

Revise invoice

Revise a finalized invoice:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/invoice_revisions' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "invoice_revisions",
        "attributes": {
          "order_id": "ecc950c7-9258-4c8a-af11-c113ebc28032"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "41aa4c36-6001-5548-9857-c5298c7754f3",
    "type": "invoice_revisions",
    "attributes": {
      "order_id": "ecc950c7-9258-4c8a-af11-c113ebc28032",
      "revised_invoice_id": "6359c520-13ba-4042-b791-3bf1484419aa",
      "revision_invoice_id": "e533c378-ce00-414f-a53b-6ba3400135c9"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/invoice_revisions

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][order_id] Uuid
ID of the order for which the invoice needs to be revised.

Includes

This request accepts the following includes:

order

revised_invoice

revision_invoice

Items

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

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": "eb22e997-f3b7-4b12-9697-91b59e857b13",
      "type": "bundles",
      "attributes": {
        "created_at": "2024-11-18T09:24:08.370245+00:00",
        "updated_at": "2024-11-18T09:24:08.370245+00:00",
        "archived": false,
        "archived_at": null,
        "type": "bundles",
        "name": "iPad Bundle",
        "slug": "ipad-bundle",
        "product_type": "bundle",
        "extra_information": null,
        "photo_url": null,
        "description": null,
        "excerpt": null,
        "show_in_store": true,
        "sorting_weight": 0,
        "discountable": true,
        "taxable": true,
        "seo_title": null,
        "seo_description": null,
        "tag_list": [
          "tablets",
          "apple"
        ],
        "photo_id": null,
        "tax_category_id": null
      },
      "relationships": {}
    },
    {
      "id": "b9bc75ff-ca2b-446a-9ca5-f31ffa08677a",
      "type": "product_groups",
      "attributes": {
        "created_at": "2024-11-18T09:24:08.466257+00:00",
        "updated_at": "2024-11-18T09:24:08.476242+00:00",
        "archived": false,
        "archived_at": null,
        "type": "product_groups",
        "name": "iPad Pro",
        "group_name": null,
        "slug": "ipad-pro",
        "sku": "SKU",
        "lead_time": 0,
        "lag_time": 0,
        "product_type": "rental",
        "tracking_type": "trackable",
        "trackable": true,
        "has_variations": false,
        "variation": false,
        "extra_information": "Charging cable and case included",
        "photo_url": null,
        "description": "The Apple iPad Pro (2021) 12.9 inches 128GB Space Gray is one of the most powerful and fastest tablets of this moment thanks to the new M1 chip. This chip ensures that demanding apps from Adobe or 3D games run smoothly",
        "excerpt": null,
        "show_in_store": true,
        "sorting_weight": 0,
        "base_price_in_cents": 1995,
        "price_type": "simple",
        "price_period": "day",
        "deposit_in_cents": 10000,
        "discountable": true,
        "taxable": true,
        "seo_title": null,
        "seo_description": null,
        "tag_list": [
          "tablets",
          "apple"
        ],
        "properties": {},
        "photo_id": null,
        "tax_category_id": "1e38ee70-9384-4ab3-b818-4479c59c153c",
        "price_ruleset_id": null,
        "price_structure_id": null,
        "allow_shortage": true,
        "shortage_limit": 3,
        "variation_fields": [],
        "flat_fee_price_in_cents": 1995,
        "structure_price_in_cents": 0,
        "stock_item_properties": []
      },
      "relationships": {}
    },
    {
      "id": "847eb76e-4659-4371-91e8-b5de144f3dc5",
      "type": "products",
      "attributes": {
        "created_at": "2024-11-18T09:24:08.469859+00:00",
        "updated_at": "2024-11-18T09:24:08.469859+00:00",
        "archived": false,
        "archived_at": null,
        "type": "products",
        "name": "iPad Pro",
        "group_name": "iPad Pro",
        "slug": "ipad-pro",
        "sku": "SKU",
        "lead_time": 0,
        "lag_time": 0,
        "product_type": "rental",
        "tracking_type": "trackable",
        "trackable": true,
        "has_variations": false,
        "variation": false,
        "extra_information": "Charging cable and case included",
        "photo_url": null,
        "description": "The Apple iPad Pro (2021) 12.9 inches 128GB Space Gray is one of the most powerful and fastest tablets of this moment thanks to the new M1 chip. This chip ensures that demanding apps from Adobe or 3D games run smoothly",
        "excerpt": null,
        "show_in_store": true,
        "sorting_weight": 1,
        "base_price_in_cents": 1995,
        "price_type": "simple",
        "price_period": "day",
        "deposit_in_cents": 10000,
        "discountable": true,
        "taxable": true,
        "seo_title": null,
        "seo_description": null,
        "tag_list": [
          "tablets",
          "apple"
        ],
        "properties": {},
        "photo_id": null,
        "tax_category_id": "1e38ee70-9384-4ab3-b818-4479c59c153c",
        "price_ruleset_id": null,
        "price_structure_id": null,
        "variation_values": [],
        "allow_shortage": true,
        "shortage_limit": 3,
        "product_group_id": "b9bc75ff-ca2b-446a-9ca5-f31ffa08677a"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/items

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq, gt
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
type String
eq, not_eq
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
group_name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
slug String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
sku String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
lead_time Integer
eq, not_eq, gt, gte, lt, lte
lag_time Integer
eq, not_eq, gt, gte, lt, lte
product_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
tracking_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
trackable Boolean
eq
has_variations Boolean
eq
variation Boolean
eq
extra_information String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
description String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
excerpt String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
show_in_store Boolean
eq
sorting_weight Integer
eq, not_eq, gt, gte, lt, lte
base_price_in_cents Integer
eq, not_eq, gt, gte, lt, lte
price_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
price_period String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
deposit_in_cents Integer
eq, not_eq, gt, gte, lt, lte
discountable Boolean
eq
taxable Boolean
eq
seo_title String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
seo_description String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
tag_list String
eq
tax_category_id Uuid
eq, not_eq
price_ruleset_id Uuid
eq, not_eq
price_structure_id Uuid
eq, not_eq
q String
eq
collection_id Uuid
eq, not_eq
product_group_id Uuid
eq
conditions Hash
eq

Meta

Results can be aggregated on:

Name Description
total Array
count
archived Array
count
tag_list Array
count
taxable Array
count
discountable Array
count
product_type Array
count
tracking_type Array
count
show_in_store Array
count
price_type Array
count
price_period Array
count
tax_category_id Array
count
deposit_in_cents Array
sum, maximum, minimum, average
base_price_in_cents Array
sum, maximum, minimum, average

Includes

This request accepts the following includes:

bundle_items

inventory_levels

photo

Searching items

Use advanced search to make logical filter groups with and/or operators.

How to search for items:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/items/search' \
    --header 'content-type: application/json' \
    --data '{
      "fields": {
        "items": "id"
      },
      "filter": {
        "conditions": {
          "operator": "or",
          "attributes": [
            {
              "operator": "and",
              "attributes": [
                {
                  "discountable": true
                },
                {
                  "taxable": true
                }
              ]
            },
            {
              "operator": "and",
              "attributes": [
                {
                  "show_in_store": true
                },
                {
                  "taxable": true
                }
              ]
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "b68f91f0-d8f2-4edd-8c4f-c391ae87bda1"
    },
    {
      "id": "79f62971-d29c-4514-bae4-e67f728254f3"
    },
    {
      "id": "cde3c719-0049-4c9d-a652-6e402745471e"
    },
    {
      "id": "f2572e78-1ff3-465c-b073-ee55af737156"
    },
    {
      "id": "41d0f735-d012-4a91-ac38-f405ae98ce35"
    }
  ]
}

HTTP Request

POST api/boomerang/items/search

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq, gt
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
type String
eq, not_eq
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
group_name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
slug String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
sku String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
lead_time Integer
eq, not_eq, gt, gte, lt, lte
lag_time Integer
eq, not_eq, gt, gte, lt, lte
product_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
tracking_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
trackable Boolean
eq
has_variations Boolean
eq
variation Boolean
eq
extra_information String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
description String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
excerpt String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
show_in_store Boolean
eq
sorting_weight Integer
eq, not_eq, gt, gte, lt, lte
base_price_in_cents Integer
eq, not_eq, gt, gte, lt, lte
price_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
price_period String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
deposit_in_cents Integer
eq, not_eq, gt, gte, lt, lte
discountable Boolean
eq
taxable Boolean
eq
seo_title String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
seo_description String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
tag_list String
eq
tax_category_id Uuid
eq, not_eq
price_ruleset_id Uuid
eq, not_eq
price_structure_id Uuid
eq, not_eq
q String
eq
collection_id Uuid
eq, not_eq
product_group_id Uuid
eq
conditions Hash
eq

Meta

Results can be aggregated on:

Name Description
total Array
count
archived Array
count
tag_list Array
count
taxable Array
count
discountable Array
count
product_type Array
count
tracking_type Array
count
show_in_store Array
count
price_type Array
count
price_period Array
count
tax_category_id Array
count
deposit_in_cents Array
sum, maximum, minimum, average
base_price_in_cents Array
sum, maximum, minimum, average

Includes

This request accepts the following includes:

bundle_items

inventory_levels

photo

Fetching an item

How to fetch an item:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/items/f22b6d42-76ab-45df-845e-b2065134dce6' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "f22b6d42-76ab-45df-845e-b2065134dce6",
    "type": "product_groups",
    "attributes": {
      "created_at": "2024-11-18T09:24:09.290815+00:00",
      "updated_at": "2024-11-18T09:24:09.300806+00:00",
      "archived": false,
      "archived_at": null,
      "type": "product_groups",
      "name": "iPad Pro",
      "group_name": null,
      "slug": "ipad-pro",
      "sku": "SKU",
      "lead_time": 0,
      "lag_time": 0,
      "product_type": "rental",
      "tracking_type": "trackable",
      "trackable": true,
      "has_variations": false,
      "variation": false,
      "extra_information": "Charging cable and case included",
      "photo_url": null,
      "description": "The Apple iPad Pro (2021) 12.9 inches 128GB Space Gray is one of the most powerful and fastest tablets of this moment thanks to the new M1 chip. This chip ensures that demanding apps from Adobe or 3D games run smoothly",
      "excerpt": null,
      "show_in_store": true,
      "sorting_weight": 0,
      "base_price_in_cents": 1995,
      "price_type": "simple",
      "price_period": "day",
      "deposit_in_cents": 10000,
      "discountable": true,
      "taxable": true,
      "seo_title": null,
      "seo_description": null,
      "tag_list": [
        "tablets",
        "apple"
      ],
      "properties": {},
      "photo_id": null,
      "tax_category_id": "73eed787-582c-4dca-9915-6986bd964d5f",
      "price_ruleset_id": null,
      "price_structure_id": null,
      "allow_shortage": true,
      "shortage_limit": 3,
      "variation_fields": [],
      "flat_fee_price_in_cents": 1995,
      "structure_price_in_cents": 0,
      "stock_item_properties": []
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/items/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

bundle_items

inventory_levels

photo

Item prices

Allows you to calculate pricing for an item based on parameters.

You can calculate a price in a couple ways:

Fields

Every item price has the following fields:

Name Description
id Uuid readonly
Primary key
item_id Uuid
Required, the item or items to calculate price for
from Datetime
Start of charge period
till Datetime
End of charge period
original_charge_length Integer readonly
Length of charge period before charge rules are applied
charge_length Integer
Length of charge period in seconds
original_charge_label String readonly
Label of charge period before charge rules are applied
charge_label String readonly
Label for the charge period
original_price_each_in_cents Integer readonly
Price per item before charge rules are applied
price_each_in_cents Integer readonly
Final price per item
price_rule_values Hash readonly
What price rules were applied
price_structure_id Uuid
Optional price structure to use, if the item has a price structure associated with it that will be used by default
price_ruleset_id Uuid
Associated Price ruleset
price_tile_id Uuid readonly
Associated Price tile

Relationships

Item prices have the following relationships:

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

Calcuating the price of products and/or bundles

Calculating price for a period:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/item_prices?filter%5Bfrom%5D=2030-01-01+12%3A00%3A00+UTC&filter%5Bitem_id%5D%5B%5D=7bc82df7-652c-4d49-b614-5ed4e4fd37b9&filter%5Bitem_id%5D%5B%5D=a33ee4e9-8de5-4dca-b794-9219cb9ac81f&filter%5Btill%5D=2030-01-14+12%3A00%3A00+UTC&include=item' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "953344df-0eb1-4933-abcd-82a6d26ed57b",
      "type": "item_prices",
      "attributes": {
        "item_id": "7bc82df7-652c-4d49-b614-5ed4e4fd37b9",
        "from": "2030-01-01T12:00:00.000000+00:00",
        "till": "2030-01-14T12:00:00.000000+00:00",
        "original_charge_length": 1123200,
        "charge_length": 1123200,
        "original_charge_label": "13 days",
        "charge_label": "13 days",
        "original_price_each_in_cents": 0,
        "price_each_in_cents": 0,
        "price_rule_values": null,
        "price_structure_id": null,
        "price_ruleset_id": null,
        "price_tile_id": null
      },
      "relationships": {
        "item": {
          "data": {
            "type": "products",
            "id": "7bc82df7-652c-4d49-b614-5ed4e4fd37b9"
          }
        }
      }
    },
    {
      "id": "a48b41f4-c5ed-4a86-9e7f-5733710ea152",
      "type": "item_prices",
      "attributes": {
        "item_id": "a33ee4e9-8de5-4dca-b794-9219cb9ac81f",
        "from": "2030-01-01T12:00:00.000000+00:00",
        "till": "2030-01-14T12:00:00.000000+00:00",
        "original_charge_length": 1123200,
        "charge_length": 1123200,
        "original_charge_label": "13 days",
        "charge_label": "13 days",
        "original_price_each_in_cents": 0,
        "price_each_in_cents": 0,
        "price_rule_values": null,
        "price_structure_id": null,
        "price_ruleset_id": null,
        "price_tile_id": null
      },
      "relationships": {
        "item": {
          "data": {
            "type": "products",
            "id": "a33ee4e9-8de5-4dca-b794-9219cb9ac81f"
          }
        }
      }
    }
  ],
  "included": [
    {
      "id": "7bc82df7-652c-4d49-b614-5ed4e4fd37b9",
      "type": "products",
      "attributes": {
        "created_at": "2024-11-18T09:23:36.944682+00:00",
        "updated_at": "2024-11-18T09:23:36.944682+00:00",
        "archived": false,
        "archived_at": null,
        "type": "products",
        "name": "Product 1000006",
        "group_name": "Product 1000006",
        "slug": "product-1000006",
        "sku": "PRODUCT 1000006",
        "lead_time": 0,
        "lag_time": 0,
        "product_type": "rental",
        "tracking_type": "bulk",
        "trackable": false,
        "has_variations": false,
        "variation": false,
        "extra_information": null,
        "photo_url": null,
        "description": null,
        "excerpt": null,
        "show_in_store": true,
        "sorting_weight": 1,
        "base_price_in_cents": 0,
        "price_type": "simple",
        "price_period": "hour",
        "deposit_in_cents": 0,
        "discountable": true,
        "taxable": true,
        "seo_title": null,
        "seo_description": null,
        "tag_list": [],
        "properties": {},
        "photo_id": null,
        "tax_category_id": null,
        "price_ruleset_id": null,
        "price_structure_id": null,
        "variation_values": [],
        "allow_shortage": false,
        "shortage_limit": 0,
        "product_group_id": "7150e5fc-1f68-4059-902f-f93b9f430747"
      },
      "relationships": {}
    },
    {
      "id": "a33ee4e9-8de5-4dca-b794-9219cb9ac81f",
      "type": "products",
      "attributes": {
        "created_at": "2024-11-18T09:23:37.194104+00:00",
        "updated_at": "2024-11-18T09:23:37.194104+00:00",
        "archived": false,
        "archived_at": null,
        "type": "products",
        "name": "Product 1000007",
        "group_name": "Product 1000007",
        "slug": "product-1000007",
        "sku": "PRODUCT 1000007",
        "lead_time": 0,
        "lag_time": 0,
        "product_type": "rental",
        "tracking_type": "bulk",
        "trackable": false,
        "has_variations": false,
        "variation": false,
        "extra_information": null,
        "photo_url": null,
        "description": null,
        "excerpt": null,
        "show_in_store": true,
        "sorting_weight": 1,
        "base_price_in_cents": 0,
        "price_type": "simple",
        "price_period": "day",
        "deposit_in_cents": 0,
        "discountable": true,
        "taxable": true,
        "seo_title": null,
        "seo_description": null,
        "tag_list": [],
        "properties": {},
        "photo_id": null,
        "tax_category_id": null,
        "price_ruleset_id": null,
        "price_structure_id": null,
        "variation_values": [],
        "allow_shortage": false,
        "shortage_limit": 0,
        "product_group_id": "5bd48a2b-409b-4cfe-b525-05bd8a7e5734"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

Calculating price charge length:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/item_prices?filter%5Bcharge_length%5D=36000&filter%5Bitem_id%5D=e3bc89d2-7264-4cd9-818d-645f0e7b6ff4&include=item' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "c1f098b8-7971-4588-9926-bc6800c2e66f",
      "type": "item_prices",
      "attributes": {
        "item_id": "e3bc89d2-7264-4cd9-818d-645f0e7b6ff4",
        "from": null,
        "till": null,
        "original_charge_length": 36000,
        "charge_length": 36000,
        "original_charge_label": "10 hours",
        "charge_label": "10 hours",
        "original_price_each_in_cents": null,
        "price_each_in_cents": 0,
        "price_rule_values": null,
        "price_structure_id": null,
        "price_ruleset_id": null,
        "price_tile_id": null
      },
      "relationships": {
        "item": {
          "data": {
            "type": "products",
            "id": "e3bc89d2-7264-4cd9-818d-645f0e7b6ff4"
          }
        }
      }
    }
  ],
  "included": [
    {
      "id": "e3bc89d2-7264-4cd9-818d-645f0e7b6ff4",
      "type": "products",
      "attributes": {
        "created_at": "2024-11-18T09:23:35.866061+00:00",
        "updated_at": "2024-11-18T09:23:35.866061+00:00",
        "archived": false,
        "archived_at": null,
        "type": "products",
        "name": "Product 1000004",
        "group_name": "Product 1000004",
        "slug": "product-1000004",
        "sku": "PRODUCT 1000004",
        "lead_time": 0,
        "lag_time": 0,
        "product_type": "rental",
        "tracking_type": "bulk",
        "trackable": false,
        "has_variations": false,
        "variation": false,
        "extra_information": null,
        "photo_url": null,
        "description": null,
        "excerpt": null,
        "show_in_store": true,
        "sorting_weight": 1,
        "base_price_in_cents": 0,
        "price_type": "simple",
        "price_period": "hour",
        "deposit_in_cents": 0,
        "discountable": true,
        "taxable": true,
        "seo_title": null,
        "seo_description": null,
        "tag_list": [],
        "properties": {},
        "photo_id": null,
        "tax_category_id": null,
        "price_ruleset_id": null,
        "price_structure_id": null,
        "variation_values": [],
        "allow_shortage": false,
        "shortage_limit": 0,
        "product_group_id": "80f75fa7-7eb5-47eb-8dd9-85858af0a8d6"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/item_prices

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
item_id Uuid
eq
from Datetime
eq
till Datetime
eq
original_charge_length Integer
eq
charge_length Integer
eq
price_structure_id Uuid
eq
price_ruleset_id Uuid
eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

price_tile

price_structure

item

Lines

Lines make up the individual elements of an order, document, or cart. They contain information about pricing, planning, or markup. A key concept about lines is that there are two kinds:

  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
Associated Order
item_id Uuid nullable
Associated Item
tax_category_id Uuid nullable
Associated Tax category
price_structure_id Uuid
Associated Price structure
price_tile_id Uuid
Associated Price tile
planning_id Uuid
Associated Planning
parent_line_id Uuid
Associated Parent line
owner_id Uuid
ID of its owner
owner_type String
One of orders, documents, carts

Relationships

Lines have the following relationships:

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

Listing lines

How to fetch a list of lines:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "2f69ac2f-4550-4b8c-b3ed-3f9ecfeae76c",
      "type": "lines",
      "attributes": {
        "created_at": "2024-11-18T09:23:21.906775+00:00",
        "updated_at": "2024-11-18T09:23:21.941932+00:00",
        "archived": false,
        "archived_at": null,
        "title": "Macbook Pro",
        "extra_information": "Comes with a mouse",
        "quantity": 1,
        "original_price_each_in_cents": 72500,
        "original_charge_length": null,
        "original_charge_label": null,
        "price_each_in_cents": 80250,
        "price_in_cents": 80250,
        "display_price_in_cents": 80250,
        "position": 1,
        "charge_label": "29 days",
        "charge_length": 2505600,
        "price_rule_values": {
          "charge": {
            "from": "1980-04-02T00:00:00.000Z",
            "till": "1980-05-01T00:00:00.000Z",
            "adjustments": [
              {
                "name": "Pickup day"
              },
              {
                "name": "Return day"
              }
            ]
          },
          "price": [
            {
              "name": "High-Season",
              "charge_length": 1339200,
              "multiplier": "0.2",
              "price_in_cents": 7750,
              "adjustments": [
                {
                  "from": "1980-04-15T12:00:00.000Z",
                  "till": "1980-05-01T00:00:00.000Z",
                  "charge_length": 1339200,
                  "charge_label": "372 hours",
                  "price_in_cents": 7750
                }
              ],
              "stacked": false
            }
          ]
        },
        "discountable": true,
        "taxable": true,
        "line_type": "charge",
        "relevant": true,
        "order_id": "f9d3488d-f283-4dc2-b5c0-df7d89588b50",
        "item_id": "9ca651d9-9fdb-45d2-85a0-e01357d49451",
        "tax_category_id": "1cd1ee55-0aad-4677-b3f7-b3e1447323fb",
        "price_structure_id": null,
        "price_tile_id": null,
        "planning_id": "b7c7b02e-33cf-4b53-80e0-97dcd471cc4c",
        "parent_line_id": null,
        "owner_id": "f9d3488d-f283-4dc2-b5c0-df7d89588b50",
        "owner_type": "orders"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/lines

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=order,owner,tax_category
fields[] Array
List of comma seperated fields to include ?fields[lines]=created_at,updated_at,archived
filter Hash
The filters to apply ?filter[attribute][eq]=value
sort String
How to sort the data ?sort=attribute1,-attribute2
meta Hash
Metadata to send along ?meta[total][]=count
page[number] String
The page to request
page[size] String
The amount of items per page (max 100)

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
title String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
quantity Integer
eq, not_eq, gt, gte, lt, lte
discountable Boolean
eq
taxable Boolean
eq
line_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
relevant Boolean
eq
order_id Uuid
eq
item_id Uuid
eq, not_eq
tax_category_id Uuid
eq, not_eq
price_structure_id Uuid
eq, not_eq
price_tile_id Uuid
eq, not_eq
planning_id Uuid
eq, not_eq
parent_line_id Uuid
eq, not_eq
owner_id Uuid
eq, not_eq
owner_type String
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

order

owner

tax_category

planning => item => photo

Fetching a line

How to fetch a line:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/lines/e4f7fb3b-3a2f-43ec-9826-222a3f27cd9a' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "e4f7fb3b-3a2f-43ec-9826-222a3f27cd9a",
    "type": "lines",
    "attributes": {
      "created_at": "2024-11-18T09:23:28.692579+00:00",
      "updated_at": "2024-11-18T09:23:28.723304+00:00",
      "archived": false,
      "archived_at": null,
      "title": "Macbook Pro",
      "extra_information": "Comes with a mouse",
      "quantity": 1,
      "original_price_each_in_cents": 72500,
      "original_charge_length": null,
      "original_charge_label": null,
      "price_each_in_cents": 80250,
      "price_in_cents": 80250,
      "display_price_in_cents": 80250,
      "position": 1,
      "charge_label": "29 days",
      "charge_length": 2505600,
      "price_rule_values": {
        "charge": {
          "from": "1980-04-02T00:00:00.000Z",
          "till": "1980-05-01T00:00:00.000Z",
          "adjustments": [
            {
              "name": "Pickup day"
            },
            {
              "name": "Return day"
            }
          ]
        },
        "price": [
          {
            "name": "High-Season",
            "charge_length": 1339200,
            "multiplier": "0.2",
            "price_in_cents": 7750,
            "adjustments": [
              {
                "from": "1980-04-15T12:00:00.000Z",
                "till": "1980-05-01T00:00:00.000Z",
                "charge_length": 1339200,
                "charge_label": "372 hours",
                "price_in_cents": 7750
              }
            ],
            "stacked": false
          }
        ]
      },
      "discountable": true,
      "taxable": true,
      "line_type": "charge",
      "relevant": true,
      "order_id": "15585fa9-fcb6-4d4a-b924-d6c9d59375b5",
      "item_id": "01a1909a-50df-4e6c-996c-680d3d8762a6",
      "tax_category_id": "661c1397-e0c8-43f6-9e52-90ca632a7e4b",
      "price_structure_id": null,
      "price_tile_id": null,
      "planning_id": "10c985b6-f194-4ade-ac0e-ef47be459c8b",
      "parent_line_id": null,
      "owner_id": "15585fa9-fcb6-4d4a-b924-d6c9d59375b5",
      "owner_type": "orders"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/lines/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

order => tax_values

owner => tax_values

tax_category

parent_line

nested_lines => planning

planning => item => photo

Creating a line

Lines created through this endpoint, so-called custom lines, can only have the type charge or section. Custom charge lines enable you to add charges not (directly) connected to a product to an order. Sections allow to add some organization to orders.

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

How to create a line:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/lines' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "lines",
        "attributes": {
          "owner_id": "2d1d6d1e-b13b-42e1-bd6b-c1e055ac0137",
          "owner_type": "orders",
          "price_each_in_cents": 1000
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "92b7eb18-a1fd-42d5-8dc7-0d8d52ec7f3b",
    "type": "lines",
    "attributes": {
      "created_at": "2024-11-18T09:23:24.469952+00:00",
      "updated_at": "2024-11-18T09:23:24.477979+00:00",
      "archived": false,
      "archived_at": null,
      "title": null,
      "extra_information": null,
      "quantity": 1,
      "original_price_each_in_cents": null,
      "original_charge_length": null,
      "original_charge_label": null,
      "price_each_in_cents": 1000,
      "price_in_cents": 1000,
      "display_price_in_cents": 1000,
      "position": 1,
      "charge_label": null,
      "charge_length": null,
      "price_rule_values": null,
      "discountable": true,
      "taxable": true,
      "line_type": "charge",
      "relevant": true,
      "order_id": "2d1d6d1e-b13b-42e1-bd6b-c1e055ac0137",
      "item_id": null,
      "tax_category_id": null,
      "price_structure_id": null,
      "price_tile_id": null,
      "planning_id": null,
      "parent_line_id": null,
      "owner_id": "2d1d6d1e-b13b-42e1-bd6b-c1e055ac0137",
      "owner_type": "orders"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/lines

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

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

Includes

This request accepts the following includes:

order => tax_values

owner => tax_values

tax_category

parent_line

nested_lines => planning

planning => item => photo

Updating a line

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

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

How to update a line:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/lines/ab82f7bd-3868-4a96-9098-3ccc4e5abd51' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "ab82f7bd-3868-4a96-9098-3ccc4e5abd51",
        "type": "lines",
        "attributes": {
          "price_each_in_cents": 1000
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "ab82f7bd-3868-4a96-9098-3ccc4e5abd51",
    "type": "lines",
    "attributes": {
      "created_at": "2024-11-18T09:23:25.823222+00:00",
      "updated_at": "2024-11-18T09:23:26.568642+00:00",
      "archived": false,
      "archived_at": null,
      "title": "Macbook Pro",
      "extra_information": "Comes with a mouse",
      "quantity": 1,
      "original_price_each_in_cents": 72500,
      "original_charge_length": null,
      "original_charge_label": null,
      "price_each_in_cents": 1000,
      "price_in_cents": 1000,
      "display_price_in_cents": 1000,
      "position": 1,
      "charge_label": "29 days",
      "charge_length": 2505600,
      "price_rule_values": null,
      "discountable": true,
      "taxable": true,
      "line_type": "charge",
      "relevant": true,
      "order_id": "51848705-191b-4d2b-8d14-4b2f79f342f6",
      "item_id": "1b7ada3a-3493-4bf9-b682-46c5f351aed5",
      "tax_category_id": "3d1b2296-c165-4a25-99fe-1a902899fc99",
      "price_structure_id": null,
      "price_tile_id": null,
      "planning_id": "fa4bec97-decf-4d84-9afb-bd350dc881d1",
      "parent_line_id": null,
      "owner_id": "51848705-191b-4d2b-8d14-4b2f79f342f6",
      "owner_type": "orders"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/lines/{id}

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

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

Includes

This request accepts the following includes:

order => tax_values

owner => tax_values

tax_category

parent_line

nested_lines => planning

planning => item => photo

Archiving a line

How to delete a line:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/lines/ef6ee9b9-b831-4d28-a4a8-94406d762d5d' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "ef6ee9b9-b831-4d28-a4a8-94406d762d5d",
    "type": "lines",
    "attributes": {
      "created_at": "2024-11-18T09:23:30.704333+00:00",
      "updated_at": "2024-11-18T09:23:31.473366+00:00",
      "archived": true,
      "archived_at": "2024-11-18T09:23:31.473366+00:00",
      "title": "Macbook Pro",
      "extra_information": "Comes with a mouse",
      "quantity": 1,
      "original_price_each_in_cents": 72500,
      "original_charge_length": null,
      "original_charge_label": null,
      "price_each_in_cents": 80250,
      "price_in_cents": 80250,
      "display_price_in_cents": 80250,
      "position": 1,
      "charge_label": "29 days",
      "charge_length": 2505600,
      "price_rule_values": {
        "charge": {
          "from": "1980-04-02T00:00:00.000Z",
          "till": "1980-05-01T00:00:00.000Z",
          "adjustments": [
            {
              "name": "Pickup day"
            },
            {
              "name": "Return day"
            }
          ]
        },
        "price": [
          {
            "name": "High-Season",
            "charge_length": 1339200,
            "multiplier": "0.2",
            "price_in_cents": 7750,
            "adjustments": [
              {
                "from": "1980-04-15T12:00:00.000Z",
                "till": "1980-05-01T00:00:00.000Z",
                "charge_length": 1339200,
                "charge_label": "372 hours",
                "price_in_cents": 7750
              }
            ],
            "stacked": false
          }
        ]
      },
      "discountable": true,
      "taxable": true,
      "line_type": "charge",
      "relevant": true,
      "order_id": "25b59ac0-ea96-4990-8bb6-dcb74ed4aef7",
      "item_id": "2a8a7bf2-6d22-481f-9c59-363ad27f89ab",
      "tax_category_id": "1dd4ea6a-ff66-4ac1-859d-528501925443",
      "price_structure_id": null,
      "price_tile_id": null,
      "planning_id": "b79e33e5-1007-4e32-bdef-966174bd9642",
      "parent_line_id": null,
      "owner_id": "25b59ac0-ea96-4990-8bb6-dcb74ed4aef7",
      "owner_type": "orders"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/lines/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

order => tax_values

owner => tax_values

tax_category

Locations

A location is a place (like a store) where customers pick up and return orders or a warehouse that only stocks inventory.

Endpoints

GET /api/boomerang/locations

GET /api/boomerang/locations/{id}

POST /api/boomerang/locations

PUT /api/boomerang/locations/{id}

DELETE /api/boomerang/locations/{id}

Fields

Every location has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
archived Boolean readonly
Whether location is archived
archived_at Datetime nullable readonly
When the location was archived
name String
Name of the location
code String
Code used to identify the location
location_type String
Determines if the location can be seen in the online webshop. One of rental, internal
address_line_1 String
First address line
address_line_2 String
Second address line
zipcode String
Address zipcode
city String
Address city
region String
Address region
country String
Address country
cluster_ids Array
Clusters this location belongs to
main_address_attributes Hash writeonly
A hash with the address fields. Use it when creating or updating a location. See address property type for more information
pickup_enabled Boolean
Whether the location supports pickup
fulfillment_capabilities Array readonly
An array of fulfillment capabilities (available values: pickup, delivery)
confirm_has_orders Boolean writeonly
A flag to confirm an address update when the location has orders
main_address Hash
A hash with the address fields. Use it when fetching a location. See address property type for more information

Relationships

Locations have the following relationships:

Name Description
carriers Carriers readonly
Associated Carriers
clusters Clusters readonly
Associated Clusters

Listing locations

How to fetch locations:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "ad48628e-736d-4833-b246-e50915ea1303",
      "type": "locations",
      "attributes": {
        "created_at": "2024-11-18T09:26:36.083548+00:00",
        "updated_at": "2024-11-18T09:26:36.086939+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Warehouse",
        "code": "LOC1000055",
        "location_type": "rental",
        "address_line_1": "Blokhuisplein 40",
        "address_line_2": "Department II",
        "zipcode": "8911LJ",
        "city": "Leeuwarden",
        "region": "Friesland",
        "country": "Netherlands",
        "cluster_ids": [],
        "pickup_enabled": true,
        "fulfillment_capabilities": [
          "pickup"
        ],
        "main_address": {
          "meets_validation_requirements": false,
          "first_name": null,
          "last_name": null,
          "address1": "Blokhuisplein 40",
          "address2": "Department II",
          "city": "Leeuwarden",
          "region": "Friesland",
          "zipcode": "8911LJ",
          "country": "Netherlands",
          "country_id": null,
          "province_id": null,
          "latitude": null,
          "longitude": null,
          "value": "Blokhuisplein 40\nDepartment II\n8911LJ Leeuwarden Friesland\nNetherlands"
        }
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/locations

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=main_address,clusters,carriers
fields[] Array
List of comma seperated fields to include ?fields[locations]=created_at,updated_at,archived
filter Hash
The filters to apply ?filter[attribute][eq]=value
sort String
How to sort the data ?sort=attribute1,-attribute2
meta Hash
Metadata to send along ?meta[total][]=count
page[number] String
The page to request
page[size] String
The amount of items per page (max 100)

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
code String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
location_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
main_address Hash
eq
cluster_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

main_address

clusters

carriers

Fetching a location

How to fetch a single location:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/locations/82520aaf-c640-4dd9-9ea0-a12a7a20f107' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "82520aaf-c640-4dd9-9ea0-a12a7a20f107",
    "type": "locations",
    "attributes": {
      "created_at": "2024-11-18T09:26:41.214405+00:00",
      "updated_at": "2024-11-18T09:26:41.217804+00:00",
      "archived": false,
      "archived_at": null,
      "name": "Warehouse",
      "code": "LOC1000064",
      "location_type": "rental",
      "address_line_1": "Blokhuisplein 40",
      "address_line_2": "Department II",
      "zipcode": "8911LJ",
      "city": "Leeuwarden",
      "region": "Friesland",
      "country": "Netherlands",
      "cluster_ids": [],
      "pickup_enabled": true,
      "fulfillment_capabilities": [
        "pickup"
      ],
      "main_address": {
        "meets_validation_requirements": false,
        "first_name": null,
        "last_name": null,
        "address1": "Blokhuisplein 40",
        "address2": "Department II",
        "city": "Leeuwarden",
        "region": "Friesland",
        "zipcode": "8911LJ",
        "country": "Netherlands",
        "country_id": null,
        "province_id": null,
        "latitude": null,
        "longitude": null,
        "value": "Blokhuisplein 40\nDepartment II\n8911LJ Leeuwarden Friesland\nNetherlands"
      }
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/locations/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=main_address,clusters,carriers
fields[] Array
List of comma seperated fields to include ?fields[locations]=created_at,updated_at,archived

Includes

This request accepts the following includes:

main_address

clusters

carriers

Creating a location

How to create a location and assign it to a cluster:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/locations' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "locations",
        "attributes": {
          "name": "Store",
          "code": "STR",
          "location_type": "rental",
          "address_line_1": "Blokhuisplein 40",
          "address_line_2": "Department II",
          "zipcode": "8911LJ",
          "city": "Leeuwarden",
          "region": "Friesland",
          "country": "Netherlands",
          "cluster_ids": [
            "ee4880f8-6d3c-4b45-88f5-dfe4176a21c7"
          ]
        }
      },
      "include": "clusters"
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "301bba98-1401-4067-959a-c2609afdf896",
    "type": "locations",
    "attributes": {
      "created_at": "2024-11-18T09:26:38.147186+00:00",
      "updated_at": "2024-11-18T09:26:38.156245+00:00",
      "archived": false,
      "archived_at": null,
      "name": "Store",
      "code": "STR",
      "location_type": "rental",
      "address_line_1": "Blokhuisplein 40",
      "address_line_2": "Department II",
      "zipcode": "8911LJ",
      "city": "Leeuwarden",
      "region": "Friesland",
      "country": "Netherlands",
      "cluster_ids": [
        "ee4880f8-6d3c-4b45-88f5-dfe4176a21c7"
      ],
      "pickup_enabled": true,
      "fulfillment_capabilities": [
        "pickup"
      ],
      "main_address": {
        "meets_validation_requirements": false,
        "first_name": null,
        "last_name": null,
        "address1": "Blokhuisplein 40",
        "address2": "Department II",
        "city": "Leeuwarden",
        "region": "Friesland",
        "zipcode": "8911LJ",
        "country": "Netherlands",
        "country_id": null,
        "province_id": null,
        "latitude": null,
        "longitude": null,
        "value": "Blokhuisplein 40\nDepartment II\n8911LJ Leeuwarden Friesland\nNetherlands"
      }
    },
    "relationships": {
      "clusters": {
        "data": [
          {
            "type": "clusters",
            "id": "ee4880f8-6d3c-4b45-88f5-dfe4176a21c7"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "ee4880f8-6d3c-4b45-88f5-dfe4176a21c7",
      "type": "clusters",
      "attributes": {
        "created_at": "2024-11-18T09:26:38.066215+00:00",
        "updated_at": "2024-11-18T09:26:38.066215+00:00",
        "name": "North",
        "location_ids": [
          "301bba98-1401-4067-959a-c2609afdf896"
        ]
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

POST /api/boomerang/locations

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=main_address,clusters,carriers
fields[] Array
List of comma seperated fields to include ?fields[locations]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the location
data[attributes][code] String
Code used to identify the location
data[attributes][location_type] String
Determines if the location can be seen in the online webshop. One of rental, internal
data[attributes][address_line_1] String
First address line
data[attributes][address_line_2] String
Second address line
data[attributes][zipcode] String
Address zipcode
data[attributes][city] String
Address city
data[attributes][region] String
Address region
data[attributes][country] String
Address country
data[attributes][cluster_ids][] Array
Clusters this location belongs to
data[attributes][main_address_attributes] Hash
A hash with the address fields. Use it when creating or updating a location. See address property type for more information
data[attributes][pickup_enabled] Boolean
Whether the location supports pickup
data[attributes][confirm_has_orders] Boolean
A flag to confirm an address update when the location has orders
data[attributes][main_address] Hash
A hash with the address fields. Use it when fetching a location. See address property type for more information

Includes

This request accepts the following includes:

main_address

clusters

carriers

Updating a location

Note that disassociating clusters may result in a shortage error.

How to update a location and assign it to multiple clusters:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/locations/461f0f9b-4690-4e7b-9a18-f5c7f3498df2' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "461f0f9b-4690-4e7b-9a18-f5c7f3498df2",
        "type": "locations",
        "attributes": {
          "name": "Old warehouse",
          "cluster_ids": [
            "042dffc7-f634-46b7-9b95-c9fe5da1615d",
            "e8a3fdc6-aa74-4e0e-ade0-2b06f2b7a9ed"
          ]
        }
      },
      "include": "clusters"
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "461f0f9b-4690-4e7b-9a18-f5c7f3498df2",
    "type": "locations",
    "attributes": {
      "created_at": "2024-11-18T09:26:40.729981+00:00",
      "updated_at": "2024-11-18T09:26:40.780042+00:00",
      "archived": false,
      "archived_at": null,
      "name": "Old warehouse",
      "code": "LOC1000063",
      "location_type": "rental",
      "address_line_1": "Blokhuisplein 40",
      "address_line_2": "Department II",
      "zipcode": "8911LJ",
      "city": "Leeuwarden",
      "region": "Friesland",
      "country": "Netherlands",
      "cluster_ids": [
        "042dffc7-f634-46b7-9b95-c9fe5da1615d",
        "e8a3fdc6-aa74-4e0e-ade0-2b06f2b7a9ed"
      ],
      "pickup_enabled": true,
      "fulfillment_capabilities": [
        "pickup"
      ],
      "main_address": {
        "meets_validation_requirements": false,
        "first_name": null,
        "last_name": null,
        "address1": "Blokhuisplein 40",
        "address2": "Department II",
        "city": "Leeuwarden",
        "region": "Friesland",
        "zipcode": "8911LJ",
        "country": "Netherlands",
        "country_id": null,
        "province_id": null,
        "latitude": null,
        "longitude": null,
        "value": "Blokhuisplein 40\nDepartment II\n8911LJ Leeuwarden Friesland\nNetherlands"
      }
    },
    "relationships": {
      "clusters": {
        "data": [
          {
            "type": "clusters",
            "id": "042dffc7-f634-46b7-9b95-c9fe5da1615d"
          },
          {
            "type": "clusters",
            "id": "e8a3fdc6-aa74-4e0e-ade0-2b06f2b7a9ed"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "042dffc7-f634-46b7-9b95-c9fe5da1615d",
      "type": "clusters",
      "attributes": {
        "created_at": "2024-11-18T09:26:40.738685+00:00",
        "updated_at": "2024-11-18T09:26:40.738685+00:00",
        "name": "North",
        "location_ids": [
          "461f0f9b-4690-4e7b-9a18-f5c7f3498df2"
        ]
      },
      "relationships": {}
    },
    {
      "id": "e8a3fdc6-aa74-4e0e-ade0-2b06f2b7a9ed",
      "type": "clusters",
      "attributes": {
        "created_at": "2024-11-18T09:26:40.742932+00:00",
        "updated_at": "2024-11-18T09:26:40.742932+00:00",
        "name": "Central",
        "location_ids": [
          "461f0f9b-4690-4e7b-9a18-f5c7f3498df2"
        ]
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

Disassociating cluster resulting in shortage error:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/locations/b2a0b469-c424-4f01-8a15-d286c80b4395' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "b2a0b469-c424-4f01-8a15-d286c80b4395",
        "type": "locations",
        "attributes": {
          "name": "Old warehouse",
          "cluster_ids": []
        }
      },
      "include": "clusters"
    }'

A 422 status response looks like this:

  {
  "errors": [
    {
      "code": "shortage",
      "status": "422",
      "title": "Shortage",
      "detail": "This will create shortage for running or future orders",
      "meta": {
        "warning": [],
        "blocking": [
          {
            "reason": "shortage",
            "shortage": 2,
            "item_id": "227b5cb0-0466-4fe2-b902-4daaaf862de2",
            "mutation": 0,
            "order_ids": [
              "fae4a412-7513-455e-bdd8-a4f469dcfda9"
            ],
            "location_id": "b2a0b469-c424-4f01-8a15-d286c80b4395",
            "available": -2,
            "plannable": -2,
            "stock_count": 0,
            "planned": 2,
            "needed": 2,
            "cluster_available": -2,
            "cluster_plannable": -2,
            "cluster_stock_count": 0,
            "cluster_planned": 2,
            "cluster_needed": 2
          }
        ]
      }
    }
  ]
}

HTTP Request

PUT /api/boomerang/locations/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=main_address,clusters,carriers
fields[] Array
List of comma seperated fields to include ?fields[locations]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the location
data[attributes][code] String
Code used to identify the location
data[attributes][location_type] String
Determines if the location can be seen in the online webshop. One of rental, internal
data[attributes][address_line_1] String
First address line
data[attributes][address_line_2] String
Second address line
data[attributes][zipcode] String
Address zipcode
data[attributes][city] String
Address city
data[attributes][region] String
Address region
data[attributes][country] String
Address country
data[attributes][cluster_ids][] Array
Clusters this location belongs to
data[attributes][main_address_attributes] Hash
A hash with the address fields. Use it when creating or updating a location. See address property type for more information
data[attributes][pickup_enabled] Boolean
Whether the location supports pickup
data[attributes][confirm_has_orders] Boolean
A flag to confirm an address update when the location has orders
data[attributes][main_address] Hash
A hash with the address fields. Use it when fetching a location. See address property type for more information

Includes

This request accepts the following includes:

main_address

clusters

carriers

Archiving a location

To archive a location make sure that:

How to archive a location:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/locations/e5416bf9-3a9d-46e9-bd1e-23b3e924e5c7' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "e5416bf9-3a9d-46e9-bd1e-23b3e924e5c7",
    "type": "locations",
    "attributes": {
      "created_at": "2024-11-18T09:26:36.957317+00:00",
      "updated_at": "2024-11-18T09:26:36.987304+00:00",
      "archived": true,
      "archived_at": "2024-11-18T09:26:36.987304+00:00",
      "name": "Warehouse",
      "code": "LOC1000057",
      "location_type": "rental",
      "address_line_1": "Blokhuisplein 40",
      "address_line_2": "Department II",
      "zipcode": "8911LJ",
      "city": "Leeuwarden",
      "region": "Friesland",
      "country": "Netherlands",
      "cluster_ids": [],
      "pickup_enabled": true,
      "fulfillment_capabilities": [
        "pickup"
      ],
      "main_address": {
        "meets_validation_requirements": false,
        "first_name": null,
        "last_name": null,
        "address1": "Blokhuisplein 40",
        "address2": "Department II",
        "city": "Leeuwarden",
        "region": "Friesland",
        "zipcode": "8911LJ",
        "country": "Netherlands",
        "country_id": null,
        "province_id": null,
        "latitude": null,
        "longitude": null,
        "value": "Blokhuisplein 40\nDepartment II\n8911LJ Leeuwarden Friesland\nNetherlands"
      }
    },
    "relationships": {}
  },
  "meta": {}
}

Failure due to a future order:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/locations/b247cbde-a094-44e9-a5fe-cef8210aa4d4' \
    --header 'content-type: application/json' \
    --data '{}'

A 422 status response looks like this:

  {
  "errors": [
    {
      "code": "location_has_orders",
      "status": "422",
      "title": "Location has orders",
      "detail": "This location has running or future orders",
      "meta": {
        "order_ids": [
          "62f6d934-cb86-4b41-8ec2-a69433ad7720"
        ]
      }
    }
  ]
}

Failure due to active stock at location:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/locations/4d891a08-f27a-4aa4-bb22-d5f8ed7fddfd' \
    --header 'content-type: application/json' \

A 422 status response looks like this:

  {
  "errors": [
    {
      "code": "location_has_stock",
      "status": "422",
      "title": "Location has stock",
      "detail": "This location has active stock",
      "meta": {
        "item_ids": [
          "b602d168-b023-4e4a-b12d-e954a390b75e"
        ]
      }
    }
  ]
}

HTTP Request

DELETE /api/boomerang/locations/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Notes

Allows you to leave notes attached to other resources.

Endpoints

GET /api/boomerang/notes

GET /api/boomerang/notes/{id}

POST /api/boomerang/notes

DELETE /api/boomerang/notes/{id}

Fields

Every note has the following fields:

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

Relationships

Notes have the following relationships:

Name Description
employee Employees readonly
Associated Employee
owner Customer, Product, Product group, Stock item, Bundle, Order, Document, User
Associated Owner

Listing notes

How to fetch a list of notes:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "4e70afe0-d64d-44a3-be82-67caa50a31ae",
      "type": "notes",
      "attributes": {
        "created_at": "2024-11-18T09:24:11.934255+00:00",
        "updated_at": "2024-11-18T09:24:11.934255+00:00",
        "body": "Agreed to give this customer a 20% discount on the next order",
        "owner_id": "5ba5fce0-f22b-43ef-bb80-b01d526e5890",
        "owner_type": "customers",
        "employee_id": "dae77c25-1058-495b-9a6e-0eb911cab76e"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/notes

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
owner_id Uuid
eq, not_eq
owner_type String
eq, not_eq
employee_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

employee

owner

Fetching a note

How to fetch a note:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/notes/bea00837-2ea9-4c47-8b64-d439b58185d4' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "bea00837-2ea9-4c47-8b64-d439b58185d4",
    "type": "notes",
    "attributes": {
      "created_at": "2024-11-18T09:24:12.424661+00:00",
      "updated_at": "2024-11-18T09:24:12.424661+00:00",
      "body": "Agreed to give this customer a 20% discount on the next order",
      "owner_id": "549d2a3b-a3b8-4d80-985e-74e52cde57a0",
      "owner_type": "customers",
      "employee_id": "327d8019-a25a-4b2f-96c8-e427e71f6cf7"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/notes/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

employee

owner

Creating a note

How to create a note:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/notes' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "notes",
        "attributes": {
          "body": "Agreed to give this customer a 20% discount on the next order",
          "owner_id": "dc99232b-7ed7-46a3-b2d2-4e93ca869fe3",
          "owner_type": "customers"
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "d2102349-d76a-4de7-854e-6ba4b51dc642",
    "type": "notes",
    "attributes": {
      "created_at": "2024-11-18T09:24:13.473680+00:00",
      "updated_at": "2024-11-18T09:24:13.473680+00:00",
      "body": "Agreed to give this customer a 20% discount on the next order",
      "owner_id": "dc99232b-7ed7-46a3-b2d2-4e93ca869fe3",
      "owner_type": "customers",
      "employee_id": "0d837f8c-a722-4683-81b3-e8bb5ea1824e"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/notes

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][body] String
The content of the note
data[attributes][owner_id] Uuid
ID of the resource the note is attached to
data[attributes][owner_type] String
The resource type of the owner. One of orders, documents, product_groups, bundles, products, customers, stock_items, users

Includes

This request accepts the following includes:

employee

owner

Deleting a note

How to delete a note:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/notes/d5f437ca-3358-4129-8332-eb1a44659f9a' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "d5f437ca-3358-4129-8332-eb1a44659f9a",
    "type": "notes",
    "attributes": {
      "created_at": "2024-11-18T09:24:12.941093+00:00",
      "updated_at": "2024-11-18T09:24:12.941093+00:00",
      "body": "Agreed to give this customer a 20% discount on the next order",
      "owner_id": "ca6c3898-2ffe-47fe-aa3f-31f0a4cafe0b",
      "owner_type": "customers",
      "employee_id": "a563e0f5-fd26-4a86-b47b-f0760fccf7e4"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/notes/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

employee

owner

Operations

Operations are long running tasks that are used to mutate data in bulk or to generate artifacts like exports or documents. Once an operation has been started it cannot be paused or cancelled. However, the status of an operation status can be requested.

An operation requires the operation_data object to be set during creation. It contains the parameters required for initiating the operation and is validated strictly. The structure of the object is as follows:

"operation_data": {
  "type": "<operation_type>",
  "data": { ... }
}

The operation type determines what kind of operation is started. The nested data object has required keys, depending on the type of the operation.

The following operation types are supported:

Archive

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
Associated Employee
operation_data Hash
An object with the params used to initiate the operation. See the description of the operation.

Relationships

Operations have the following relationships:

Name Description
employee Employees readonly
Associated Employee

Listing operations

How to fetch a list of operations:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "d3bcb092-3b57-4c9f-aa1f-37d229eac8eb",
      "type": "operations",
      "attributes": {
        "created_at": "2024-11-18T09:26:31.494205+00:00",
        "updated_at": "2024-11-18T09:26:31.494205+00:00",
        "status": "scheduled",
        "status_message": null,
        "finished_at": null,
        "description": null,
        "artifact": {
          "url": null
        },
        "error_data": [],
        "error_count": 0,
        "employee_id": "b18b4822-13eb-4bfd-84c2-9ee94f51ceba"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/operations

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
status String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
finished_at Datetime
eq, not_eq, gt, gte, lt, lte
employee_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

employee

Fetching an operation

How to fetch an operation:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/operations/c88a3c0f-658e-42dd-9d4e-3afa5324c618' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "c88a3c0f-658e-42dd-9d4e-3afa5324c618",
    "type": "operations",
    "attributes": {
      "created_at": "2024-11-18T09:26:32.425764+00:00",
      "updated_at": "2024-11-18T09:26:32.425764+00:00",
      "status": "scheduled",
      "status_message": null,
      "finished_at": null,
      "description": null,
      "artifact": {
        "url": null
      },
      "error_data": [],
      "error_count": 0,
      "employee_id": "126590e6-8999-418e-94c6-9dde3bbf4e85"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/operations/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=employee
fields[] Array
List of comma seperated fields to include ?fields[operations]=created_at,updated_at,status

Includes

This request accepts the following includes:

employee

Creating an operation

How to create an operation:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/operations' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "operations",
        "attributes": {
          "operation_data": {
            "type": "archive",
            "data": {
              "target_type": "customers",
              "target_ids": [
                "123"
              ]
            }
          }
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "5e93d679-f316-4150-a9d5-7809a4affd0e",
    "type": "operations",
    "attributes": {
      "created_at": "2024-11-18T09:26:31.947602+00:00",
      "updated_at": "2024-11-18T09:26:31.947602+00:00",
      "status": "scheduled",
      "status_message": null,
      "finished_at": null,
      "description": "Archiving customers",
      "artifact": {
        "url": null
      },
      "error_data": [],
      "error_count": 0,
      "employee_id": "f406ba79-df32-40f3-95fe-f5237f630421"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/operations

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=employee
fields[] Array
List of comma seperated fields to include ?fields[operations]=created_at,updated_at,status

Request body

This request accepts the following body:

Name Description
data[attributes][operation_data] Hash
An object with the params used to initiate the operation. See the description of the operation.

Includes

This request accepts the following includes:

employee

Orders

Orders are the heart of every rental operation. They hold configuration and information about:

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
Associated Tax region
coupon_id Uuid nullable
Associated Coupon
start_location_id Uuid
The location where the customer will pick up the items.
stop_location_id Uuid
The location where the customer will return the items.
When the clusters feature is in use, the stop location needs to be in the same cluster as the start location.

Relationships

Orders have the following relationships:

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

Listing orders

How to fetch a list of orders:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "540b26bc-60ac-4a67-8193-e3a27e087108",
      "type": "orders",
      "attributes": {
        "created_at": "2024-11-18T09:23:38.275275+00:00",
        "updated_at": "2024-11-18T09:23:40.091486+00:00",
        "number": 1,
        "status": "reserved",
        "statuses": [
          "reserved"
        ],
        "status_counts": {
          "concept": 0,
          "new": 0,
          "reserved": 1,
          "started": 0,
          "stopped": 0
        },
        "starts_at": "1980-04-01T12:00:00.000000+00:00",
        "stops_at": "1980-05-01T12:00:00.000000+00:00",
        "deposit_type": "percentage",
        "deposit_value": 10.0,
        "entirely_started": false,
        "entirely_stopped": false,
        "location_shortage": false,
        "shortage": false,
        "payment_status": "payment_due",
        "override_period_restrictions": false,
        "has_signed_contract": false,
        "tag_list": [
          "webshop"
        ],
        "properties": {},
        "price_in_cents": 80250,
        "grand_total_in_cents": 72225,
        "grand_total_with_tax_in_cents": 87392,
        "tax_in_cents": 15167,
        "discount_in_cents": 8025,
        "coupon_discount_in_cents": 0,
        "total_discount_in_cents": 8025,
        "deposit_in_cents": 10000,
        "deposit_paid_in_cents": 0,
        "deposit_refunded_in_cents": 0,
        "deposit_held_in_cents": 0,
        "deposit_to_refund_in_cents": 0,
        "to_be_paid_in_cents": 97392,
        "paid_in_cents": 0,
        "discount_type": "percentage",
        "discount_percentage": 10.0,
        "billing_address_property_id": null,
        "fulfillment_type": "pickup",
        "customer_id": "2b0aea77-4b7b-443a-af8b-b2663e2afbc6",
        "tax_region_id": null,
        "coupon_id": null,
        "start_location_id": "d249db42-c203-424d-b4ec-c157e28cc57b",
        "stop_location_id": "d249db42-c203-424d-b4ec-c157e28cc57b"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET api/boomerang/orders

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq, gt
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
number Integer
eq, not_eq, gt, gte, lt, lte
status String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
statuses Array
eq, not_eq
status_counts Hash
eq
starts_at Datetime
eq, not_eq, gt, gte, lt, lte
stops_at Datetime
eq, not_eq, gt, gte, lt, lte
deposit_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
location_shortage Boolean
eq
shortage Boolean
eq
payment_status String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
has_signed_contract Boolean
eq
tag_list String
eq
price_in_cents Integer
eq, not_eq, gt, gte, lt, lte
grand_total_in_cents Integer
eq, not_eq, gt, gte, lt, lte
grand_total_with_tax_in_cents Integer
eq, not_eq, gt, gte, lt, lte
tax_in_cents Integer
eq, not_eq, gt, gte, lt, lte
discount_in_cents Integer
eq, not_eq, gt, gte, lt, lte
coupon_discount_in_cents Integer
eq, not_eq, gt, gte, lt, lte
total_discount_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_paid_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_refunded_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_held_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_to_refund_in_cents Integer
eq, not_eq, gt, gte, lt, lte
to_be_paid_in_cents Integer
eq, not_eq, gt, gte, lt, lte
paid_in_cents Integer
eq, not_eq, gt, gte, lt, lte
discount_value Float
eq, not_eq, gt, gte, lt, lte
discount_percentage Float
eq, not_eq, gt, gte, lt, lte
billing_address_property_id Uuid
eq, not_eq
fulfillment_type String
eq
customer_id Uuid
eq, not_eq
tax_region_id Uuid
eq, not_eq
coupon_id Uuid
eq, not_eq
start_location_id Uuid
eq, not_eq
stop_location_id Uuid
eq, not_eq
q String
eq
item_id Uuid
eq
stock_item_id Uuid
eq
start_or_stop_time Datetime
eq, not_eq, gt, gte, lt, lte, between
any_shortage Boolean
eq
conditions Hash
eq

Meta

Results can be aggregated on:

Name Description
total Array
count
payment_status Array
count
tag_list Array
count
status Array
count
statuses Array
count
shortage Array
count
location_shortage Array
count
deposit_type Array
count
price_in_cents Array
sum, maximum, minimum, average
grand_total_in_cents Array
sum, maximum, minimum, average
grand_total_with_tax_in_cents Array
sum, maximum, minimum, average
tax_in_cents Array
sum, maximum, minimum, average
discount_in_cents Array
sum, maximum, minimum, average
coupon_discount_in_cents Array
sum, maximum, minimum, average
total_discount_in_cents Array
sum, maximum, minimum, average
deposit_in_cents Array
sum, maximum, minimum, average
deposit_paid_in_cents Array
sum, maximum, minimum, average
deposit_refunded_in_cents Array
sum, maximum, minimum, average
deposit_held_in_cents Array
sum, maximum, minimum, average
deposit_to_refund_in_cents Array
sum, maximum, minimum, average
to_be_paid_in_cents Array
sum, maximum, minimum, average
paid_in_cents Array
sum, maximum, minimum, average
discount_percentage Array
maximum, minimum, average

Includes

This request accepts the following includes:

customer

coupon

start_location

stop_location

properties

Searching orders

Use advanced search to make logical filter groups with and/or operators.

How to search for orders:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/orders/search' \
    --header 'content-type: application/json' \
    --data '{
      "fields": {
        "orders": "id"
      },
      "filter": {
        "conditions": {
          "operator": "and",
          "attributes": [
            {
              "operator": "or",
              "attributes": [
                {
                  "starts_at": {
                    "gte": "2024-11-19T09:23:51Z",
                    "lte": "2024-11-22T09:23:51Z"
                  }
                },
                {
                  "stops_at": {
                    "gte": "2024-11-19T09:23:51Z",
                    "lte": "2024-11-22T09:23:51Z"
                  }
                }
              ]
            },
            {
              "operator": "and",
              "attributes": [
                {
                  "deposit_type": "none"
                },
                {
                  "payment_status": "paid"
                }
              ]
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "cf4f3d8b-9d7c-4be4-babe-65b356377277"
    },
    {
      "id": "e0efd4c6-05bf-41bb-844d-ed920a4f7d6e"
    }
  ]
}

HTTP Request

POST api/boomerang/orders/search

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq, gt
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
number Integer
eq, not_eq, gt, gte, lt, lte
status String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
statuses Array
eq, not_eq
status_counts Hash
eq
starts_at Datetime
eq, not_eq, gt, gte, lt, lte
stops_at Datetime
eq, not_eq, gt, gte, lt, lte
deposit_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
location_shortage Boolean
eq
shortage Boolean
eq
payment_status String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
has_signed_contract Boolean
eq
tag_list String
eq
price_in_cents Integer
eq, not_eq, gt, gte, lt, lte
grand_total_in_cents Integer
eq, not_eq, gt, gte, lt, lte
grand_total_with_tax_in_cents Integer
eq, not_eq, gt, gte, lt, lte
tax_in_cents Integer
eq, not_eq, gt, gte, lt, lte
discount_in_cents Integer
eq, not_eq, gt, gte, lt, lte
coupon_discount_in_cents Integer
eq, not_eq, gt, gte, lt, lte
total_discount_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_paid_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_refunded_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_held_in_cents Integer
eq, not_eq, gt, gte, lt, lte
deposit_to_refund_in_cents Integer
eq, not_eq, gt, gte, lt, lte
to_be_paid_in_cents Integer
eq, not_eq, gt, gte, lt, lte
paid_in_cents Integer
eq, not_eq, gt, gte, lt, lte
discount_value Float
eq, not_eq, gt, gte, lt, lte
discount_percentage Float
eq, not_eq, gt, gte, lt, lte
billing_address_property_id Uuid
eq, not_eq
fulfillment_type String
eq
customer_id Uuid
eq, not_eq
tax_region_id Uuid
eq, not_eq
coupon_id Uuid
eq, not_eq
start_location_id Uuid
eq, not_eq
stop_location_id Uuid
eq, not_eq
q String
eq
item_id Uuid
eq
stock_item_id Uuid
eq
start_or_stop_time Datetime
eq, not_eq, gt, gte, lt, lte, between
any_shortage Boolean
eq
conditions Hash
eq

Meta

Results can be aggregated on:

Name Description
total Array
count
payment_status Array
count
tag_list Array
count
status Array
count
statuses Array
count
shortage Array
count
location_shortage Array
count
deposit_type Array
count
price_in_cents Array
sum, maximum, minimum, average
grand_total_in_cents Array
sum, maximum, minimum, average
grand_total_with_tax_in_cents Array
sum, maximum, minimum, average
tax_in_cents Array
sum, maximum, minimum, average
discount_in_cents Array
sum, maximum, minimum, average
coupon_discount_in_cents Array
sum, maximum, minimum, average
total_discount_in_cents Array
sum, maximum, minimum, average
deposit_in_cents Array
sum, maximum, minimum, average
deposit_paid_in_cents Array
sum, maximum, minimum, average
deposit_refunded_in_cents Array
sum, maximum, minimum, average
deposit_held_in_cents Array
sum, maximum, minimum, average
deposit_to_refund_in_cents Array
sum, maximum, minimum, average
to_be_paid_in_cents Array
sum, maximum, minimum, average
paid_in_cents Array
sum, maximum, minimum, average
discount_percentage Array
maximum, minimum, average

Includes

This request accepts the following includes:

customer

coupon

start_location

stop_location

properties

New order

Returns an existing or new order for the current employee.

How to fetch a new order:

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

A 200 status response looks like this:

  {
  "data": {
    "id": "343e6bd5-ca0b-4f2a-a1a5-52f3eff9f5e6",
    "type": "orders",
    "attributes": {
      "created_at": "2024-11-18T09:23:42.872286+00:00",
      "updated_at": "2024-11-18T09:23:42.882586+00:00",
      "number": null,
      "status": "new",
      "statuses": [
        "new"
      ],
      "status_counts": {
        "new": 0,
        "concept": 0,
        "reserved": 0,
        "started": 0,
        "stopped": 0
      },
      "starts_at": null,
      "stops_at": null,
      "deposit_type": "percentage",
      "deposit_value": 100.0,
      "entirely_started": true,
      "entirely_stopped": false,
      "location_shortage": false,
      "shortage": false,
      "payment_status": "paid",
      "override_period_restrictions": false,
      "has_signed_contract": false,
      "tag_list": [],
      "properties": {},
      "price_in_cents": 0,
      "grand_total_in_cents": 0,
      "grand_total_with_tax_in_cents": 0,
      "tax_in_cents": 0,
      "discount_in_cents": 0,
      "coupon_discount_in_cents": 0,
      "total_discount_in_cents": 0,
      "deposit_in_cents": 0,
      "deposit_paid_in_cents": 0,
      "deposit_refunded_in_cents": 0,
      "deposit_held_in_cents": 0,
      "deposit_to_refund_in_cents": 0,
      "to_be_paid_in_cents": 0,
      "paid_in_cents": 0,
      "discount_type": "percentage",
      "discount_percentage": 0.0,
      "billing_address_property_id": null,
      "fulfillment_type": "pickup",
      "customer_id": null,
      "tax_region_id": null,
      "coupon_id": null,
      "start_location_id": "994c5653-6a37-4633-b155-d6a1fb68d41d",
      "stop_location_id": "994c5653-6a37-4633-b155-d6a1fb68d41d"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET api/boomerang/orders/new

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=barcode,coupon,customer
fields[] Array
List of comma seperated fields to include ?fields[orders]=created_at,updated_at,number

Includes

This request accepts the following includes:

barcode

coupon

customer => merge_suggestion_customer

properties

documents

lines => item => photo

planning => stock_item_plannings => stock_item

tax_category

notes

properties

start_location

stop_location

tax_region

tax_values

transfers

order_delivery_rate => delivery_address

Fetching an order

How to fetch an order:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/orders/95a78074-c0a0-4a96-928c-1e83096a9cea' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "95a78074-c0a0-4a96-928c-1e83096a9cea",
    "type": "orders",
    "attributes": {
      "created_at": "2024-11-18T09:23:43.518119+00:00",
      "updated_at": "2024-11-18T09:23:45.271251+00:00",
      "number": 1,
      "status": "reserved",
      "statuses": [
        "reserved"
      ],
      "status_counts": {
        "concept": 0,
        "new": 0,
        "reserved": 1,
        "started": 0,
        "stopped": 0
      },
      "starts_at": "1980-04-01T12:00:00.000000+00:00",
      "stops_at": "1980-05-01T12:00:00.000000+00:00",
      "deposit_type": "percentage",
      "deposit_value": 10.0,
      "entirely_started": false,
      "entirely_stopped": false,
      "location_shortage": false,
      "shortage": false,
      "payment_status": "payment_due",
      "override_period_restrictions": false,
      "has_signed_contract": false,
      "tag_list": [
        "webshop"
      ],
      "properties": {},
      "price_in_cents": 80250,
      "grand_total_in_cents": 72225,
      "grand_total_with_tax_in_cents": 87392,
      "tax_in_cents": 15167,
      "discount_in_cents": 8025,
      "coupon_discount_in_cents": 0,
      "total_discount_in_cents": 8025,
      "deposit_in_cents": 10000,
      "deposit_paid_in_cents": 0,
      "deposit_refunded_in_cents": 0,
      "deposit_held_in_cents": 0,
      "deposit_to_refund_in_cents": 0,
      "to_be_paid_in_cents": 97392,
      "paid_in_cents": 0,
      "discount_type": "percentage",
      "discount_percentage": 10.0,
      "billing_address_property_id": null,
      "fulfillment_type": "pickup",
      "customer_id": "f435453e-d7e8-4dd0-ad56-cc139a8aa5a3",
      "tax_region_id": null,
      "coupon_id": null,
      "start_location_id": "df87a91a-5b52-44ac-a44c-4c317b40e591",
      "stop_location_id": "df87a91a-5b52-44ac-a44c-4c317b40e591"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET api/boomerang/orders/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=barcode,coupon,customer
fields[] Array
List of comma seperated fields to include ?fields[orders]=created_at,updated_at,number

Includes

This request accepts the following includes:

barcode

coupon

customer => merge_suggestion_customer

properties

documents

lines => item => photo

planning => stock_item_plannings => stock_item

tax_category

notes

properties

start_location

stop_location

tax_region

tax_values

transfers

order_delivery_rate => delivery_address

Creating an order

When creating an order, and the following fields are left blank, a sensible default will be picked:

How to create an order:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/orders' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "orders",
        "attributes": {
          "starts_at": "2024-11-21T09:23:48.024Z",
          "stops_at": "2024-12-30T09:23:48.024Z"
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "a4462d8e-8ed4-4f3b-9eaf-f6fa22f7794d",
    "type": "orders",
    "attributes": {
      "created_at": "2024-11-18T09:23:48.048556+00:00",
      "updated_at": "2024-11-18T09:23:48.059800+00:00",
      "number": null,
      "status": "new",
      "statuses": [
        "new"
      ],
      "status_counts": {
        "new": 0,
        "concept": 0,
        "reserved": 0,
        "started": 0,
        "stopped": 0
      },
      "starts_at": "2024-11-21T09:15:00.000000+00:00",
      "stops_at": "2024-12-30T09:15:00.000000+00:00",
      "deposit_type": "percentage",
      "deposit_value": 100.0,
      "entirely_started": true,
      "entirely_stopped": false,
      "location_shortage": false,
      "shortage": false,
      "payment_status": "paid",
      "override_period_restrictions": false,
      "has_signed_contract": false,
      "tag_list": [],
      "properties": {},
      "price_in_cents": 0,
      "grand_total_in_cents": 0,
      "grand_total_with_tax_in_cents": 0,
      "tax_in_cents": 0,
      "discount_in_cents": 0,
      "coupon_discount_in_cents": 0,
      "total_discount_in_cents": 0,
      "deposit_in_cents": 0,
      "deposit_paid_in_cents": 0,
      "deposit_refunded_in_cents": 0,
      "deposit_held_in_cents": 0,
      "deposit_to_refund_in_cents": 0,
      "to_be_paid_in_cents": 0,
      "paid_in_cents": 0,
      "discount_type": "percentage",
      "discount_percentage": 0.0,
      "billing_address_property_id": null,
      "fulfillment_type": "pickup",
      "customer_id": null,
      "tax_region_id": null,
      "coupon_id": null,
      "start_location_id": "39a86548-0570-47bc-a21e-ee78fae96c01",
      "stop_location_id": "39a86548-0570-47bc-a21e-ee78fae96c01"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/orders

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=barcode,coupon,customer
fields[] Array
List of comma seperated fields to include ?fields[orders]=created_at,updated_at,number

Request body

This request accepts the following body:

Name Description
data[attributes][starts_at] Datetime
When the items on the order become unavailable
data[attributes][stops_at] Datetime
When the items on the order become available again
data[attributes][deposit_type] String
One of none, percentage_total, percentage, fixed
data[attributes][deposit_value] Float
The value to use for deposit_type
data[attributes][override_period_restrictions] Boolean
Force free period selection when there are restrictions enabled for the order period picker
data[attributes][confirm_shortage] Boolean
Confirm shortage on update
data[attributes][tag_list][] Array
Case insensitive tag list
data[attributes][properties_attributes][] Array
The properties of the order
data[attributes][order_delivery_rate_attributes] Hash
The delivery rate of the order
data[attributes][discount_value] Float
The value to use for discount_type
data[attributes][discount_type] String
One of percentage, fixed
data[attributes][billing_address_property_id] Uuid
The property id of the billing address
data[attributes][fulfillment_type] String
One of pickup, delivery
data[attributes][customer_id] Uuid
The associated customer
data[attributes][tax_region_id] Uuid
Associated Tax region
data[attributes][coupon_id] Uuid
Associated Coupon
data[attributes][start_location_id] Uuid
The location where the customer will pick up the items.
data[attributes][stop_location_id] Uuid
The location where the customer will return the items.
When the clusters feature is in use, the stop location needs to be in the same cluster as the start location.

Includes

This request accepts the following includes:

barcode

coupon

customer => merge_suggestion_customer

properties

documents

lines => item => photo

planning => stock_item_plannings => stock_item

tax_category

notes

properties

start_location

stop_location

tax_region

tax_values

transfers

order_delivery_rate => delivery_address

Updating an order

When updating a customer on an order the following settings will be applied and prices will be calculated accordingly:

How to assign a (new) customer to an order:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/orders/72a63cdd-f1f0-4362-9644-3815c3f43603' \
    --header 'content-type: application/json' \
    --data '{
      "fields": {
        "orders": "customer_id,tax_region_id,price_in_cents,grand_total_with_tax_in_cents,to_be_paid_in_cents"
      },
      "data": {
        "id": "72a63cdd-f1f0-4362-9644-3815c3f43603",
        "type": "orders",
        "attributes": {
          "customer_id": "2198f51d-50cb-4af3-ad9a-5d7e2c496c12"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "72a63cdd-f1f0-4362-9644-3815c3f43603",
    "type": "orders",
    "attributes": {
      "price_in_cents": 80250,
      "grand_total_with_tax_in_cents": 97103,
      "to_be_paid_in_cents": 197103,
      "customer_id": "2198f51d-50cb-4af3-ad9a-5d7e2c496c12",
      "tax_region_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

How to update the deposit_type:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/orders/d2016c32-9a85-4ef0-905f-a7f2846629b3' \
    --header 'content-type: application/json' \
    --data '{
      "fields": {
        "orders": "deposit_type,deposit_in_cents,to_be_paid_in_cents,deposit_paid_in_cents"
      },
      "data": {
        "id": "d2016c32-9a85-4ef0-905f-a7f2846629b3",
        "type": "orders",
        "attributes": {
          "deposit_type": "percentage"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "d2016c32-9a85-4ef0-905f-a7f2846629b3",
    "type": "orders",
    "attributes": {
      "deposit_type": "percentage",
      "deposit_in_cents": 10000,
      "deposit_paid_in_cents": 0,
      "to_be_paid_in_cents": 97392
    },
    "relationships": {}
  },
  "meta": {}
}

Updating stops_at resulting in a shortage:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/orders/c1f39034-2055-4b39-bf44-6f0c6e650b37' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "c1f39034-2055-4b39-bf44-6f0c6e650b37",
        "type": "orders",
        "attributes": {
          "stops_at": "1980-05-04T12:00:00.000Z"
        }
      }
    }'

A 422 status response looks like this:

  {
  "errors": [
    {
      "code": "stock_item_specified",
      "status": "422",
      "title": "Stock item specified",
      "detail": "One or more items are not available",
      "meta": {
        "warning": [],
        "blocking": [
          {
            "reason": "stock_item_specified",
            "item_id": "18af1eb2-a8be-41a8-9572-66d8c5911657",
            "unavailable": [
              "1ba66cd4-9fa8-4e45-8966-dea4f67a4f7e"
            ],
            "available": [
              "38079061-45ca-46d9-9d54-20af8072d36d"
            ]
          }
        ]
      }
    }
  ]
}

HTTP Request

PUT api/boomerang/orders/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=barcode,coupon,customer
fields[] Array
List of comma seperated fields to include ?fields[orders]=created_at,updated_at,number

Request body

This request accepts the following body:

Name Description
data[attributes][starts_at] Datetime
When items become unavailable, changing this value may result in shortages
data[attributes][stops_at] Datetime
When items become available, changing this value may result in shortages
data[attributes][deposit_type] String
One of none, percentage_total, percentage, fixed
data[attributes][deposit_value] Float
The value to use for deposit_type
data[attributes][override_period_restrictions] Boolean
Force free period selection when there are restrictions enabled for the order period picker
data[attributes][confirm_shortage] Boolean
Confirm shortage on update
data[attributes][tag_list][] Array
Case insensitive tag list
data[attributes][properties_attributes][] Array
The properties of the order
data[attributes][order_delivery_rate_attributes] Hash
The delivery rate of the order
data[attributes][discount_value] Float
The value to use for discount_type
data[attributes][discount_type] String
One of percentage, fixed
data[attributes][billing_address_property_id] Uuid
The property id of the billing address
data[attributes][fulfillment_type] String
One of pickup, delivery
data[attributes][customer_id] Uuid
The associated customer
data[attributes][tax_region_id] Uuid
Associated Tax region
data[attributes][coupon_id] Uuid
Associated Coupon
data[attributes][start_location_id] Uuid
The location where the customer will pick up the items.
data[attributes][stop_location_id] Uuid
The location where the customer will return the items.
When the clusters feature is in use, the stop location needs to be in the same cluster as the start location.

Includes

This request accepts the following includes:

barcode

coupon

customer => merge_suggestion_customer

properties

documents

lines => item => photo

planning => stock_item_plannings => stock_item

tax_category

notes

properties

start_location

stop_location

tax_region

tax_values

transfers

order_delivery_rate => delivery_address

Order duplications

Duplicates an Order with a selectable subset of fields and associations.

Fields

Every order duplication has the following fields:

Name Description
id Uuid readonly
Primary key
custom_lines Boolean
Indicates if custom Lines should be copied from the original Order.
customer Boolean
Indicates if the Customer should be copied from the original Order.
dates Boolean
Indicates if the rental dates should be copied from the original Order.
discount Boolean
Indicates if discounts should be copied from the original Order.
properties Boolean
Indicates if properties should be copied from the original Order.
stock_item_plannings Boolean
Indicates if planned stock items should be copied from the original Order.
tags Boolean
Indicates if tags should be copied from the original Order.
deposit String
current copies the desposit from the original Order, default resets the deposit to the default for the company or customer, none removes the deposit.
original_order_id Uuid
ID of the Order to be duplicated.
new_order_id Uuid readonly
ID of the newly created Order.

Relationships

Order duplications have the following relationships:

Name Description
new_order Orders readonly
Associated New order
original_order Orders
Associated Original order

Duplicate

Duplicate an Order:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_duplications' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_duplications",
        "attributes": {
          "original_order_id": "4d558118-762f-4db0-9acd-137bc6cb1b8f",
          "custom_lines": true,
          "customer": true,
          "dates": true,
          "deposit": "current",
          "discount": true,
          "properties": true,
          "stock_item_plannings": true,
          "tags": true
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "52c9b1c3-9708-5df4-bb92-26718f06d29a",
    "type": "order_duplications",
    "attributes": {
      "custom_lines": true,
      "customer": true,
      "dates": true,
      "discount": true,
      "properties": true,
      "stock_item_plannings": true,
      "tags": true,
      "deposit": "current",
      "original_order_id": "4d558118-762f-4db0-9acd-137bc6cb1b8f",
      "new_order_id": "4f321a57-e531-41e5-a5ad-f86a82049d06"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/order_duplications

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=original_order,new_order
fields[] Array
List of comma seperated fields to include ?fields[order_duplications]=custom_lines,customer,dates

Request body

This request accepts the following body:

Name Description
data[attributes][custom_lines] Boolean
Indicates if custom Lines should be copied from the original Order.
data[attributes][customer] Boolean
Indicates if the Customer should be copied from the original Order.
data[attributes][dates] Boolean
Indicates if the rental dates should be copied from the original Order.
data[attributes][discount] Boolean
Indicates if discounts should be copied from the original Order.
data[attributes][properties] Boolean
Indicates if properties should be copied from the original Order.
data[attributes][stock_item_plannings] Boolean
Indicates if planned stock items should be copied from the original Order.
data[attributes][tags] Boolean
Indicates if tags should be copied from the original Order.
data[attributes][deposit] String
current copies the desposit from the original Order, default resets the deposit to the default for the company or customer, none removes the deposit.
data[attributes][original_order_id] Uuid
ID of the Order to be duplicated.

Includes

This request accepts the following includes:

original_order

new_order

Order fulfillments

Takes an Order through the fulfillment process.

Actions

Book a Bundle

Books a Bundle on an Order.

For each unspecified BundleItem a product variation needs to be selected. Specified BundleItems are automatically booked. These must not be included in the request. When a Bundle only contains specified BundleItems, an empty list of product variations must be provided.

The quantity attribute sets the quantity of the Bundle itself, and multiplies the quantities of all products in the Bundle.

The confirm_shortage attribute (on the resource, not on the action), overrides shortage warnings when booking on a reserved or started order.

{
  "action": "book_bundle",
  "bundle_id": "<id>",
  "quantity": N,
  "product_variations": [
    {
      "bundle_item_id": "<id>",
      "product_id": "<id>"
    },
    {
      "bundle_item_id": "<id>",
      "product_id": "<id>"
    }
  ]
}

Book a Product

Books a quantity of a Product on an Order. This can be any type of Product, including trackable Products.

This action supports 3 modes: - create_new, a new Planning and Line are created. - update_existing, the quantity is added to an existing Planning/Line - infer_planning, behaves as update_existing when a Planning for the same Product exists. Behaves as create_new when there is no existing Planning for the Product.

The confirm_shortage attribute (on the resource, not on the action), overrides shortage warnings when booking on a reserved or started order.

{
  "action": "book_product",
  "mode": "create_new",
  "planning_id": "<id>",  // required for `mode==update_existing`
  "product_id": "<id>",
  "quantity": N,
}

Book StockItems

Books one or more StockItems of a trackable Product on an Order.

This action supports 3 modes: - create_new, a new Planning and Line are created. - update_existing, the StockItems are booked on an existing Planning/Line. If needed, the quantity of the Planning is increased to accomodate all newly booked StockItems. - infer_planning, behaves as update_existing when a Planning for the same Product exists. Behaves as create_new when there is no existing Planning for the Product.

The confirm_shortage attribute (on the resource, not on the action), overrides shortage warnings when booking on a reserved or started order.

{
  "action": "book_stock_items",
  "stock_item_ids": ["<id>"],
  "planning_id": "<id>",  // required for `mode==update_existing`
  "product_id": "<id>",
  "mode": "infer_planning",
}

Specify StockItems

Adds or removes one or more StockItems from an existing Planning.

It is not possible to specify more StockItems than there is remaining quantity left on the Planning. StockItems that have already been started can not be removed.

{
  "action": "specify_stock_items",
  "product_id": "<id>",
  "planning_id": "<id>",
  "stock_item_ids_to_add": ["<id>", "<id>"],
  "stock_item_ids_to_remove": ["<id>", "<id>"]
}

When removing StockItems, the archived StockItemPlannings are returned as part of the changed_stock_item_plannings relation.

Start a Product

A quantity of a product is started. The quantity can be the same as the booked quantity, or less when a subset of items is started.

The confirm_shortage attribute (on the resource, not on the action), overrides shortage warnings when booking on a reserved or started order.

{
  "action": "start_product",
  "product_id": "<id>",
  "planning_id": "<id>",
  "quantity": N
}

Start StockItems

One or more stock items of a trackable product are started.

The confirm_shortage attribute (on the resource, not on the action), overrides shortage warnings when booking on a reserved or started order.

{
  "action": "start_stock_items",
  "product_id": "<id>",
  "planning_id": "<id>",
  "stock_item_ids": ["<id>", "<id>"]
}

Stop a Product

A quantity of a product is returned. The product needs to have started. The quantity can be the same as the started quantity, or less when a subset of items is returned.

Consumables and services can not be stopped.

{
  "action": "stop_product",
  "product_id": "<id>",
  "planning_id": "<id>",
  "quantity": N
}

Stop StockItems

One or more stock items of a trackable product are returned. Only stock items that have been started can be stopped.

{
  "action": "stop_stock_items",
  "product_id": "<id>",
  "planning_id": "<id>",
  "stock_item_ids": ["<id>", "<id>"]
}

Errors

Booking and starting items can be blocked by shortage errors and other kinds of inventory errors.

Endpoints

POST /api/boomerang/order_fulfillments

Fields

Every order fulfillment has the following fields:

Name Description
id Uuid readonly
Primary key
actions Array writeonly
Array of actions to be performed. The actions are executed atomically, and succeed as a whole, or fail as a whole.
confirm_shortage Boolean writeonly
A value of true overrides shortage warnings when booking products on a reserved or started Order.
order_id Uuid
Associated Order

Relationships

Order fulfillments have the following relationships:

Name Description
changed_lines Lines readonly
Associated Changed lines
changed_plannings Plannings readonly
Associated Changed plannings
changed_stock_item_plannings Stock item plannings readonly
Associated Changed stock item plannings
order Orders readonly
Associated Order

Book

Book a Product (on a new Planning):

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_fulfillments",
        "attributes": {
          "order_id": "6eea33ab-e61f-460c-a49f-d3beefc66c17",
          "confirm_shortage": null,
          "actions": [
            {
              "action": "book_product",
              "mode": "create_new",
              "product_id": "c8f5946d-1ba1-4ca5-8319-21a75e8a05ec",
              "quantity": 3
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "e2e05769-e0ee-5cc3-ae84-2044a0c0c56e",
    "type": "order_fulfillments",
    "attributes": {
      "order_id": "6eea33ab-e61f-460c-a49f-d3beefc66c17"
    },
    "relationships": {}
  },
  "meta": {}
}

Book a Product (on an existing Planning if there is any):

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_fulfillments",
        "attributes": {
          "order_id": "8a601341-8aaa-4374-9e92-09d0d3b39859",
          "confirm_shortage": null,
          "actions": [
            {
              "action": "book_product",
              "mode": "infer_planning",
              "product_id": "df45b98f-f305-4c77-beeb-5ea628103d9b",
              "planning_id": null,
              "quantity": 3
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "8810eee2-cdbe-5435-95be-ab016134005b",
    "type": "order_fulfillments",
    "attributes": {
      "order_id": "8a601341-8aaa-4374-9e92-09d0d3b39859"
    },
    "relationships": {}
  },
  "meta": {}
}

Book a Product (on a specified Planning):

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_fulfillments",
        "attributes": {
          "order_id": "03550483-5638-461e-a30d-6ca97c69326c",
          "confirm_shortage": null,
          "actions": [
            {
              "action": "book_product",
              "mode": "update_existing",
              "product_id": "40212583-8ca1-4ec8-a9fc-ee29cd93a9f8",
              "planning_id": "c5b27515-3b73-45f1-8208-362fdf97b94c",
              "quantity": 3
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "be5e77e3-de11-5cf1-b722-df895fc9b358",
    "type": "order_fulfillments",
    "attributes": {
      "order_id": "03550483-5638-461e-a30d-6ca97c69326c"
    },
    "relationships": {}
  },
  "meta": {}
}

Book StockItems:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_fulfillments",
        "attributes": {
          "order_id": "453b0ef3-ecf8-4a0b-bd4e-5ddcb1d9bd4b",
          "confirm_shortage": null,
          "actions": [
            {
              "action": "book_stock_items",
              "mode": "infer_planning",
              "product_id": "aaf3ff54-3b6d-4542-8910-d9900461704b",
              "stock_item_ids": [
                "81e7d223-2d30-472e-8dd1-c9b57dc2919d",
                "0cdda226-4e19-4fc0-bf05-7999ab8c70f5"
              ]
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "b5534fa4-5c04-57a2-8679-827a2e1494b3",
    "type": "order_fulfillments",
    "attributes": {
      "order_id": "453b0ef3-ecf8-4a0b-bd4e-5ddcb1d9bd4b"
    },
    "relationships": {}
  },
  "meta": {}
}

Book a Bundle:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_fulfillments",
        "attributes": {
          "order_id": "56f43c22-6c8a-4e97-b382-d4eeb56b21e0",
          "confirm_shortage": null,
          "actions": [
            {
              "action": "book_bundle",
              "bundle_id": "fafb0e7e-f9f0-40cc-887a-f8776c156ed3",
              "quantity": 1,
              "product_variations": [
                {
                  "bundle_item_id": "bcfbbb1e-4ffb-4357-b814-7476fa1f4eb4",
                  "product_id": "d1b47f2d-2337-4280-81cf-fcf933abeb28"
                }
              ]
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "8a6f60f8-6775-557d-8973-8bd6b1d5e7b1",
    "type": "order_fulfillments",
    "attributes": {
      "order_id": "56f43c22-6c8a-4e97-b382-d4eeb56b21e0"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/order_fulfillments

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=order,changed_lines,changed_plannings
fields[] Array
List of comma seperated fields to include ?fields[order_fulfillments]=order_id

Request body

This request accepts the following body:

Name Description
data[attributes][actions][] Array
Array of actions to be performed. The actions are executed atomically, and succeed as a whole, or fail as a whole.
data[attributes][confirm_shortage] Boolean
A value of true overrides shortage warnings when booking products on a reserved or started Order.
data[attributes][order_id] Uuid
Associated Order

Includes

This request accepts the following includes:

order => tax_values

transfers

changed_lines => item => photo

changed_plannings

changed_stock_item_plannings => stock_item

Specify

Add a StockItem:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_fulfillments",
        "attributes": {
          "order_id": "b7fcbfed-9653-42e1-8c92-3033de37d79a",
          "actions": [
            {
              "action": "specify_stock_items",
              "product_id": "293dabf3-4357-435a-9bbd-409603097c2d",
              "planning_id": "de611bdd-a27c-4ac8-b48f-4bc52daf1769",
              "stock_item_ids_to_add": [
                "325af969-6d0c-4ecc-9878-5c8971cef451"
              ],
              "stock_item_ids_to_remove": []
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "66365d26-6c86-5fbc-aeb3-7d0cbab0b230",
    "type": "order_fulfillments",
    "attributes": {
      "order_id": "b7fcbfed-9653-42e1-8c92-3033de37d79a"
    },
    "relationships": {}
  },
  "meta": {}
}

Remove a StockItem:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_fulfillments",
        "attributes": {
          "order_id": "9b663279-e4ef-4838-aece-7e3283232bf6",
          "actions": [
            {
              "action": "specify_stock_items",
              "product_id": "818a4329-02b9-49e0-b06f-0a3b813a8e92",
              "planning_id": "f7ad858d-ffbe-4bf0-a2f3-52356b20ae46",
              "stock_item_ids_to_add": [],
              "stock_item_ids_to_remove": [
                "ea6611f3-b349-4780-b92a-3f5c2413a10a"
              ]
            }
          ]
        }
      },
      "include": "changed_stock_item_plannings"
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "d367becf-a87f-50d1-9472-75a236df7c55",
    "type": "order_fulfillments",
    "attributes": {
      "order_id": "9b663279-e4ef-4838-aece-7e3283232bf6"
    },
    "relationships": {
      "changed_stock_item_plannings": {
        "data": [
          {
            "type": "stock_item_plannings",
            "id": "9e56f498-4270-4453-bdc8-78b058e35cd2"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "9e56f498-4270-4453-bdc8-78b058e35cd2",
      "type": "stock_item_plannings",
      "attributes": {
        "created_at": "2024-11-18T09:27:56.876322+00:00",
        "updated_at": "2024-11-18T09:27:56.964097+00:00",
        "archived": true,
        "archived_at": "2024-11-18T09:27:56.959152+00:00",
        "reserved": false,
        "started": false,
        "stopped": false,
        "stock_item_id": "ea6611f3-b349-4780-b92a-3f5c2413a10a",
        "planning_id": "f7ad858d-ffbe-4bf0-a2f3-52356b20ae46",
        "order_id": "9b663279-e4ef-4838-aece-7e3283232bf6"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

POST /api/boomerang/order_fulfillments

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=order,changed_lines,changed_plannings
fields[] Array
List of comma seperated fields to include ?fields[order_fulfillments]=order_id

Request body

This request accepts the following body:

Name Description
data[attributes][actions][] Array
Array of actions to be performed. The actions are executed atomically, and succeed as a whole, or fail as a whole.
data[attributes][confirm_shortage] Boolean
A value of true overrides shortage warnings when booking products on a reserved or started Order.
data[attributes][order_id] Uuid
Associated Order

Includes

This request accepts the following includes:

order => tax_values

transfers

changed_lines => item => photo

changed_plannings

changed_stock_item_plannings => stock_item

Start

Start a Product:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_fulfillments",
        "attributes": {
          "order_id": "e237b7d0-e4aa-4938-b499-569cd1b34f90",
          "confirm_shortage": null,
          "actions": [
            {
              "action": "start_product",
              "product_id": "03b942d0-3110-4389-9c42-21e4fb8dab97",
              "planning_id": "67eb091e-ed37-478c-9bbb-033405044233",
              "quantity": 1
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "80efffab-5588-57ef-b3fe-e16d15853c15",
    "type": "order_fulfillments",
    "attributes": {
      "order_id": "e237b7d0-e4aa-4938-b499-569cd1b34f90"
    },
    "relationships": {}
  },
  "meta": {}
}

Start StockItems:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_fulfillments",
        "attributes": {
          "order_id": "1c4d2e94-624c-484b-b9a1-b1afad281011",
          "confirm_shortage": null,
          "actions": [
            {
              "action": "start_stock_items",
              "product_id": "9848f419-e43e-4e4d-b8a7-864d2fea24a3",
              "planning_id": "a712dd47-5415-48e9-8524-eacd52f57812",
              "stock_item_ids": [
                "f1648a87-e6b4-4333-8184-1f7071dd49c9"
              ]
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "3cd750ea-f755-5d08-b2a7-2c099c1640f1",
    "type": "order_fulfillments",
    "attributes": {
      "order_id": "1c4d2e94-624c-484b-b9a1-b1afad281011"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/order_fulfillments

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=order,changed_lines,changed_plannings
fields[] Array
List of comma seperated fields to include ?fields[order_fulfillments]=order_id

Request body

This request accepts the following body:

Name Description
data[attributes][actions][] Array
Array of actions to be performed. The actions are executed atomically, and succeed as a whole, or fail as a whole.
data[attributes][confirm_shortage] Boolean
A value of true overrides shortage warnings when booking products on a reserved or started Order.
data[attributes][order_id] Uuid
Associated Order

Includes

This request accepts the following includes:

order => tax_values

transfers

changed_lines => item => photo

changed_plannings

changed_stock_item_plannings => stock_item

Stop

Stop a Product:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_fulfillments",
        "attributes": {
          "order_id": "a5695ad7-cfe3-4f21-aeae-8e33cfa78f0c",
          "actions": [
            {
              "action": "stop_product",
              "product_id": "7feb1a69-0ff3-427f-80fb-8a22f84f21da",
              "planning_id": "57e857de-a627-43dc-af7b-a66507e09ab6",
              "quantity": 1
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "7d711c5f-ddd8-515c-8ba4-3810b51012b3",
    "type": "order_fulfillments",
    "attributes": {
      "order_id": "a5695ad7-cfe3-4f21-aeae-8e33cfa78f0c"
    },
    "relationships": {}
  },
  "meta": {}
}

Stop StockItems:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_fulfillments' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_fulfillments",
        "attributes": {
          "order_id": "24810d9d-801b-4082-98ed-670011032dc2",
          "actions": [
            {
              "action": "stop_stock_items",
              "product_id": "e6086221-323e-42b5-8105-5a9fb9f9b22d",
              "planning_id": "d62305ce-177a-4460-89f0-eedb7bf8056c",
              "stock_item_ids": [
                "82720a78-2f7c-4cfc-9a74-197b17a0dd6e"
              ]
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "6c0fac2d-0946-5adb-abf3-17366f541d9d",
    "type": "order_fulfillments",
    "attributes": {
      "order_id": "24810d9d-801b-4082-98ed-670011032dc2"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/order_fulfillments

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=order,changed_lines,changed_plannings
fields[] Array
List of comma seperated fields to include ?fields[order_fulfillments]=order_id

Request body

This request accepts the following body:

Name Description
data[attributes][actions][] Array
Array of actions to be performed. The actions are executed atomically, and succeed as a whole, or fail as a whole.
data[attributes][confirm_shortage] Boolean
A value of true overrides shortage warnings when booking products on a reserved or started Order.
data[attributes][order_id] Uuid
Associated Order

Includes

This request accepts the following includes:

order => tax_values

transfers

changed_lines => item => photo

changed_plannings

changed_stock_item_plannings => stock_item

Order price recalculations

When the rental period of an order is changed, the prices of individual lines and the total price of the order are not automatically recalculated to preserve any manual changes that may have been made.

The OrderPriceRecalculation resource allows to request a recalculation for the entire order and all its lines.

To recalculate the price of an individual line, set the charge_length of the line to null as described here.

Fields

Every order price recalculation has the following fields:

Name Description
id Uuid readonly
Primary key
order_id Uuid
Order that needs to be recalculated.

Relationships

Order price recalculations have the following relationships:

Name Description
order Orders
Associated Order

Recalculate prices

Recalculate prices when rental period has changed:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_price_recalculations' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_price_recalculations",
        "attributes": {
          "order_id": "c36adc94-1c8a-4ec4-a76b-49e4801d876f"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "2586ac35-c76c-5abb-8609-0574b51a15a3",
    "type": "order_price_recalculations",
    "attributes": {
      "order_id": "c36adc94-1c8a-4ec4-a76b-49e4801d876f"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/order_price_recalculations

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=order
fields[] Array
List of comma seperated fields to include ?fields[order_price_recalculations]=order_id

Request body

This request accepts the following body:

Name Description
data[attributes][order_id] Uuid
Order that needs to be recalculated.

Includes

This request accepts the following includes:

order => lines

tax_values

Order status transitions

Transitions the status of an Order to another status.

See Order for a desciption of the different statuses.

Note that you can not transition to started or to stopped. The Order will transition to those statuses automatically when starting or stopping items through the Fulfillment API. It is however possible to revert to the started or the stopped status.

Errors

When the Order can not be transitioned, and error.code is items_not_available, then the error.meta.blocking.*.reason or error.meta.warning.*.reason attribute contains one of the following reasons:

Note that is is possible to get multiple warnings and errors of different types at the same time.

Permissions

Fields

Every order status transition has the following fields:

Name Description
id Uuid readonly
Primary key
order_id Uuid
ID of the Order.
transition_from String_enum
The current status of the Order. One of: new, concept, reserved, started, stopped, archived, canceled.
transition_to String_enum
The new status of the Order. One of: concept, reserved, started, stopped, archived, canceled.
It is only possible to transition to started or stopped in combination with revert: true.
revert Boolean
Indicates if this transition reverts the Order back to an earlier status. "Earlier status" does not require this specific Order to ever have been in that status (e.g. concept can have been skipped). "Earlier" means earlier in the conceptual progressing of statuses of Orders in general.
confirm_shortage Boolean
A value of true overrides shortage warnings. This is only possible when reserving an Order.

Relationships

Order status transitions have the following relationships:

Name Description
order Orders readonly
Associated Order

Transition

Save a new Order as concept:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_status_transitions",
        "attributes": {
          "order_id": "062d48ee-e5e3-42ca-87c7-966a87a52f03",
          "transition_from": "new",
          "transition_to": "concept",
          "confirm_shortage": null,
          "revert": null
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "e875a5cd-98ef-588a-819d-39cf925fca00",
    "type": "order_status_transitions",
    "attributes": {
      "order_id": "062d48ee-e5e3-42ca-87c7-966a87a52f03",
      "transition_from": "new",
      "transition_to": "concept",
      "revert": null,
      "confirm_shortage": null
    },
    "relationships": {}
  },
  "meta": {}
}

Reserve a concept Order:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_status_transitions",
        "attributes": {
          "order_id": "79726d30-269c-4799-a5d7-9e93ded09935",
          "transition_from": "concept",
          "transition_to": "reserved",
          "confirm_shortage": null,
          "revert": null
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "6a328b9a-b04a-5806-b364-036a3c3e3077",
    "type": "order_status_transitions",
    "attributes": {
      "order_id": "79726d30-269c-4799-a5d7-9e93ded09935",
      "transition_from": "concept",
      "transition_to": "reserved",
      "revert": null,
      "confirm_shortage": null
    },
    "relationships": {}
  },
  "meta": {}
}

Reserve a concept Order, causing a blocking shortage error:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_status_transitions",
        "attributes": {
          "order_id": "d836fc98-b6e9-4a16-9e79-22bb6b9ae252",
          "transition_from": "concept",
          "transition_to": "reserved",
          "confirm_shortage": null,
          "revert": null
        }
      }
    }'

A 422 status response looks like this:

  {
  "errors": [
    {
      "code": "items_not_available",
      "status": "422",
      "title": "Items not available",
      "detail": "One or more items are not available",
      "meta": {
        "warning": [],
        "blocking": [
          {
            "reason": "shortage",
            "item_id": "20efa979-146b-448f-9e6b-c48c38694879",
            "stock_count": 1,
            "reserved": 0,
            "needed": 2,
            "shortage": 1
          }
        ]
      }
    }
  ]
}

Reserve a concept Order, causing a shortage warning:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_status_transitions",
        "attributes": {
          "order_id": "76c36597-9b67-4da5-a639-2727ea7f66c5",
          "transition_from": "concept",
          "transition_to": "reserved",
          "confirm_shortage": null,
          "revert": null
        }
      }
    }'

A 422 status response looks like this:

  {
  "errors": [
    {
      "code": "items_not_available",
      "status": "422",
      "title": "Items not available",
      "detail": "One or more items are not available",
      "meta": {
        "warning": [
          {
            "reason": "shortage",
            "item_id": "5b69fe36-f938-4883-b415-fdb42b087c48",
            "stock_count": 1,
            "reserved": 0,
            "needed": 2,
            "shortage": 1
          }
        ],
        "blocking": []
      }
    }
  ]
}

Reserve a concept Order, and override the shortage warning:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_status_transitions",
        "attributes": {
          "order_id": "5e64bc27-b045-477a-bfee-54b96874988d",
          "transition_from": "concept",
          "transition_to": "reserved",
          "confirm_shortage": true,
          "revert": null
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "4bad6f1b-83fc-5506-a995-09ebe2c7623b",
    "type": "order_status_transitions",
    "attributes": {
      "order_id": "5e64bc27-b045-477a-bfee-54b96874988d",
      "transition_from": "concept",
      "transition_to": "reserved",
      "revert": null,
      "confirm_shortage": true
    },
    "relationships": {}
  },
  "meta": {}
}

Reserve a concept Order, causing a stock item specified error:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_status_transitions",
        "attributes": {
          "order_id": "e131b39c-51f7-4fb9-9938-50dd9c24bdf5",
          "transition_from": "concept",
          "transition_to": "reserved",
          "confirm_shortage": null,
          "revert": null
        }
      }
    }'

A 422 status response looks like this:

  {
  "errors": [
    {
      "code": "stock_item_specified",
      "status": "422",
      "title": "Stock item specified",
      "detail": "One or more items are not available",
      "meta": {
        "warning": [],
        "blocking": [
          {
            "reason": "stock_item_specified",
            "item_id": "a8b7951c-9fbc-477d-9b6e-4a9cb9e8db66",
            "unavailable": [
              "39909245-78ba-4fa0-8d30-8fd34fac395f"
            ],
            "available": [
              "f4c1a1c4-a05e-4ba9-aa8b-629e42973267"
            ]
          }
        ]
      }
    }
  ]
}

Archive a reserved Order:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_status_transitions",
        "attributes": {
          "order_id": "34d4af9e-2b36-49d1-b54f-a55497c3fa68",
          "transition_from": "reserved",
          "transition_to": "archived",
          "confirm_shortage": null,
          "revert": null
        }
      }
    }'

A 422 status response looks like this:

  {
  "errors": [
    {
      "code": "wrong_status",
      "status": "422",
      "title": "Wrong status",
      "detail": "Can't transition order from 'reserved' to 'archived'",
      "meta": null
    }
  ]
}

Archive a stopped Order:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_status_transitions",
        "attributes": {
          "order_id": "49525c52-0820-4f1f-9b40-04af56dbd4e8",
          "transition_from": "stopped",
          "transition_to": "archived",
          "confirm_shortage": null,
          "revert": null
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "4bc82b33-e841-5bcf-883c-d514e6f4b42b",
    "type": "order_status_transitions",
    "attributes": {
      "order_id": "49525c52-0820-4f1f-9b40-04af56dbd4e8",
      "transition_from": "stopped",
      "transition_to": "archived",
      "revert": null,
      "confirm_shortage": null
    },
    "relationships": {}
  },
  "meta": {}
}

Revert a reserved Order to 'concept':

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/order_status_transitions' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "order_status_transitions",
        "attributes": {
          "order_id": "d6899402-4d96-41b8-9dfb-f7ea0d577e6a",
          "transition_from": "reserved",
          "transition_to": "concept",
          "confirm_shortage": null,
          "revert": true
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "30b8b5e8-f2c2-5253-b295-033a1f2bf974",
    "type": "order_status_transitions",
    "attributes": {
      "order_id": "d6899402-4d96-41b8-9dfb-f7ea0d577e6a",
      "transition_from": "reserved",
      "transition_to": "concept",
      "revert": true,
      "confirm_shortage": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/order_status_transitions

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=order
fields[] Array
List of comma seperated fields to include ?fields[order_status_transitions]=order_id,transition_from,transition_to

Request body

This request accepts the following body:

Name Description
data[attributes][order_id] Uuid
ID of the Order.
data[attributes][transition_from] String_enum
The current status of the Order. One of: new, concept, reserved, started, stopped, archived, canceled.
data[attributes][transition_to] String_enum
The new status of the Order. One of: concept, reserved, started, stopped, archived, canceled.
It is only possible to transition to started or stopped in combination with revert: true.
data[attributes][revert] Boolean
Indicates if this transition reverts the Order back to an earlier status. "Earlier status" does not require this specific Order to ever have been in that status (e.g. concept can have been skipped). "Earlier" means earlier in the conceptual progressing of statuses of Orders in general.
data[attributes][confirm_shortage] Boolean
A value of true overrides shortage warnings. This is only possible when reserving an Order.

Includes

This request accepts the following includes:

order => plannings

stock_item_plannings

Payment methods

Re-usable payment methods stored on file.

Endpoints

GET /api/boomerang/payment_methods

POST /api/boomerang/payment_methods

DELETE /api/boomerang/payment_methods/{id}

Fields

Every payment method has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
label String
Label of the payment method
provider String
Provider of the payment method. Can be one of stripe, app, none
identifier String
Provider identifier of the payment method
method_type String
Provider method type
details Hash
Method details
customer_id Uuid
Associated Customer

Relationships

Payment methods have the following relationships:

Name Description
customer Customers readonly
Associated Customer

Listing payment methods

How to fetch a list of payment methods:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "374e65b7-b2f3-42fb-a3d7-0eca1ee78910",
      "type": "payment_methods",
      "attributes": {
        "created_at": "2024-11-18T09:24:34.315163+00:00",
        "updated_at": "2024-11-18T09:24:34.315163+00:00",
        "label": "Visa XXX1234",
        "provider": "stripe",
        "identifier": "pm_1234567890",
        "method_type": null,
        "details": {},
        "customer_id": "06b7ae81-4a21-491d-ab08-7e42f0a5b361"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/payment_methods

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
label String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
provider String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
identifier String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
method_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
customer_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request does not accept any includes

Creating a payment method

How to create a payment method:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/payment_methods' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "payment_methods",
        "attributes": {
          "provider": "stripe",
          "identifier": "pm_123",
          "customer_id": "a3dbdd3b-7e7e-4e64-82ef-2d973a41bfad",
          "label": "Test card"
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "ea0d844f-675d-47d2-9560-b094e3c15ca6",
    "type": "payment_methods",
    "attributes": {
      "created_at": "2024-11-18T09:24:34.909699+00:00",
      "updated_at": "2024-11-18T09:24:34.909699+00:00",
      "label": "Test card",
      "provider": "stripe",
      "identifier": "pm_123",
      "method_type": null,
      "details": {},
      "customer_id": "a3dbdd3b-7e7e-4e64-82ef-2d973a41bfad"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/payment_methods

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][label] String
Label of the payment method
data[attributes][provider] String
Provider of the payment method. Can be one of stripe, app, none
data[attributes][identifier] String
Provider identifier of the payment method
data[attributes][method_type] String
Provider method type
data[attributes][details] Hash
Method details
data[attributes][customer_id] Uuid
Associated Customer

Includes

This request does not accept any includes

Detach a payment method

How to detach a payment method from customer:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/payment_methods/33c7dedd-c6d3-4962-84c9-5d1c9aed68f2' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "33c7dedd-c6d3-4962-84c9-5d1c9aed68f2",
    "type": "payment_methods",
    "attributes": {
      "created_at": "2024-11-18T09:24:33.810560+00:00",
      "updated_at": "2024-11-18T09:24:33.859756+00:00",
      "label": "Visa XXX1234",
      "provider": "stripe",
      "identifier": "pm_1234567890",
      "method_type": null,
      "details": {},
      "customer_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/payment_methods/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Photos

Photos are displayed on documents and in the online store to let customers see how products look.

Endpoints

GET /api/boomerang/photos

GET /api/boomerang/photos/{id}

POST /api/boomerang/photos

PUT /api/boomerang/photos/{id}

DELETE /api/boomerang/photos/{id}

Fields

Every photo has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
photo_base64 String writeonly
Base64 encoded photo
remote_photo_url String writeonly
Url to an image on the web
original_url String readonly
Url to original stored image
large_url String readonly
Url to large stored image (max 500x500)
xlarge_url String readonly
Url to xlarge stored image (max 2000x2000)
coordinates Hash
Focalpoint coordinates ({ x: 10, y: 100 }). To ensure that a key part of an image stays visible, you can set the image's focal point. The focal point sets the focus of an image, giving you control over where the image is centered.
preview String readonly
Base64 encoded preview
position Integer
Which position the photo has in the album
photo Carrierwave_file
An object describing the photo.
owner_id Uuid
ID of its owner
owner_type String
The resource type of the owner. One of product_groups, bundles

Relationships

Photos have the following relationships:

Name Description
owner Product group, Product, Bundle
Associated Owner

Listing photos

How to fetch a list of photos:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "1801bd12-16f8-4460-8f32-05993a5546dc",
      "type": "photos",
      "attributes": {
        "created_at": "2024-11-18T09:25:54.192006+00:00",
        "updated_at": "2024-11-18T09:25:54.192006+00:00",
        "original_url": "/uploads/0cb126eba1b79a852db0cbfa01d5554e/photo/photo/1801bd12-16f8-4460-8f32-05993a5546dc/1731921954-541902778079392-0003-5651/upload.png",
        "large_url": "/uploads/0cb126eba1b79a852db0cbfa01d5554e/photo/photo/1801bd12-16f8-4460-8f32-05993a5546dc/large_1731921954-541902778079392-0003-5651/upload.jpg",
        "xlarge_url": "/uploads/0cb126eba1b79a852db0cbfa01d5554e/photo/photo/1801bd12-16f8-4460-8f32-05993a5546dc/xlarge_1731921954-541902778079392-0003-5651/upload.jpg",
        "coordinates": {
          "x": "0.00",
          "y": "0.00"
        },
        "preview": "iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABcVBMVEX///7+///////+//7//v///v7+/v7+/v/9/v73/f78/v7Z8v6H2/1g1/184v3P9f74+/602v5XuP01tvwvvvwoxfw80f2b6v7z/P7t8f6Zu/5VnP5Jof1Eqf0+sf03ufwvwPwtyf1x3v3h+P7k5f+Pnf9ihP5cjP5Wlf5PnP5Io/5Cq/08s/01u/wswvxY1P3S9P7k3P6Nf/JlYtxbZMxVachPb8xTgNxem/VRoP5FpP1Arf06tfwxvPxPzf3M8f7p4PmMadRgQ69YR6NSSaBQT6F1fLe7w93g6PfD2v57s/5NoP1Ep/0/r/1Uyf3Z8/76+PygechlM6RiOaJcPKFpVKutp9Lw8Pfy9v6szf5fpP5IoP1Dqf06sP13zv32/P7p3fF8OqtqKKFsNaWRcL7a0ur9/f7X5v6CtP5Rnv1Fov1NsP3a7/728fmtfsmcZ7/JsN328vn09/681f6Ctv6Ow/7v9/78+v37+fz6+/76/P7k06ScAAAAAWJLR0QCZgt8ZAAAAAd0SU1FB+gLEgkZNuBomkQAAAGRSURBVCjPNVIHVxYxENzb7F4+sCHNLk1RQVFQ7A1EARvYKKIiKNiwUKy/3pm9j7x395JMMmU3IlIUWiiGiKRCTS2JcKlAMDAXF3ETKZMkNyPKS/hwXLEhKblLhWigwelSp01g45XALOOCePxJTigQEDikcs4k9gpNajEVSinVchbhHIcKbNcaGsOtukMwTDCHljt27tq9p4Z8iRwW7KpZm/Y2t7S2te/brwDIKhFW5cDBQ4ePHO3o7OruqZzm0BU5drz3xMlTff2nzwycPUcPtCBZdHDo/IXhi5cuX7l67fqNm7dUk9FS1tsjo3fG7t4bn5i8/+Dho5bHU5pCR6efPH32/MXMLFZz8y8XXr1+swgLzPN2afnd+5XVUK59+Pjp85c11IrI12/ff6xXYc10Y3Pr5y+VMrz9/lPSOQsCgfLvP8Ylgqge3o2xWQ/84FjQJ60KrznXG1bgrOl287TeXq4Zx6LmxfZZIJDyDB3ja8laJuzyFURP8GpgghUnJRZsH42HHalaCwQ1dDbWLfF9+H+O8CGkTfhjrQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNC0xMS0xOFQwOToyNTo1NCswMDowMJNySPoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjQtMTEtMThUMDk6MjU6NTQrMDA6MDDiL/BGAAAAAElFTkSuQmCC",
        "position": 1,
        "photo": {
          "url": "/uploads/0cb126eba1b79a852db0cbfa01d5554e/photo/photo/1801bd12-16f8-4460-8f32-05993a5546dc/1731921954-541902778079392-0003-5651/upload.png"
        },
        "owner_id": "0c777599-0a6f-4441-a3a4-4e8f776c9489",
        "owner_type": "product_groups"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/photos

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
owner_id Uuid
eq, not_eq
owner_type String
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request does not accept any includes

Fetching a photo

How to fetch a photo:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/photos/268b2480-32ea-4227-8a20-1def794ec348' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "268b2480-32ea-4227-8a20-1def794ec348",
    "type": "photos",
    "attributes": {
      "created_at": "2024-11-18T09:25:56.279425+00:00",
      "updated_at": "2024-11-18T09:25:56.279425+00:00",
      "original_url": "/uploads/1d8cca8995fee2a3b4465cc368565740/photo/photo/268b2480-32ea-4227-8a20-1def794ec348/1731921956-354040716446413-0006-3021/upload.png",
      "large_url": "/uploads/1d8cca8995fee2a3b4465cc368565740/photo/photo/268b2480-32ea-4227-8a20-1def794ec348/large_1731921956-354040716446413-0006-3021/upload.jpg",
      "xlarge_url": "/uploads/1d8cca8995fee2a3b4465cc368565740/photo/photo/268b2480-32ea-4227-8a20-1def794ec348/xlarge_1731921956-354040716446413-0006-3021/upload.jpg",
      "coordinates": {
        "x": "0.00",
        "y": "0.00"
      },
      "preview": "iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABcVBMVEX///7+///////+//7//v///v7+/v7+/v/9/v73/f78/v7Z8v6H2/1g1/184v3P9f74+/602v5XuP01tvwvvvwoxfw80f2b6v7z/P7t8f6Zu/5VnP5Jof1Eqf0+sf03ufwvwPwtyf1x3v3h+P7k5f+Pnf9ihP5cjP5Wlf5PnP5Io/5Cq/08s/01u/wswvxY1P3S9P7k3P6Nf/JlYtxbZMxVachPb8xTgNxem/VRoP5FpP1Arf06tfwxvPxPzf3M8f7p4PmMadRgQ69YR6NSSaBQT6F1fLe7w93g6PfD2v57s/5NoP1Ep/0/r/1Uyf3Z8/76+PygechlM6RiOaJcPKFpVKutp9Lw8Pfy9v6szf5fpP5IoP1Dqf06sP13zv32/P7p3fF8OqtqKKFsNaWRcL7a0ur9/f7X5v6CtP5Rnv1Fov1NsP3a7/728fmtfsmcZ7/JsN328vn09/681f6Ctv6Ow/7v9/78+v37+fz6+/76/P7k06ScAAAAAWJLR0QCZgt8ZAAAAAd0SU1FB+gLEgkZOAfQt0MAAAGRSURBVCjPNVIHVxYxENzb7F4+sCHNLk1RQVFQ7A1EARvYKKIiKNiwUKy/3pm9j7x395JMMmU3IlIUWiiGiKRCTS2JcKlAMDAXF3ETKZMkNyPKS/hwXLEhKblLhWigwelSp01g45XALOOCePxJTigQEDikcs4k9gpNajEVSinVchbhHIcKbNcaGsOtukMwTDCHljt27tq9p4Z8iRwW7KpZm/Y2t7S2te/brwDIKhFW5cDBQ4ePHO3o7OruqZzm0BU5drz3xMlTff2nzwycPUcPtCBZdHDo/IXhi5cuX7l67fqNm7dUk9FS1tsjo3fG7t4bn5i8/+Dho5bHU5pCR6efPH32/MXMLFZz8y8XXr1+swgLzPN2afnd+5XVUK59+Pjp85c11IrI12/ff6xXYc10Y3Pr5y+VMrz9/lPSOQsCgfLvP8Ylgqge3o2xWQ/84FjQJ60KrznXG1bgrOl287TeXq4Zx6LmxfZZIJDyDB3ja8laJuzyFURP8GpgghUnJRZsH42HHalaCwQ1dDbWLfF9+H+O8CGkTfhjrQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNC0xMS0xOFQwOToyNTo1NiswMDowMATtWdMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjQtMTEtMThUMDk6MjU6NTYrMDA6MDB1sOFvAAAAAElFTkSuQmCC",
      "position": 1,
      "photo": {
        "url": "/uploads/1d8cca8995fee2a3b4465cc368565740/photo/photo/268b2480-32ea-4227-8a20-1def794ec348/1731921956-354040716446413-0006-3021/upload.png"
      },
      "owner_id": "77465390-cba4-4567-82b0-2431558b73c5",
      "owner_type": "product_groups"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/photos/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

owner

Creating a photo

How to create a photo:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/photos' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "photos",
        "attributes": {
          "owner_id": "3b5f0cad-cf1e-4e10-8cfe-910dc456e305",
          "owner_type": "product_groups",
          "photo_base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAAAXNSR0IArs4c6QAAFwJJREFUeF7tnX+MHsV5x5+9s7mzTXxnjO/8C2N+2wcGwgW3wY1rkahNRBJRIVCSNlEihJQgJY3SSqWNhCr1HyI1ilI1IqRKFJQmVSE/SgiYmIRE/lXXmACWsR0w4J/x+cfhc2zOd7bvtnrefed9Z+ed3Z2dndmd3X3uH8zd7uzM93k+8zzPzLz7er7v+0A/pAApIFXAI0DIM0iBaAUIEOe9AwO81+hl+1/hfxsbAv8AY42WuyECpNz2o95bVoAAsSwwNV9uBRQBodhbbjNT73UVUAREt3m6r1YKVHAezQ2QCmpXK9+3M9g0XpHmWnO9zQ0QcRXG3BCoJVLAngK5AmJvGC63rDPz6dzjsgbl7VtpASEXKo/TldlWpQVEzz3KbCpxxFUai7o18x51zQBRNwRdWTMFIsgjQGrmB2rDzXueVutV6qsMnM0hQFKrTjfEK1AiuBS6SoBU1d8VjF/VoZscFwFiUs2ktshpkxRy7u+FA0I+45xPWOlQWe1cOCBWrCE0Wlbj5KGNW8/QtZTufcmjrwUgyTLQFfoKhJ0z+D9bDmur3ejREyD6nkF35qVA/ly0RkaA5GVkek4pFSBASmk2hU4XOOsq9I67xO2OEiDprElX10wBAqRmBqfhplOg1oC4HdzTGZKutqNArQGxIym1WiUFCJAqWbNSY3EjvhMgCk7lhqkUOkqXGFeAADEuKTXoigImJjYCxBVrUj8MKmACjaA7BIhBsyQ1Zc5sSU9y9e/lU4AAcdWXqF9OKECAOGEGW50o34xtSwnddgkQXeXovlooQIDUwsw4yDJHk+L6ToCkBKQ4U7GOFt+DlJKV+vLcACGzuugnEVYhY7WMlRsgLroH9YkUSFKAAElSKOvfVWZjlWuy9sP0/WXss4YGBIiGaHRLfRQgQOpjaxqphgIEiIZoxd+Sb36T79OKV5fvAQHilj0q05vyQBXfUwKkSJdM5UWpLi5yVJV6NgFSKXPSYEwrQICYVpTaq5QCAiAUxitlXRpMZgUogmSWkBpwUgFDcz0B4qR1qVOuKFAwIIYwL0RNB/vuYJeMmKbAcRUMiBH5OhspUFBLI6JmC1KgmoDoiklg6SpX2fsIkMqalgZmYr4jQMiPSIEYBQiQWPcwMQeR/5VZAScBIbcss0tVq+9OAlItiVVGQ1OCikpFXEOA5Ko6gZBabuuS0XH31DahG0gBpkCtIoj1yYj8ypIChiyn0UytALFkPWq2wgoQIBU2Lg0tuwIESHYNrbWgkRFY60tdGyZA6mp5GreSAnJAaOpSEi/rRaMXAc5OAxyY8OGE78GJCRQ++FnQ68F1PQB9XQCXdgHMn5H1aVnur69DUATJ4jcp70UgjlwE2Hrah33jAPsnAXaN+3BxBsCMi+3G8P/xZ94sr/HfoV6A63sAVvR48L5ZAFdekvLBjl5eBuwcBqQM8ql5HoKx6R2AF0d9+Om4D11TnfdNdwe/8wMmGtCIPwyYu/sAPtALsHZu82K1btBVUQrEuJrDgJTZnoHiPBjPjLbTpynO+ae72uMUIYkChUUXBOVjcz24uVdfq+pMQ/oaxN1ZGUBcM/T2UYCnjvuw/kQbDDQED4QqKLJowoyKUeUz8wA+1e8VXKekcVDXrBXd98oAksY8Nq/FqPH0YYB/OzgNM8/LgeAhwb4wUMTfq6RdLJpgnfLxuR7c02dzdPVrmwAxaHOMGj/c78O2Uz50TbfhUAVCBopO2vU3/V5lCnmD5tFqigDRki18UyNq7AN49PA0zLgQ/I05Np9WqaRXptKuhwY8WDen6OXhcn91KNouDIix1NBYQwbc124TGDV+useHLafbtYas8Ga/i4ompusTrE2wiKdoks3+FEE09TtzDuAnBwD+4+1puGSy3cjFmdyqlGSFKgkUVYDS1CcYTWpTmxiem6sLiGGheI5Y1NjOrVCx/Qu8LgoSPvWSgRKVXkUV8vL6pHPg+UcTi+JrTmi6t2UHpDpaJGrIosaLbwK8Pj4dup45twoouvWJKihRy8Jr5nlwfx9tMCYamrsgOyBpnlbia98YAfjuPh9ePuKD16TA9/zwvgamV81SJA0oeaZd5dw3Kc5xCBAF7X/7NsCTuwHeHuMK8dbRkDAk/CyP/24dHeFqE7EgZxHFJCghQIVjKwgJ7pv83YJsu/AK0pX+EgIkxoSYUv1mD8C39/jQ3Tw/hY4nPx4SDQrvrHE1SlZQZP0KQSoBRbWAr1EmHfIIAiQCEEypfvYSwJbjsqgR3KQCCl9466Rd4nOyFvJifcIK+M9fVqajKvkFJgJEovWmPQBPvOjDkfPBH6OjhhySRprVHT6DlRUU1eVf3Y1GLOAp5ep0BgKE0wRTqh+/BPD0Xh+6m5/PEB076vStSjTh65O80i4+AvGrZ7Jj9RhNVFOu/ObwYp9EgDT1ZynVSweCmT9uxk4bUcTVrihQ+P2TNIW8ybSLUq4wkAQIALCUanQsEEfF4eIgca0+0Um7KOUKfKHWgLCU6rmdfuu4yFRz+TYOFFtpF6t32ByW9diKaoEfdWwFo8nXB2u2sSgs19UWEEypNmwH2PZmUG/wTs9DwoOSV9rFg6Kbdqn0W/b5E3H/pO51iWFAyrFavns/wE82+vDmsXC+yUMSrETJ/x4FCnOu1oYfd3/W/RPVaKIaNaIAivr8yecWelDHpWDDgBS74qDy9B2/A/jx/wKMNnfFL0jeEBIHilZ9gqd6vfauusqKl4vLwne/x4MvLqnOh7FUpvPaAIL1xgvbAH62w4eeic5VKlOglKU+Ud1XESPKTbM9eHh5fY6oOA6ICuPJcePsyQl4fGsv7HwVDxoG14vpEGtFBCVr2sWeZWP/JK/6RNw/QUg+uagenzFxHJCGewX5iebPyRGARzf4cGS/vAGxNsCrTEUTPs+XPYefnfNIu1TrE5VlYTyy8veDHnx+UN82mibN9bYSAKKvx943AL6/AeDc4faxj8lZne2pRhNx6Vcs5LXqE+6FcdGHDYVj9dyhQ53zXarpVRIoF2YGkNw7v7rnuCoLCBbj658HGD3lt9IpHg2ToEStdsXN2CZ34/mUEf+tuuKV5W0rjbF1B6nqR+d58I9XVBOSBECypTf6c7/+nawYf2FDu94QHYi1LoMkqj5Jm3bx0SZuWRgTlKmItyuqpF1iGscrpwOKShQU+8UgcXaFK4MbVyqCIBxbfwOwfqPfeGmbrJ4QDwniNSajiZh2qYAi3iMWxVlAkUHSgJLbozH1+fgb51RjhYvnqTKAND7c9AzApq3hY+ZsRhUjQN6gqMzMadOuINq5VZ+snFsNSJjflBiQNue4jLv+2V7Y/ooPMycBLvREp2g8KKqQsNZ0VrwKqU+8doSIKuLF+ijrpxn59hCSLy2uxhmuEgMSuC0u4z73pA+793ZCoQqKrEaJSrvEekKWxrGeuHS+S2W1ixXevLPrFvJVgaTUgDA49u0EOB/xpTIqkIyPH2n49MTkaIuyc+dPSsPQuXNHoWtgWftvPsDM7tmt/7+kb0nr3zP6F3a0oXJamK9botIuBrVKfaJ7bCUKlKh0Ufx9FSApLSAIx4bHfXh9X9gHo0BpzPTN1Ovddw/BWTgF3ul3YHzWNEydOhp6ly5eK+5Sy6IMe7LsWvxbT38AkndpP8yeuaDxb4Qmj7Qr6G8+9UlclJnsBfjecq+0X/ZTICD6a29RcPCo8KCcHzsIZ7vPwrnzx2H83SBahFZxhFO7fDtRzi+rX6Kuneqahu6mF4nQePPbUUZlZk5byKt+mlGcFGSRSfe1RFj3fefackJSICDSDCbxlwyOA7sAcHaK+jk73oZi8o9HOmdtCRT88qrYriooUdex9hAW/mf23OWtCDM9GE7J4vZP4l7xo5J2iWlcVDSUHd3XWRbOBxL9STfKj0oFCA+HOCAGCwPjzMjLoQ9BiVGj5bAGQEkTTRr9ECBhfWGw9C5dFRqeKih4E9vdbvxbugFpNu0SnxMXBW1CEqBRRkAM9TkJDgTjxNRbcPGdZgoV8bXJYv4fBU5cNBHTEebNOqAsW3wZXLmkHxYtmAODl89pgXFwrBfO9SyDQ6M+HD8b/Jp3ePvH6gPDJe7G466j8DI9PjqJfUZInhjqyvS9iolphsELrEYQQ2wA7nP8z3/1wKHtnSMfnT4I7xza1FjF8rkZkzeSTK+8QeGhWrK0H/701iVw4zUL4OahpfAeyQFKvB43P0dOA+z5A8DeowDbjgYnBPIAxeb+ybWXl2cz0SogJkBGJ9nxI4CXn223NjnbhzMnX4N3/VMwNnmgo75wARTZe6/W3LIMbnnvQrjz/ddHQhGl2ZkJgEMjAP93GOB3b/kwMh6+Uny7vO3Pn8QV8WK0k0UUhOTrV7v/6UTnAdn+BMDm/247w/mJE3B0ai+cGQ+DIYsIqqDI7tVJvWQFOqYUCMYH110dGy3STCb4wonN+zpBUU27rNcnCWkXe/5d8z34ynXyU8Cmso80usqubQLiSnfCXdz9PMBz327/7uT4Ljhx+lWYmhGct4pMk7jhiJDEpV6qaVfDwDFLwyydWn27WTBEA2YFJaqIT6p3WD8S65Nmyhu3T/KhJR7861XufujK2QiCn+fY/S2Ak2MAfNQQnUTVqVWjSSx4wsOjILnuhgH4sw8t10qldGY8fEvLL14LahT2ylRxIjC6f4KNN30668d+EZ4vL+2Czy7XGbn9e5wEBFesNn4NYP/BAI6DxzbAxGz5KV0mUZGgsIiCYAwPLYSPfvh6uPTymE0aC3bFWu2V/cFLt+Pqk6z7J600Dt/Swo1DNZrIohOmod8acnMj0TlAcMXq59/tgZHtHmBKdXLs1Y5PBLIUS+ZnuYPiA0zPALjtjmXw4F+vhcs7j19ZwCG6Sfa2yKRCXkx72P5JER/7Reg+MMeDr6xyr2h3DhAsyl94/AT8cfpYAw7+R1wZCoHC1R2qRbeJtOuaoQG4+54hYwW4KZpY2vXiofivYQgBwb2/S2WTUZbG6dYnCMlHFkQX7Um62KqinQLk9S0jsO17C2HHjh+2NqhUDg1GRRQb0YTVKJgWfOKvbi4knUpyFvZ39g1Zz+8KNhtd3z9BSL60zK16xBlAMLV69pHjsPn5TR0nabNAkqboVokoCN1tty2FtR+/FtYML1X11UKvY1/tgNEET7nIQIl6barsjS/t1xWpfe1cmvoEjwx9Z2UXrJ5fqGSthzsDyKYfvQ1Pfm1r6/yU8rENoVjMWp/IloVZKnHFvD4Y/siVcNc9N6fe6DNr7vQJhelowhYm4k4L4zUqH9QSP82IS79R+yNmdUxuzQlAcNXqsS88A8feGmsAgiuILHNWBSW2PuF0UK1PGsZtruNjn2653XLUSO/zydaVXKESTZhj29iNx7aTIgq+lO6rN3XB3QNaQwxuMqSnE4D8/BuvwK++/1pLDfF1n0qQNKnKAooMnkWDrkSNDM4i3CpGk0Y04M6xqe7Ih+7pbk5swoe0+EI+zfmu1fM9ePiW4t+1VTggfPQQXUALFCGsBwaK3kOJiig4y930/qXwwBfWFb50aw6NcEtx0UR07KhoIsIVVZ/ofOz3H27NGEUMCFc4IGL0kI0pb1AGFlcvakT5io1owtcnSdGJ9UuWdr1voPgoUigguHL1zQd+Daf2jMH5mFf18LMZE1SWdon5bdS1ccvCK9ZWO2pEgSJGkyTHzqM+QWi+Oay4omWo5hD1KRQQ3Pf49wd/3fp+wCRITIIiQjL/ivpEDd1oIupv9HwXd16Rjyb3X9MFn11hIFfSbKJQQDC92vhYuzjHMahAogqK6v7JXX+5Ev78/uHK1hppfSMpmpiuT+IK+TV9Hnx12CtsWb0wQDD3feqhLfDKL+Vf3GEbFDRK39VzHdnXSOvC9q+X1Sam066k9tiE+Y3VimmWBVkKAwTrj8fu+xUcO3w6tMQojtE0KDMuBF+Q8+G7VlDUUHAoFk1eOhBeCcy6LKyyG4/dQ1v9y1AXrLtKobOmLuHqGScAEWcS2ThVQFFZ7Zpzw1x44MHbYdFtC62EbUu1oinTa7WjEk3i0q6GfRO+KChuR/4zK4urQ5wBhFlOPIatE1FEUFio/ti9N8Kdn16R+2c1tLzSwZtktUlSmpRmtQvbkr0NUgcQUxNVGBBTrSoa9z//dgvsXC+vQeJACaIJfyCl84EICX66Dgv1O9Ysh9X3XQPXryn4wxqKurh8Gftg1s43ADZyX21nEhSEhLWHdnxkbQ1rEBQADyg+/c9bI/0hazQZvLof1t47BO/9i0UUNQxTF5V2mQbl2ku74JE7wUo6rCJJYSkWdg6PmTz+qV80CvW4n+RoEr4bwVi1dgnc8clbaelWxQsyXMNeHPHsruCdXSy9VX0bZNK3aX3iVq+++yBoF9wL2fxoeC8kyl5JEWXR4j5Y/sFFtDqVweF1b+U/wci/WTUtKPzm41X9Hnx5GOC6vDNjF1axmCFwufepf9oBr/72gLJtRNEZGKvWLaE6Q1lFwxf6AI2X2x0L3rDCPpzFnpJ2WRiXdx/6Ey/f5V2JJIWmWKw/mGr98uHNqSGZt5JSKcNubqQ5rE8QFPYWSPZuYdX6BOG4b7iI1KpzlcoJQFA4jCQv/GAvvPH04ciaBGchjBaDq+Y1VqUW39BvsPjOeQnPiCsmNBIzpLxGizUKe7cwvohbfCURjoDVLQjGsvke3DsEhUUOURdnAOFTrj/8fgz2bh+BC+NTcO74BMwa6IWBqy6DwStnGYYiDy+lZ6AC7EXcI6cA9o0CnBDWZVYsApg7D2B4YXErVjJLuQFIXtOZs75aTwEQGvyJert9vuaS28ANQPJVgp7mogKOzhEEiIvOQn1yRgEFQBxFW1XCkndfdZh0nR0FFACx82BqlRQogwIESBmsRH0sTIFqAkJpVWEO1X5wNYxQTUAccA/qQl4K2AWRALFmR7uG0+u2i33SG0ledxEgeSlNzymlAoYBoRnKihc4Jqtj3UkteZr+xwCSppnUfaQbSIFSKGA4gpRizNRJUkBZAQJEWaoKXEhJQWojEiCpJavLDTWmyaWP3NbF3Wic5VTAkQhierYy3V7JjFvD4dsasiOAlMwBXemuLa9wZXwO9IMAkRqBPM8B33SiC/kBUrjPFd4BJwxOnUinQH6ApOsXXa2gACGvIFLGSwiQjALS7dVWwCAgNJ9V21XqOTqDgNRTQBp1tRUgQKptXxpdRgUIkIwC0u3VVoAAqbZ9aXQZFSBAMgro8u20bJLFOoF6BEgWDeneyitAgFTexDTALAoQIFnUo3srrwABUnkTmxtgHWsaAsSc/zjRUvFOXHwPwGAXCBAn3Np+Jwz6jP3OWniC7vg7AdFtycKgqElSoGgFKIIUbQF6vr4COUzmBIi+eejOiijQ5qyTODuA5EA22ianx1TEDWgYOgrYAUSnJ3QPKeCgAu4CwoUHihQOek5NuuQuIDUxAA3TbQXqCQiFJCteWUVZPX/a98GzolfJGq2ieUtmgsTuqttI/cr4h9YzgiQagi4gBQIFCBDyBFIgRoFaAhKEX1NBuFNdey2TL+etQPkAqbL3VXlseXu2oeeVDxBDA69XM0Serr0JEF3l6L5aKECA1MLMNMhkBeRRlgBJVq74KyhDKswGdgGpkWFrNNTCnLWIB9sFpIgR0TNJAYMK5AsITbMGTUdN5aFAvoDkMaLaPINmmzxMTYDkoXLaZ5DvSxSzJUp8uzUExJbQaSmg68ugQA0BccEsFYG0IsOI8whv2vf9wj8OUgGhKzAEF2YO5/pAEcQ5k0R0iAgsxFIOA0IeUYhH0ENDCjgMCFnKLQWKm7CKezJ9ojC9DxZprfS9bd5Ryk5rj9bIjU3JKIIYUZMa0VHA9ic7dfok3kOAZFGRJuYs6pXi3v8HOZ5zbDYLrEsAAAAASUVORK5CYII=\n"
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "c308491a-72db-4e58-b630-3fe530466849",
    "type": "photos",
    "attributes": {
      "created_at": "2024-11-18T09:25:57.095549+00:00",
      "updated_at": "2024-11-18T09:25:57.095549+00:00",
      "original_url": "/uploads/6e174fd006395e4f16100c1b8470dbb0/photo/photo/c308491a-72db-4e58-b630-3fe530466849/1731921956-785262690585583-0008-5380/upload.png",
      "large_url": "/uploads/6e174fd006395e4f16100c1b8470dbb0/photo/photo/c308491a-72db-4e58-b630-3fe530466849/large_1731921956-785262690585583-0008-5380/upload.jpg",
      "xlarge_url": "/uploads/6e174fd006395e4f16100c1b8470dbb0/photo/photo/c308491a-72db-4e58-b630-3fe530466849/xlarge_1731921956-785262690585583-0008-5380/upload.jpg",
      "coordinates": {
        "x": 0,
        "y": 0
      },
      "preview": "iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABcVBMVEX///7+///////+//7//v///v7+/v7+/v/9/v73/f78/v7Z8v6H2/1g1/184v3P9f74+/602v5XuP01tvwvvvwoxfw80f2b6v7z/P7t8f6Zu/5VnP5Jof1Eqf0+sf03ufwvwPwtyf1x3v3h+P7k5f+Pnf9ihP5cjP5Wlf5PnP5Io/5Cq/08s/01u/wswvxY1P3S9P7k3P6Nf/JlYtxbZMxVachPb8xTgNxem/VRoP5FpP1Arf06tfwxvPxPzf3M8f7p4PmMadRgQ69YR6NSSaBQT6F1fLe7w93g6PfD2v57s/5NoP1Ep/0/r/1Uyf3Z8/76+PygechlM6RiOaJcPKFpVKutp9Lw8Pfy9v6szf5fpP5IoP1Dqf06sP13zv32/P7p3fF8OqtqKKFsNaWRcL7a0ur9/f7X5v6CtP5Rnv1Fov1NsP3a7/728fmtfsmcZ7/JsN328vn09/681f6Ctv6Ow/7v9/78+v37+fz6+/76/P7k06ScAAAAAWJLR0QCZgt8ZAAAAAd0SU1FB+gLEgkZOXDXh9UAAAGRSURBVCjPNVIHVxYxENzb7F4+sCHNLk1RQVFQ7A1EARvYKKIiKNiwUKy/3pm9j7x395JMMmU3IlIUWiiGiKRCTS2JcKlAMDAXF3ETKZMkNyPKS/hwXLEhKblLhWigwelSp01g45XALOOCePxJTigQEDikcs4k9gpNajEVSinVchbhHIcKbNcaGsOtukMwTDCHljt27tq9p4Z8iRwW7KpZm/Y2t7S2te/brwDIKhFW5cDBQ4ePHO3o7OruqZzm0BU5drz3xMlTff2nzwycPUcPtCBZdHDo/IXhi5cuX7l67fqNm7dUk9FS1tsjo3fG7t4bn5i8/+Dho5bHU5pCR6efPH32/MXMLFZz8y8XXr1+swgLzPN2afnd+5XVUK59+Pjp85c11IrI12/ff6xXYc10Y3Pr5y+VMrz9/lPSOQsCgfLvP8Ylgqge3o2xWQ/84FjQJ60KrznXG1bgrOl287TeXq4Zx6LmxfZZIJDyDB3ja8laJuzyFURP8GpgghUnJRZsH42HHalaCwQ1dDbWLfF9+H+O8CGkTfhjrQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNC0xMS0xOFQwOToyNTo1NiswMDowMATtWdMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjQtMTEtMThUMDk6MjU6NTYrMDA6MDB1sOFvAAAAAElFTkSuQmCC",
      "position": 2,
      "photo": {
        "url": "/uploads/6e174fd006395e4f16100c1b8470dbb0/photo/photo/c308491a-72db-4e58-b630-3fe530466849/1731921956-785262690585583-0008-5380/upload.png"
      },
      "owner_id": "3b5f0cad-cf1e-4e10-8cfe-910dc456e305",
      "owner_type": "product_groups"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/photos

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][photo_base64] String
Base64 encoded photo
data[attributes][remote_photo_url] String
Url to an image on the web
data[attributes][coordinates] Hash
Focalpoint coordinates ({ x: 10, y: 100 }). To ensure that a key part of an image stays visible, you can set the image's focal point. The focal point sets the focus of an image, giving you control over where the image is centered.
data[attributes][position] Integer
Which position the photo has in the album
data[attributes][photo] Carrierwave_file
An object describing the photo.
data[attributes][owner_id] Uuid
ID of its owner
data[attributes][owner_type] String
The resource type of the owner. One of product_groups, bundles

Includes

This request accepts the following includes:

owner

Updating a photo

How to update a photo:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/photos/4086b95f-a1d1-4df9-ba4f-0cf6d88aebf8' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "4086b95f-a1d1-4df9-ba4f-0cf6d88aebf8",
        "type": "photos",
        "attributes": {
          "coordinates": {
            "x": 10,
            "y": 100
          }
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "4086b95f-a1d1-4df9-ba4f-0cf6d88aebf8",
    "type": "photos",
    "attributes": {
      "created_at": "2024-11-18T09:25:54.860731+00:00",
      "updated_at": "2024-11-18T09:25:54.887707+00:00",
      "original_url": "/uploads/375787062cd92d7cfe8090f5cab0cf9b/photo/photo/4086b95f-a1d1-4df9-ba4f-0cf6d88aebf8/1731921954-679980257057762-0004-2487/upload.png",
      "large_url": "/uploads/375787062cd92d7cfe8090f5cab0cf9b/photo/photo/4086b95f-a1d1-4df9-ba4f-0cf6d88aebf8/large_1731921954-679980257057762-0004-2487/upload.jpg",
      "xlarge_url": "/uploads/375787062cd92d7cfe8090f5cab0cf9b/photo/photo/4086b95f-a1d1-4df9-ba4f-0cf6d88aebf8/xlarge_1731921954-679980257057762-0004-2487/upload.jpg",
      "coordinates": {
        "x": 10,
        "y": 100
      },
      "preview": "iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABcVBMVEX///7+///////+//7//v///v7+/v7+/v/9/v73/f78/v7Z8v6H2/1g1/184v3P9f74+/602v5XuP01tvwvvvwoxfw80f2b6v7z/P7t8f6Zu/5VnP5Jof1Eqf0+sf03ufwvwPwtyf1x3v3h+P7k5f+Pnf9ihP5cjP5Wlf5PnP5Io/5Cq/08s/01u/wswvxY1P3S9P7k3P6Nf/JlYtxbZMxVachPb8xTgNxem/VRoP5FpP1Arf06tfwxvPxPzf3M8f7p4PmMadRgQ69YR6NSSaBQT6F1fLe7w93g6PfD2v57s/5NoP1Ep/0/r/1Uyf3Z8/76+PygechlM6RiOaJcPKFpVKutp9Lw8Pfy9v6szf5fpP5IoP1Dqf06sP13zv32/P7p3fF8OqtqKKFsNaWRcL7a0ur9/f7X5v6CtP5Rnv1Fov1NsP3a7/728fmtfsmcZ7/JsN328vn09/681f6Ctv6Ow/7v9/78+v37+fz6+/76/P7k06ScAAAAAWJLR0QCZgt8ZAAAAAd0SU1FB+gLEgkZNuBomkQAAAGRSURBVCjPNVIHVxYxENzb7F4+sCHNLk1RQVFQ7A1EARvYKKIiKNiwUKy/3pm9j7x395JMMmU3IlIUWiiGiKRCTS2JcKlAMDAXF3ETKZMkNyPKS/hwXLEhKblLhWigwelSp01g45XALOOCePxJTigQEDikcs4k9gpNajEVSinVchbhHIcKbNcaGsOtukMwTDCHljt27tq9p4Z8iRwW7KpZm/Y2t7S2te/brwDIKhFW5cDBQ4ePHO3o7OruqZzm0BU5drz3xMlTff2nzwycPUcPtCBZdHDo/IXhi5cuX7l67fqNm7dUk9FS1tsjo3fG7t4bn5i8/+Dho5bHU5pCR6efPH32/MXMLFZz8y8XXr1+swgLzPN2afnd+5XVUK59+Pjp85c11IrI12/ff6xXYc10Y3Pr5y+VMrz9/lPSOQsCgfLvP8Ylgqge3o2xWQ/84FjQJ60KrznXG1bgrOl287TeXq4Zx6LmxfZZIJDyDB3ja8laJuzyFURP8GpgghUnJRZsH42HHalaCwQ1dDbWLfF9+H+O8CGkTfhjrQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNC0xMS0xOFQwOToyNTo1NCswMDowMJNySPoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjQtMTEtMThUMDk6MjU6NTQrMDA6MDDiL/BGAAAAAElFTkSuQmCC",
      "position": 1,
      "photo": {
        "url": "/uploads/375787062cd92d7cfe8090f5cab0cf9b/photo/photo/4086b95f-a1d1-4df9-ba4f-0cf6d88aebf8/1731921954-679980257057762-0004-2487/upload.png"
      },
      "owner_id": "c61966ce-155f-42b3-a03e-4f97c2590e36",
      "owner_type": "product_groups"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/photos/{id}

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][photo_base64] String
Base64 encoded photo
data[attributes][remote_photo_url] String
Url to an image on the web
data[attributes][coordinates] Hash
Focalpoint coordinates ({ x: 10, y: 100 }). To ensure that a key part of an image stays visible, you can set the image's focal point. The focal point sets the focus of an image, giving you control over where the image is centered.
data[attributes][position] Integer
Which position the photo has in the album
data[attributes][photo] Carrierwave_file
An object describing the photo.
data[attributes][owner_id] Uuid
ID of its owner
data[attributes][owner_type] String
The resource type of the owner. One of product_groups, bundles

Includes

This request accepts the following includes:

owner

Deleting a photo

How to delete a photo:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/photos/865a2f54-f69d-4315-874f-778ab6b216c6' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "865a2f54-f69d-4315-874f-778ab6b216c6",
    "type": "photos",
    "attributes": {
      "created_at": "2024-11-18T09:25:55.576937+00:00",
      "updated_at": "2024-11-18T09:25:55.576937+00:00",
      "original_url": "/uploads/3d82c7fce75b080c211b5f57726e4d56/photo/photo/865a2f54-f69d-4315-874f-778ab6b216c6/1731921955-21546757723301-0005-1442/upload.png",
      "large_url": "/uploads/3d82c7fce75b080c211b5f57726e4d56/photo/photo/865a2f54-f69d-4315-874f-778ab6b216c6/large_1731921955-21546757723301-0005-1442/upload.jpg",
      "xlarge_url": "/uploads/3d82c7fce75b080c211b5f57726e4d56/photo/photo/865a2f54-f69d-4315-874f-778ab6b216c6/xlarge_1731921955-21546757723301-0005-1442/upload.jpg",
      "coordinates": {
        "x": "0.00",
        "y": "0.00"
      },
      "preview": "iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABcVBMVEX///7+///////+//7//v///v7+/v7+/v/9/v73/f78/v7Z8v6H2/1g1/184v3P9f74+/602v5XuP01tvwvvvwoxfw80f2b6v7z/P7t8f6Zu/5VnP5Jof1Eqf0+sf03ufwvwPwtyf1x3v3h+P7k5f+Pnf9ihP5cjP5Wlf5PnP5Io/5Cq/08s/01u/wswvxY1P3S9P7k3P6Nf/JlYtxbZMxVachPb8xTgNxem/VRoP5FpP1Arf06tfwxvPxPzf3M8f7p4PmMadRgQ69YR6NSSaBQT6F1fLe7w93g6PfD2v57s/5NoP1Ep/0/r/1Uyf3Z8/76+PygechlM6RiOaJcPKFpVKutp9Lw8Pfy9v6szf5fpP5IoP1Dqf06sP13zv32/P7p3fF8OqtqKKFsNaWRcL7a0ur9/f7X5v6CtP5Rnv1Fov1NsP3a7/728fmtfsmcZ7/JsN328vn09/681f6Ctv6Ow/7v9/78+v37+fz6+/76/P7k06ScAAAAAWJLR0QCZgt8ZAAAAAd0SU1FB+gLEgkZN5dvqtIAAAGRSURBVCjPNVIHVxYxENzb7F4+sCHNLk1RQVFQ7A1EARvYKKIiKNiwUKy/3pm9j7x395JMMmU3IlIUWiiGiKRCTS2JcKlAMDAXF3ETKZMkNyPKS/hwXLEhKblLhWigwelSp01g45XALOOCePxJTigQEDikcs4k9gpNajEVSinVchbhHIcKbNcaGsOtukMwTDCHljt27tq9p4Z8iRwW7KpZm/Y2t7S2te/brwDIKhFW5cDBQ4ePHO3o7OruqZzm0BU5drz3xMlTff2nzwycPUcPtCBZdHDo/IXhi5cuX7l67fqNm7dUk9FS1tsjo3fG7t4bn5i8/+Dho5bHU5pCR6efPH32/MXMLFZz8y8XXr1+swgLzPN2afnd+5XVUK59+Pjp85c11IrI12/ff6xXYc10Y3Pr5y+VMrz9/lPSOQsCgfLvP8Ylgqge3o2xWQ/84FjQJ60KrznXG1bgrOl287TeXq4Zx6LmxfZZIJDyDB3ja8laJuzyFURP8GpgghUnJRZsH42HHalaCwQ1dDbWLfF9+H+O8CGkTfhjrQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNC0xMS0xOFQwOToyNTo1NSswMDowMDUFQ04AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjQtMTEtMThUMDk6MjU6NTUrMDA6MDBEWPvyAAAAAElFTkSuQmCC",
      "position": 1,
      "photo": {
        "url": "/uploads/3d82c7fce75b080c211b5f57726e4d56/photo/photo/865a2f54-f69d-4315-874f-778ab6b216c6/1731921955-21546757723301-0005-1442/upload.png"
      },
      "owner_id": "6936cfab-a2f0-48ab-914e-460cd5c9709c",
      "owner_type": "product_groups"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/photos/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Plannings

Plannings contain information about the quantitative planning of an item. An item can either be a product or a bundle. Planning (in combination with Stock counts) define when an item is available during a given period. Plannings are never directly created or updated through their resource; instead, they are always managed by booking items to an order, updating or deleting its associated line, or transitioning status.

Nested plannings contain information about individual items in a bundle. Note that nested plannings can not be deleted directly, the parent line should be deleted instead.

Endpoints

GET /api/boomerang/plannings

POST api/boomerang/plannings/search

GET /api/boomerang/plannings/{id}

Fields

Every planning has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
archived Boolean readonly
Whether planning is archived
archived_at Datetime nullable readonly
When the planning was archived
quantity Integer readonly
Total planned
starts_at Datetime readonly
When the start action is planned
stops_at Datetime readonly
When the stop action is planned
reserved_from Datetime readonly
When the items become unavailable
reserved_till Datetime readonly
When the items become available again
reserved Boolean readonly
Wheter items are reserved
started Integer readonly
Amount of items started. Cannot exceed quantity. This attribute is omitted when this is a parent planning for a Bundle.
stopped Integer readonly
Amount of items stopped. Cannot exceed quantity and started. This attribute is omitted when this is a parent planning for a Bundle.
location_shortage_amount Integer readonly
Amount of items short. This attribute is omitted when this is a parent planning for a Bundle.
shortage_amount Integer readonly
Amount of items short on location (could be there are still available on other locations in the same cluster). This attribute is omitted when this is a parent planning for a Bundle.
order_id Uuid readonly
Associated Order
item_id Uuid readonly
Associated Item
start_location_id Uuid readonly
Associated Start location
stop_location_id Uuid readonly
Associated Stop location
parent_planning_id Uuid readonly
Associated Parent planning

Relationships

Plannings have the following relationships:

Name Description
item Items readonly
Associated Item
nested_plannings Plannings readonly
Associated Nested plannings
order Orders readonly
Associated Order
order_line Lines readonly
Associated Order line
parent_planning Plannings readonly
Associated Parent planning
start_location Locations readonly
Associated Start location
stock_item_plannings Stock item plannings readonly
Associated Stock item plannings
stop_location Locations readonly
Associated Stop location

Listing plannings

How to fetch a list of plannings:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "8e1c2910-f0c2-483e-b9d5-60249d65ddb7",
      "type": "plannings",
      "attributes": {
        "created_at": "2024-11-18T09:23:07.785924+00:00",
        "updated_at": "2024-11-18T09:23:08.491051+00:00",
        "archived": false,
        "archived_at": null,
        "quantity": 1,
        "starts_at": "1980-04-01T12:00:00.000000+00:00",
        "stops_at": "1980-05-01T12:00:00.000000+00:00",
        "reserved_from": "1980-04-01T12:00:00.000000+00:00",
        "reserved_till": "1980-05-01T12:00:00.000000+00:00",
        "reserved": true,
        "started": 0,
        "stopped": 0,
        "location_shortage_amount": 0,
        "shortage_amount": 0,
        "order_id": "9726be0e-a9d5-4613-91ee-37f10e219c8e",
        "item_id": "84e1042d-15b8-46c3-8a30-c14201132ecf",
        "start_location_id": "f6da41dc-9f43-4b14-819c-9f355488b35b",
        "stop_location_id": "f6da41dc-9f43-4b14-819c-9f355488b35b",
        "parent_planning_id": null
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/plannings

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
quantity Integer
eq, not_eq, gt, gte, lt, lte
starts_at Datetime
eq, not_eq, gt, gte, lt, lte
stops_at Datetime
eq, not_eq, gt, gte, lt, lte
reserved_from Datetime
eq, not_eq, gt, gte, lt, lte
reserved_till Datetime
eq, not_eq, gt, gte, lt, lte
reserved Boolean
eq
started Integer
eq, not_eq, gt, gte, lt, lte
stopped Integer
eq, not_eq, gt, gte, lt, lte
location_shortage_amount Integer
eq, not_eq, gt, gte, lt, lte
shortage_amount Integer
eq, not_eq, gt, gte, lt, lte
order_id Uuid
eq, not_eq
item_id Uuid
eq, not_eq
start_location_id Uuid
eq, not_eq
stop_location_id Uuid
eq, not_eq
parent_planning_id Uuid
eq, not_eq
q String
eq
item_type String
eq, not_eq
product_type String
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

order

item => photo

order_line

start_location

stop_location

Searching plannings

Use advanced search to make logical filter groups with and/or operators.

How to search for plannings:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/plannings/search' \
    --header 'content-type: application/json' \
    --data '{
      "fields": {
        "plannings": "id"
      },
      "filter": {
        "conditions": {
          "operator": "or",
          "attributes": [
            {
              "operator": "and",
              "attributes": [
                {
                  "starts_at": {
                    "gte": "2024-11-19T09:23:05Z"
                  }
                },
                {
                  "starts_at": {
                    "lte": "2024-11-22T09:23:05Z"
                  }
                }
              ]
            },
            {
              "operator": "and",
              "attributes": [
                {
                  "stops_at": {
                    "gte": "2024-11-19T09:23:05Z"
                  }
                },
                {
                  "stops_at": {
                    "lte": "2024-11-22T09:23:05Z"
                  }
                }
              ]
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "3f936aa9-57ce-47de-87de-0bd418fbb0e0"
    },
    {
      "id": "2af258b6-cd8e-457f-81f7-b7c44bc9ce82"
    }
  ]
}

HTTP Request

POST api/boomerang/plannings/search

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
quantity Integer
eq, not_eq, gt, gte, lt, lte
starts_at Datetime
eq, not_eq, gt, gte, lt, lte
stops_at Datetime
eq, not_eq, gt, gte, lt, lte
reserved_from Datetime
eq, not_eq, gt, gte, lt, lte
reserved_till Datetime
eq, not_eq, gt, gte, lt, lte
reserved Boolean
eq
started Integer
eq, not_eq, gt, gte, lt, lte
stopped Integer
eq, not_eq, gt, gte, lt, lte
location_shortage_amount Integer
eq, not_eq, gt, gte, lt, lte
shortage_amount Integer
eq, not_eq, gt, gte, lt, lte
order_id Uuid
eq, not_eq
item_id Uuid
eq, not_eq
start_location_id Uuid
eq, not_eq
stop_location_id Uuid
eq, not_eq
parent_planning_id Uuid
eq, not_eq
q String
eq
item_type String
eq, not_eq
product_type String
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

order

item => photo

order_line

start_location

stop_location

Fetching a planning

How to fetch a planning:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/plannings/5bba73a9-1a51-4758-b178-9a984ea332d8' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "5bba73a9-1a51-4758-b178-9a984ea332d8",
    "type": "plannings",
    "attributes": {
      "created_at": "2024-11-18T09:22:58.399095+00:00",
      "updated_at": "2024-11-18T09:22:59.086068+00:00",
      "archived": false,
      "archived_at": null,
      "quantity": 1,
      "starts_at": "1980-04-01T12:00:00.000000+00:00",
      "stops_at": "1980-05-01T12:00:00.000000+00:00",
      "reserved_from": "1980-04-01T12:00:00.000000+00:00",
      "reserved_till": "1980-05-01T12:00:00.000000+00:00",
      "reserved": true,
      "started": 0,
      "stopped": 0,
      "location_shortage_amount": 0,
      "shortage_amount": 0,
      "order_id": "544d539b-a0de-44a7-a4dd-f33b488b42af",
      "item_id": "74b4c663-e088-4908-b4b1-b5d682d48c19",
      "start_location_id": "d184d70a-ac34-4828-b57a-d49c1a63b0f6",
      "stop_location_id": "d184d70a-ac34-4828-b57a-d49c1a63b0f6",
      "parent_planning_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/plannings/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=order,item,order_line
fields[] Array
List of comma seperated fields to include ?fields[plannings]=created_at,updated_at,archived

Includes

This request accepts the following includes:

order

item => photo

order_line

start_location

stop_location

parent_planning

nested_plannings

Price rules

A price rule contains a single pricing adjustment rule and belongs to a price ruleset.

A price rule can have one of these types:

and these match strategies:

as well as these adjustment strategies:

Endpoints

POST /api/boomerang/price_rules

PUT /api/boomerang/price_rules/{id}

DELETE /api/boomerang/price_rules/{id}

Fields

Every price rule has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
name String
Name of the rule
rule_type String
Determines rule behaviour. One of range_of_days, range_of_dates, exclude_date_range, exclude_week_days, pickup_day, return_day
match_strategy String
Determines how dates are matched to the rule. One of starts_within, stops_within, overlap, span, within
adjustment_strategy String
Determines wether a price rule adjusts prices by percentage or exact cent ammounts. One of percentage, charge
value Float
Adjustment value in percent
from Datetime
Defines start of period, used by range_of_dates rule type
till Datetime
Defines end of period, used by range_of_dates rule type
from_day Integer
Defines start of period in weekdays, 0 is monday, used by range_of_days rule type
till_day Integer
Defines end of period in weekdays, 0 is monday, used by range_of_days rule type
from_time String
Defines start of period time, used by range_of_days rule type. Format is a HH:mm string, independent of time display settings.
till_time String
Defines end of period time, used by range_of_days rule type. Format is a HH:mm string, independent of time display settings.
charge Boolean
Determines effect of rules using charge attribute
stacked Boolean
If a ruleset consists of multiple rules that adjust the product price, determines if rule should interact with other rules
time String
Defines time for adjustment, used by pickup_day and return_day rule types. Format is a HH:mm string, independent of time display settings.
min_duration Integer
Rule will only be applied when order period is greater than min duration in seconds
max_duration Integer
Rule will only be applied when order period is smaller than max duration in seconds
price_ruleset_id Uuid
Which ruleset this rule belongs to

Relationships

Price rules have the following relationships:

Name Description
price_ruleset Price rulesets readonly
Associated Price ruleset

Creating a price rule

How to create a price rule:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/price_rules' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "price_rules",
        "attributes": {
          "price_ruleset_id": "7258fb4e-4148-402c-8701-933b0e4192de",
          "name": "Off season",
          "rule_type": "range_of_dates",
          "match_strategy": "span",
          "value": 25,
          "from": "2024-10-18T09:27:24.601Z",
          "till": "2024-12-18T09:27:24.601Z"
        }
      },
      "include": "price_rules"
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "f02716cc-a48e-4c10-b45c-14634ef6bb56",
    "type": "price_rules",
    "attributes": {
      "created_at": "2024-11-18T09:27:24.617090+00:00",
      "updated_at": "2024-11-18T09:27:24.617090+00:00",
      "name": "Off season",
      "rule_type": "range_of_dates",
      "match_strategy": "span",
      "adjustment_strategy": "percentage",
      "value": 25.0,
      "from": "2024-10-18T09:27:24.601000+00:00",
      "till": "2024-12-18T09:27:24.601000+00:00",
      "from_day": null,
      "till_day": null,
      "from_time": null,
      "till_time": null,
      "charge": null,
      "stacked": false,
      "time": null,
      "min_duration": null,
      "max_duration": null,
      "price_ruleset_id": "7258fb4e-4148-402c-8701-933b0e4192de"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/price_rules

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=price_ruleset
fields[] Array
List of comma seperated fields to include ?fields[price_rules]=created_at,updated_at,name

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the rule
data[attributes][rule_type] String
Determines rule behaviour. One of range_of_days, range_of_dates, exclude_date_range, exclude_week_days, pickup_day, return_day
data[attributes][match_strategy] String
Determines how dates are matched to the rule. One of starts_within, stops_within, overlap, span, within
data[attributes][adjustment_strategy] String
Determines wether a price rule adjusts prices by percentage or exact cent ammounts. One of percentage, charge
data[attributes][value] Float
Adjustment value in percent
data[attributes][from] Datetime
Defines start of period, used by range_of_dates rule type
data[attributes][till] Datetime
Defines end of period, used by range_of_dates rule type
data[attributes][from_day] Integer
Defines start of period in weekdays, 0 is monday, used by range_of_days rule type
data[attributes][till_day] Integer
Defines end of period in weekdays, 0 is monday, used by range_of_days rule type
data[attributes][from_time] String
Defines start of period time, used by range_of_days rule type. Format is a HH:mm string, independent of time display settings.
data[attributes][till_time] String
Defines end of period time, used by range_of_days rule type. Format is a HH:mm string, independent of time display settings.
data[attributes][charge] Boolean
Determines effect of rules using charge attribute
data[attributes][stacked] Boolean
If a ruleset consists of multiple rules that adjust the product price, determines if rule should interact with other rules
data[attributes][time] String
Defines time for adjustment, used by pickup_day and return_day rule types. Format is a HH:mm string, independent of time display settings.
data[attributes][min_duration] Integer
Rule will only be applied when order period is greater than min duration in seconds
data[attributes][max_duration] Integer
Rule will only be applied when order period is smaller than max duration in seconds
data[attributes][price_ruleset_id] Uuid
Which ruleset this rule belongs to

Includes

This request accepts the following includes:

price_ruleset => price_rules

Updating a price rule

How to update a price rule:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/price_rules/c026403a-4d51-4fb8-8976-0f0a1854868b' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "c026403a-4d51-4fb8-8976-0f0a1854868b",
        "type": "price_rules",
        "attributes": {
          "value": 10
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "c026403a-4d51-4fb8-8976-0f0a1854868b",
    "type": "price_rules",
    "attributes": {
      "created_at": "2024-11-18T09:27:24.174953+00:00",
      "updated_at": "2024-11-18T09:27:24.194052+00:00",
      "name": "Holidays",
      "rule_type": "range_of_dates",
      "match_strategy": "span",
      "adjustment_strategy": "percentage",
      "value": 10.0,
      "from": "2030-12-01T00:00:00.000000+00:00",
      "till": "2031-01-31T00:00:00.000000+00:00",
      "from_day": null,
      "till_day": null,
      "from_time": null,
      "till_time": null,
      "charge": null,
      "stacked": false,
      "time": null,
      "min_duration": null,
      "max_duration": null,
      "price_ruleset_id": "02ca7e0c-6b07-49c1-8a1c-605b512b8def"
    },
    "relationships": {}
  },
  "meta": {}
}

Updating a price rule:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/price_rules/e8972236-c6c1-404e-9fea-f6f313e87c63' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "e8972236-c6c1-404e-9fea-f6f313e87c63",
        "type": "price_rules",
        "attributes": {
          "id": "e8972236-c6c1-404e-9fea-f6f313e87c63",
          "name": "Off season"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "e8972236-c6c1-404e-9fea-f6f313e87c63",
    "type": "price_rules",
    "attributes": {
      "created_at": "2024-11-18T09:27:23.760672+00:00",
      "updated_at": "2024-11-18T09:27:23.777888+00:00",
      "name": "Off season",
      "rule_type": "range_of_dates",
      "match_strategy": "span",
      "adjustment_strategy": "percentage",
      "value": 5.0,
      "from": "2030-12-01T00:00:00.000000+00:00",
      "till": "2031-01-31T00:00:00.000000+00:00",
      "from_day": null,
      "till_day": null,
      "from_time": null,
      "till_time": null,
      "charge": null,
      "stacked": false,
      "time": null,
      "min_duration": null,
      "max_duration": null,
      "price_ruleset_id": "630589ed-b962-464e-9893-4a7d19043476"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/price_rules/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=price_ruleset
fields[] Array
List of comma seperated fields to include ?fields[price_rules]=created_at,updated_at,name

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the rule
data[attributes][rule_type] String
Determines rule behaviour. One of range_of_days, range_of_dates, exclude_date_range, exclude_week_days, pickup_day, return_day
data[attributes][match_strategy] String
Determines how dates are matched to the rule. One of starts_within, stops_within, overlap, span, within
data[attributes][adjustment_strategy] String
Determines wether a price rule adjusts prices by percentage or exact cent ammounts. One of percentage, charge
data[attributes][value] Float
Adjustment value in percent
data[attributes][from] Datetime
Defines start of period, used by range_of_dates rule type
data[attributes][till] Datetime
Defines end of period, used by range_of_dates rule type
data[attributes][from_day] Integer
Defines start of period in weekdays, 0 is monday, used by range_of_days rule type
data[attributes][till_day] Integer
Defines end of period in weekdays, 0 is monday, used by range_of_days rule type
data[attributes][from_time] String
Defines start of period time, used by range_of_days rule type. Format is a HH:mm string, independent of time display settings.
data[attributes][till_time] String
Defines end of period time, used by range_of_days rule type. Format is a HH:mm string, independent of time display settings.
data[attributes][charge] Boolean
Determines effect of rules using charge attribute
data[attributes][stacked] Boolean
If a ruleset consists of multiple rules that adjust the product price, determines if rule should interact with other rules
data[attributes][time] String
Defines time for adjustment, used by pickup_day and return_day rule types. Format is a HH:mm string, independent of time display settings.
data[attributes][min_duration] Integer
Rule will only be applied when order period is greater than min duration in seconds
data[attributes][max_duration] Integer
Rule will only be applied when order period is smaller than max duration in seconds
data[attributes][price_ruleset_id] Uuid
Which ruleset this rule belongs to

Includes

This request accepts the following includes:

price_ruleset => price_rules

Archiving a price rule

How to archive a price ruleset:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/price_rules/d3748473-98b4-4872-8a10-1cd7f7b57d82' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "d3748473-98b4-4872-8a10-1cd7f7b57d82",
    "type": "price_rules",
    "attributes": {
      "created_at": "2024-11-18T09:27:23.355425+00:00",
      "updated_at": "2024-11-18T09:27:23.355425+00:00",
      "name": "Holidays",
      "rule_type": "range_of_dates",
      "match_strategy": "span",
      "adjustment_strategy": "percentage",
      "value": 5.0,
      "from": "2030-12-01T00:00:00.000000+00:00",
      "till": "2031-01-31T00:00:00.000000+00:00",
      "from_day": null,
      "till_day": null,
      "from_time": null,
      "till_time": null,
      "charge": null,
      "stacked": false,
      "time": null,
      "min_duration": null,
      "max_duration": null,
      "price_ruleset_id": "967bbcb3-37d1-49f3-bf0a-4692414a42e5"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/price_rules/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=price_ruleset
fields[] Array
List of comma seperated fields to include ?fields[price_rules]=created_at,updated_at,name

Includes

This request accepts the following includes:

price_ruleset => price_rules

Price rulesets

Price rulesets are used to create elaborate pricing adjustments using the advanced pricing feature.

Endpoints

GET /api/boomerang/price_rulesets

GET /api/boomerang/price_rulesets/{id}

POST /api/boomerang/price_rulesets

PUT /api/boomerang/price_rulesets/{id}

DELETE /api/boomerang/price_rulesets/{id}

Fields

Every price ruleset has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
archived Boolean readonly
Whether price ruleset is archived
archived_at Datetime readonly
When the price ruleset was archived
name String
Name of the ruleset
description String
Description of the ruleset
price_rules_attributes Array writeonly
Allows creating and updating price rules with their ruleset
make_name_unique Boolean writeonly
When true, a unique name will be generated when a PriceRuleset with the same name already exists.

Relationships

Price rulesets have the following relationships:

Name Description
price_rules Price rules readonly
Associated Price rules

Listing price rulesets

How to fetch price rulesets:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "6c4c2f49-9de3-440a-9c4b-89d252b2f977",
      "type": "price_rulesets",
      "attributes": {
        "created_at": "2024-11-18T09:23:12.039867+00:00",
        "updated_at": "2024-11-18T09:23:12.039867+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Ruleset",
        "description": null
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/price_rulesets

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
price_rules_attributes Array
eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request does not accept any includes

Fetching a price ruleset

How to fetch a single price ruleset with related price rules:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/price_rulesets/e9039a50-d25f-4fb6-9757-be9773b7dd1a?include=price_rules' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "e9039a50-d25f-4fb6-9757-be9773b7dd1a",
    "type": "price_rulesets",
    "attributes": {
      "created_at": "2024-11-18T09:23:12.734809+00:00",
      "updated_at": "2024-11-18T09:23:12.734809+00:00",
      "archived": false,
      "archived_at": null,
      "name": "Ruleset",
      "description": null
    },
    "relationships": {
      "price_rules": {
        "data": [
          {
            "type": "price_rules",
            "id": "87670754-44db-4ab9-a2b6-32469caffd1b"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "87670754-44db-4ab9-a2b6-32469caffd1b",
      "type": "price_rules",
      "attributes": {
        "created_at": "2024-11-18T09:23:12.738331+00:00",
        "updated_at": "2024-11-18T09:23:12.738331+00:00",
        "name": "Price rule",
        "rule_type": "range_of_dates",
        "match_strategy": "span",
        "adjustment_strategy": "percentage",
        "value": 30.0,
        "from": "2030-07-01T00:00:00.000000+00:00",
        "till": "2030-08-31T00:00:00.000000+00:00",
        "from_day": null,
        "till_day": null,
        "from_time": null,
        "till_time": null,
        "charge": null,
        "stacked": false,
        "time": null,
        "min_duration": null,
        "max_duration": null,
        "price_ruleset_id": "e9039a50-d25f-4fb6-9757-be9773b7dd1a"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/price_rulesets/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=price_rules
fields[] Array
List of comma seperated fields to include ?fields[price_rulesets]=created_at,updated_at,archived

Includes

This request accepts the following includes:

price_rules

Creating a price ruleset

How to create a price ruleset with price rules:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/price_rulesets' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "price_rulesets",
        "attributes": {
          "name": "Seasonal ruleset",
          "price_rules_attributes": [
            {
              "name": "Off season",
              "rule_type": "range_of_dates",
              "match_strategy": "span",
              "value": 25,
              "from": "2024-10-18T09:23:11.369Z",
              "till": "2024-12-18T09:23:11.369Z"
            }
          ]
        }
      },
      "include": "price_rules"
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "9fd920a3-8de6-48f6-95c7-41429f3da966",
    "type": "price_rulesets",
    "attributes": {
      "created_at": "2024-11-18T09:23:11.392323+00:00",
      "updated_at": "2024-11-18T09:23:11.392323+00:00",
      "archived": false,
      "archived_at": null,
      "name": "Seasonal ruleset",
      "description": null
    },
    "relationships": {
      "price_rules": {
        "data": [
          {
            "type": "price_rules",
            "id": "655be063-bbf5-44ca-b4db-52a6582ef14f"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "655be063-bbf5-44ca-b4db-52a6582ef14f",
      "type": "price_rules",
      "attributes": {
        "created_at": "2024-11-18T09:23:11.393938+00:00",
        "updated_at": "2024-11-18T09:23:11.393938+00:00",
        "name": "Off season",
        "rule_type": "range_of_dates",
        "match_strategy": "span",
        "adjustment_strategy": "percentage",
        "value": 25.0,
        "from": "2024-10-18T09:23:11.369000+00:00",
        "till": "2024-12-18T09:23:11.369000+00:00",
        "from_day": null,
        "till_day": null,
        "from_time": null,
        "till_time": null,
        "charge": null,
        "stacked": false,
        "time": null,
        "min_duration": null,
        "max_duration": null,
        "price_ruleset_id": "9fd920a3-8de6-48f6-95c7-41429f3da966"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

POST /api/boomerang/price_rulesets

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=price_rules
fields[] Array
List of comma seperated fields to include ?fields[price_rulesets]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the ruleset
data[attributes][price_rules_attributes][] Array
Allows creating and updating price rules with their ruleset
data[attributes][make_name_unique] Boolean
When true, a unique name will be generated when a PriceRuleset with the same name already exists.

Includes

This request accepts the following includes:

price_rules

Updating a price ruleset

How to update a price ruleset:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/price_rulesets/e53bc0d7-a03e-45ca-953e-4f2574265b22' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "e53bc0d7-a03e-45ca-953e-4f2574265b22",
        "type": "price_rulesets",
        "attributes": {
          "name": "Seasonal ruleset (old)"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "e53bc0d7-a03e-45ca-953e-4f2574265b22",
    "type": "price_rulesets",
    "attributes": {
      "created_at": "2024-11-18T09:23:10.774531+00:00",
      "updated_at": "2024-11-18T09:23:10.796446+00:00",
      "archived": false,
      "archived_at": null,
      "name": "Seasonal ruleset (old)",
      "description": null
    },
    "relationships": {}
  },
  "meta": {}
}

Updating a price ruleset's price rules:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/price_rulesets/36ce3aca-a77b-4cc2-ba99-522844818000' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "36ce3aca-a77b-4cc2-ba99-522844818000",
        "type": "price_rulesets",
        "attributes": {
          "price_rules_attributes": [
            {
              "id": "a4e0ec86-0153-4c27-8e21-980e13d0387e",
              "name": "Off season"
            }
          ]
        }
      },
      "include": "price_rules"
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "36ce3aca-a77b-4cc2-ba99-522844818000",
    "type": "price_rulesets",
    "attributes": {
      "created_at": "2024-11-18T09:23:10.199321+00:00",
      "updated_at": "2024-11-18T09:23:10.199321+00:00",
      "archived": false,
      "archived_at": null,
      "name": "Ruleset",
      "description": null
    },
    "relationships": {
      "price_rules": {
        "data": [
          {
            "type": "price_rules",
            "id": "a4e0ec86-0153-4c27-8e21-980e13d0387e"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "a4e0ec86-0153-4c27-8e21-980e13d0387e",
      "type": "price_rules",
      "attributes": {
        "created_at": "2024-11-18T09:23:10.201570+00:00",
        "updated_at": "2024-11-18T09:23:10.239760+00:00",
        "name": "Off season",
        "rule_type": "range_of_dates",
        "match_strategy": "span",
        "adjustment_strategy": "percentage",
        "value": 30.0,
        "from": "2030-07-01T00:00:00.000000+00:00",
        "till": "2030-08-31T00:00:00.000000+00:00",
        "from_day": null,
        "till_day": null,
        "from_time": null,
        "till_time": null,
        "charge": null,
        "stacked": false,
        "time": null,
        "min_duration": null,
        "max_duration": null,
        "price_ruleset_id": "36ce3aca-a77b-4cc2-ba99-522844818000"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

PUT /api/boomerang/price_rulesets/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=price_rules
fields[] Array
List of comma seperated fields to include ?fields[price_rulesets]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the ruleset
data[attributes][price_rules_attributes][] Array
Allows creating and updating price rules with their ruleset
data[attributes][make_name_unique] Boolean
When true, a unique name will be generated when a PriceRuleset with the same name already exists.

Includes

This request accepts the following includes:

price_rules

Archiving a price ruleset

How to archive a price ruleset:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/price_rulesets/c9587b9b-c32d-43b6-ab61-ae1a42de2347' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "c9587b9b-c32d-43b6-ab61-ae1a42de2347",
    "type": "price_rulesets",
    "attributes": {
      "created_at": "2024-11-18T09:23:09.547625+00:00",
      "updated_at": "2024-11-18T09:23:09.580535+00:00",
      "archived": true,
      "archived_at": "2024-11-18T09:23:09.580535+00:00",
      "name": "Ruleset",
      "description": null
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/price_rulesets/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Price structures

Price structures enable you to control what is being priced for a specific period. Price structures consist of tiles that represent a period. The actual charge that is being calculated will always round up to the nearest tile it can find. You can also set up a flat-fee structure after you've run out of tiles by setting one of the following values: hour, day, week, month, year.

There are two kinds of price structures:

  1. reusable: Structures that are reusable and that can be assigned to multiple product groups.
  2. private: Structure for a specific product group. These are automatically created when a product group its price_type is set to private_structure.

Endpoints

GET /api/boomerang/price_structures

GET /api/boomerang/price_structures/{id}

POST /api/boomerang/price_structures

PUT /api/boomerang/price_structures/{id}

DELETE /api/boomerang/price_structures/{id}

Fields

Every price structure has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
archived Boolean readonly
Whether price structure is archived
archived_at Datetime readonly
When the price structure was archived
name String
Name of the structure
price_structure_type String readonly
One of reusable, private
price_tiles_attributes Array writeonly
The price tiles to associate
product_group_id Uuid readonly
The associated product group for private price structure type
hour Float
Multiplier for every hour outside of its tiles
day Float
Multiplier for every day outside of its tiles
week Float
Multiplier for every week outside of its tiles
month Float
Multiplier for every month outside of its tiles
year Float
Multiplier for every year outside of its tiles

Relationships

Price structures have the following relationships:

Name Description
price_tiles Price tiles readonly
Associated Price tiles

Listing price structures

How to fetch a list of price structures:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "2ace9526-5aa3-44cb-b295-cb64a1fc02fe",
      "type": "price_structures",
      "attributes": {
        "created_at": "2024-11-18T09:24:23.324797+00:00",
        "updated_at": "2024-11-18T09:24:23.329069+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Price per hour (3 hours minimum)",
        "price_structure_type": "reusable",
        "product_group_id": null,
        "hour": 1.0,
        "day": 0.0,
        "week": 0.0,
        "month": 0.0,
        "year": 0.0
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/price_structures

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
price_structure_type String
eq, not_eq
product_group_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request does not accept any includes

Fetching a price structure

How to fetch a price structure with it's tiles:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/price_structures/bebc2d55-3d4f-4fc4-9767-6eed60312258?include=price_tiles' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "bebc2d55-3d4f-4fc4-9767-6eed60312258",
    "type": "price_structures",
    "attributes": {
      "created_at": "2024-11-18T09:24:24.211414+00:00",
      "updated_at": "2024-11-18T09:24:24.215799+00:00",
      "archived": false,
      "archived_at": null,
      "name": "Price per hour (3 hours minimum)",
      "price_structure_type": "reusable",
      "product_group_id": null,
      "hour": 1.0,
      "day": 0.0,
      "week": 0.0,
      "month": 0.0,
      "year": 0.0
    },
    "relationships": {
      "price_tiles": {
        "data": [
          {
            "type": "price_tiles",
            "id": "e7d70829-8597-40dd-b882-1dfa65022629"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "e7d70829-8597-40dd-b882-1dfa65022629",
      "type": "price_tiles",
      "attributes": {
        "created_at": "2024-11-18T09:24:24.213787+00:00",
        "updated_at": "2024-11-18T09:24:24.213787+00:00",
        "name": "3 hours",
        "quantity": 3,
        "length": 10800,
        "multiplier": 1.0,
        "period": "hours",
        "price_structure_id": "bebc2d55-3d4f-4fc4-9767-6eed60312258"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/price_structures/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=price_tiles
fields[] Array
List of comma seperated fields to include ?fields[price_structures]=created_at,updated_at,archived

Includes

This request accepts the following includes:

price_tiles

Creating a price structure

How to create a price structure with price tiles:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/price_structures' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "price_structures",
        "attributes": {
          "name": "Price per hour (3 hours minimum)",
          "hour": 1,
          "price_tiles_attributes": [
            {
              "name": "3 hours",
              "quantity": 3,
              "period": "hours",
              "multiplier": 1
            }
          ]
        }
      },
      "include": "price_tiles"
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "dc53c01c-6d4b-47aa-a14b-788b8e349b6c",
    "type": "price_structures",
    "attributes": {
      "created_at": "2024-11-18T09:24:22.892660+00:00",
      "updated_at": "2024-11-18T09:24:22.897032+00:00",
      "archived": false,
      "archived_at": null,
      "name": "Price per hour (3 hours minimum)",
      "price_structure_type": "reusable",
      "product_group_id": null,
      "hour": 1.0,
      "day": 0.0,
      "week": 0.0,
      "month": 0.0,
      "year": 0.0
    },
    "relationships": {
      "price_tiles": {
        "data": [
          {
            "type": "price_tiles",
            "id": "a844ab26-822d-4b03-8700-e33bd25593b0"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "a844ab26-822d-4b03-8700-e33bd25593b0",
      "type": "price_tiles",
      "attributes": {
        "created_at": "2024-11-18T09:24:22.894891+00:00",
        "updated_at": "2024-11-18T09:24:22.894891+00:00",
        "name": "3 hours",
        "quantity": 3,
        "length": 10800,
        "multiplier": 1.0,
        "period": "hours",
        "price_structure_id": "dc53c01c-6d4b-47aa-a14b-788b8e349b6c"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

POST /api/boomerang/price_structures

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=price_tiles
fields[] Array
List of comma seperated fields to include ?fields[price_structures]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the structure
data[attributes][price_tiles_attributes][] Array
The price tiles to associate
data[attributes][hour] Float
Multiplier for every hour outside of its tiles
data[attributes][day] Float
Multiplier for every day outside of its tiles
data[attributes][week] Float
Multiplier for every week outside of its tiles
data[attributes][month] Float
Multiplier for every month outside of its tiles
data[attributes][year] Float
Multiplier for every year outside of its tiles

Includes

This request accepts the following includes:

price_tiles

Updating a price structure

How to update a price structure with price tiles:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/price_structures/505664e8-f1e0-45ed-b0d0-69226655f56c' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "505664e8-f1e0-45ed-b0d0-69226655f56c",
        "type": "price_structures",
        "attributes": {
          "name": "Charge per week (cut-rate > 3 weeks)",
          "price_tiles_attributes": [
            {
              "id": "4c95b08d-4ab8-46e4-b946-d9294db67eb0",
              "name": "1 semana"
            },
            {
              "id": "c7caa4b1-154b-4a1a-8d69-eb6fcac0803f",
              "name": "2 semanas"
            },
            {
              "id": "bbe1e191-e286-4c35-8f40-7796866d3bb6",
              "name": "3 semanas"
            },
            {
              "id": "fd31cccd-1314-4a2b-9dd4-a634034571f8",
              "_destroy": true
            }
          ]
        }
      },
      "include": "price_tiles"
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "505664e8-f1e0-45ed-b0d0-69226655f56c",
    "type": "price_structures",
    "attributes": {
      "created_at": "2024-11-18T09:24:24.680707+00:00",
      "updated_at": "2024-11-18T09:24:24.745874+00:00",
      "archived": false,
      "archived_at": null,
      "name": "Charge per week (cut-rate > 3 weeks)",
      "price_structure_type": "reusable",
      "product_group_id": null,
      "hour": 0.0,
      "day": 0.0,
      "week": 0.8,
      "month": 0.0,
      "year": 0.0
    },
    "relationships": {
      "price_tiles": {
        "data": [
          {
            "type": "price_tiles",
            "id": "4c95b08d-4ab8-46e4-b946-d9294db67eb0"
          },
          {
            "type": "price_tiles",
            "id": "c7caa4b1-154b-4a1a-8d69-eb6fcac0803f"
          },
          {
            "type": "price_tiles",
            "id": "bbe1e191-e286-4c35-8f40-7796866d3bb6"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "4c95b08d-4ab8-46e4-b946-d9294db67eb0",
      "type": "price_tiles",
      "attributes": {
        "created_at": "2024-11-18T09:24:24.684271+00:00",
        "updated_at": "2024-11-18T09:24:24.740285+00:00",
        "name": "1 semana",
        "quantity": 1,
        "length": 604800,
        "multiplier": 1.0,
        "period": "weeks",
        "price_structure_id": "505664e8-f1e0-45ed-b0d0-69226655f56c"
      },
      "relationships": {}
    },
    {
      "id": "c7caa4b1-154b-4a1a-8d69-eb6fcac0803f",
      "type": "price_tiles",
      "attributes": {
        "created_at": "2024-11-18T09:24:24.688268+00:00",
        "updated_at": "2024-11-18T09:24:24.742377+00:00",
        "name": "2 semanas",
        "quantity": 2,
        "length": 1209600,
        "multiplier": 2.0,
        "period": "weeks",
        "price_structure_id": "505664e8-f1e0-45ed-b0d0-69226655f56c"
      },
      "relationships": {}
    },
    {
      "id": "bbe1e191-e286-4c35-8f40-7796866d3bb6",
      "type": "price_tiles",
      "attributes": {
        "created_at": "2024-11-18T09:24:24.691682+00:00",
        "updated_at": "2024-11-18T09:24:24.744273+00:00",
        "name": "3 semanas",
        "quantity": 3,
        "length": 1814400,
        "multiplier": 3.0,
        "period": "weeks",
        "price_structure_id": "505664e8-f1e0-45ed-b0d0-69226655f56c"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

PUT /api/boomerang/price_structures/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=price_tiles
fields[] Array
List of comma seperated fields to include ?fields[price_structures]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the structure
data[attributes][price_tiles_attributes][] Array
The price tiles to associate
data[attributes][hour] Float
Multiplier for every hour outside of its tiles
data[attributes][day] Float
Multiplier for every day outside of its tiles
data[attributes][week] Float
Multiplier for every week outside of its tiles
data[attributes][month] Float
Multiplier for every month outside of its tiles
data[attributes][year] Float
Multiplier for every year outside of its tiles

Includes

This request accepts the following includes:

price_tiles

Deleting a price structure

How to delete a price structure with tax rates:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/price_structures/c7e45d37-509a-4e02-9662-973c9f2090e4' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "c7e45d37-509a-4e02-9662-973c9f2090e4",
    "type": "price_structures",
    "attributes": {
      "created_at": "2024-11-18T09:24:23.755859+00:00",
      "updated_at": "2024-11-18T09:24:23.778325+00:00",
      "archived": true,
      "archived_at": "2024-11-18T09:24:23.778325+00:00",
      "name": "Price per hour (3 hours minimum) (Deleted)",
      "price_structure_type": "reusable",
      "product_group_id": null,
      "hour": 1.0,
      "day": 0.0,
      "week": 0.0,
      "month": 0.0,
      "year": 0.0
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/price_structures/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Price tiles

Price tiles hold information on how to calculate a price for a specific period. According to the charge_length, a tile will be picked in price calculations. Note that Booqable always rounds up to the highest tile it can find. The base price of a product is multiplied by the multiplier.

Endpoints

GET /api/boomerang/price_tiles

GET /api/boomerang/price_tiles/{id}

POST /api/boomerang/price_tiles

PUT /api/boomerang/price_tiles/{id}

DELETE /api/boomerang/price_tiles/{id}

Fields

Every price tile has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
name String
Name of the tile as it's going to be used in charge labels
quantity Integer
Used in combination with period (e.g. 3 with period days)
length Integer readonly
Length in seconds (is computed based on quantity and period)
multiplier Float
The amount to multiply a product's base price with (e.g. 2.8 for three days).
period String
One of hours, days, weeks, months, years
price_structure_id Uuid
Associated Price structure

Relationships

Price tiles have the following relationships:

Name Description
price_structure Price structures readonly
Associated Price structure

Listing price tiles

How to fetch a list of price tiles:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "f725a611-ed0b-409a-b1c2-637b734c8c40",
      "type": "price_tiles",
      "attributes": {
        "created_at": "2024-11-18T09:26:45.248016+00:00",
        "updated_at": "2024-11-18T09:26:45.248016+00:00",
        "name": "3 hours",
        "quantity": 3,
        "length": 10800,
        "multiplier": 3.0,
        "period": "hours",
        "price_structure_id": "dbec53ca-4238-4838-97c7-9d2e7d9edbda"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/price_tiles

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
price_structure_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request does not accept any includes

Fetching a price tile

How to fetch a price tile:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/price_tiles/eb6d1364-d199-41a6-92a2-126e2e2edb44?include=price_tiles' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "eb6d1364-d199-41a6-92a2-126e2e2edb44",
    "type": "price_tiles",
    "attributes": {
      "created_at": "2024-11-18T09:26:45.686175+00:00",
      "updated_at": "2024-11-18T09:26:45.686175+00:00",
      "name": "3 hours",
      "quantity": 3,
      "length": 10800,
      "multiplier": 3.0,
      "period": "hours",
      "price_structure_id": "ac389339-65a4-4171-90bc-f57ed99bdad2"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/price_tiles/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=price_structure
fields[] Array
List of comma seperated fields to include ?fields[price_tiles]=created_at,updated_at,name

Includes

This request accepts the following includes:

price_structure

Creating a price tile

How to create a price tile:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/price_tiles' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "price_tiles",
        "attributes": {
          "price_structure_id": "e5c099c0-8c67-4cb8-b174-15bbdaeb2e13",
          "name": "3 hours",
          "quantity": 3,
          "period": "hours",
          "multiplier": 3
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "11e40c53-c751-4a0b-9a5c-31294c6733d0",
    "type": "price_tiles",
    "attributes": {
      "created_at": "2024-11-18T09:26:46.140102+00:00",
      "updated_at": "2024-11-18T09:26:46.140102+00:00",
      "name": "3 hours",
      "quantity": 3,
      "length": 10800,
      "multiplier": 3.0,
      "period": "hours",
      "price_structure_id": "e5c099c0-8c67-4cb8-b174-15bbdaeb2e13"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/price_tiles

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=price_structure
fields[] Array
List of comma seperated fields to include ?fields[price_tiles]=created_at,updated_at,name

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the tile as it's going to be used in charge labels
data[attributes][quantity] Integer
Used in combination with period (e.g. 3 with period days)
data[attributes][multiplier] Float
The amount to multiply a product's base price with (e.g. 2.8 for three days).
data[attributes][period] String
One of hours, days, weeks, months, years
data[attributes][price_structure_id] Uuid
Associated Price structure

Includes

This request accepts the following includes:

price_structure

Updating a price tile

How to update a price tile:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/price_tiles/b392f310-441a-4cce-ba60-23c071a97be8' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "b392f310-441a-4cce-ba60-23c071a97be8",
        "type": "price_tiles",
        "attributes": {
          "name": "4 days",
          "quantity": 4,
          "period": "days",
          "multiplier": 4
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "b392f310-441a-4cce-ba60-23c071a97be8",
    "type": "price_tiles",
    "attributes": {
      "created_at": "2024-11-18T09:26:46.993682+00:00",
      "updated_at": "2024-11-18T09:26:47.012286+00:00",
      "name": "4 days",
      "quantity": 4,
      "length": 345600,
      "multiplier": 4.0,
      "period": "days",
      "price_structure_id": "9bfcc5db-6192-4ce9-9b6d-f903284908b7"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/price_tiles/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=price_structure
fields[] Array
List of comma seperated fields to include ?fields[price_tiles]=created_at,updated_at,name

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the tile as it's going to be used in charge labels
data[attributes][quantity] Integer
Used in combination with period (e.g. 3 with period days)
data[attributes][multiplier] Float
The amount to multiply a product's base price with (e.g. 2.8 for three days).
data[attributes][period] String
One of hours, days, weeks, months, years
data[attributes][price_structure_id] Uuid
Associated Price structure

Includes

This request accepts the following includes:

price_structure

Deleting a price tile

How to delete a price tile:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/price_tiles/6ea1cd16-e16b-433a-951e-993f5dda7062' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "6ea1cd16-e16b-433a-951e-993f5dda7062",
    "type": "price_tiles",
    "attributes": {
      "created_at": "2024-11-18T09:26:46.564816+00:00",
      "updated_at": "2024-11-18T09:26:46.564816+00:00",
      "name": "3 hours",
      "quantity": 3,
      "length": 10800,
      "multiplier": 3.0,
      "period": "hours",
      "price_structure_id": "c0cff345-cfe4-4e2c-8629-3c8d870d5099"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/price_tiles/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Product groups

Product groups hold general information and configuration about products. A product group is always associated with at least one product. When a product group is enabled to have variations, it can have multiple products. Note that product groups are not plannable on orders.

A product group supports the following product types:

The following tracking types can be defined:

Pricing can be configured by setting one of the following price types:

Endpoints

GET /api/boomerang/product_groups

POST api/boomerang/product_groups/search

GET /api/boomerang/product_groups/{id}

POST /api/boomerang/product_groups

PUT /api/boomerang/product_groups/{id}

DELETE /api/boomerang/product_groups/{id}

Fields

Every product group has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
archived Boolean readonly
Whether item is archived
archived_at Datetime nullable readonly
When the item was archived
type String readonly
One of product_groups, products, bundles
name String
Name of the item
group_name String readonly
The name of the ProductGroup, if this is a Product that is one of the variations in the group.
slug String
Slug of the item
sku String
Stock keeping unit
lead_time Integer
The amount of seconds the item should be unavailable before a reservation
lag_time Integer
The amount of seconds the item should be unavailable after a reservation
product_type String
One of rental, consumable, service
tracking_type String
Tracking type (One of none, bulk, trackable, can only be set on creating ProductGroups)
trackable Boolean
Whether stock items are tracked
has_variations Boolean
Whether variations are enabled. Not applicable for product_type service
variation Boolean
Whether this Item is a variation in a ProductGroup.
extra_information String nullable
Extra information about the item, shown on orders and documents
photo_url String readonly
Main photo url
description String nullable
Description used in the online store
excerpt String
Excerpt used in the online store
show_in_store Boolean
Whether to show this item in the online
sorting_weight Integer
Defines sort order in the online store, the lower the weight - the higher it shows up in lists
base_price_in_cents Integer readonly
The value that is being calculated with (based on the current price_type)
price_type String
One of structure, private_structure, fixed, simple, none
price_period String
One of hour, day, week, month (Only used for price type simple)
deposit_in_cents Integer
The value to use for deposit calculations
discountable Boolean
Whether discounts should be applied to this item (note that price rules will still apply)
taxable Boolean
Whether item is taxable
seo_title String
SEO title tag
seo_description String
SEO meta description tag
tag_list Array
List of tags
properties Hash readonly
Key value pairs of associated properties
photo_id Uuid readonly
Associated Photo
tax_category_id Uuid
Associated Tax category
price_ruleset_id Uuid
Associated Price ruleset
price_structure_id Uuid
Associated Price structure
allow_shortage Boolean
Whether shortages are allowed
shortage_limit Integer
The maximum allowed shortage for any date range
variation_fields Array
Array of fields that distinguish variations (e.g. color or size)
flat_fee_price_in_cents Integer
Use this value when price type is simple
structure_price_in_cents Integer
Use this value when price type is structure or private_structure
properties_attributes Array writeonly
Create or update multiple properties associated with this product group
stock_item_properties Array
Available properties for stock items
confirm_shortage Boolean writeonly
Whether to confirm the shortage (over limit by changing shortage_limit)
remote_photo_url String writeonly
Url to an image on the web
photo_base64 String writeonly
Base64 encoded photo, use this field to store a main photo

Relationships

Product groups have the following relationships:

Name Description
inventory_levels Inventory levels readonly
Associated Inventory levels
photo Photos readonly
Associated Photo
price_ruleset Price rulesets readonly
Associated Price ruleset
price_structure Price structures readonly
Associated Price structure
products Products readonly
Associated Products
properties Properties readonly
Associated Properties
tax_category Tax categories readonly
Associated Tax category

Listing product groups

How to fetch a list of product groups:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "01e4bbd3-03eb-486c-9ca9-dff9808c04bf",
      "type": "product_groups",
      "attributes": {
        "created_at": "2024-11-18T09:27:16.338140+00:00",
        "updated_at": "2024-11-18T09:27:16.347504+00:00",
        "archived": false,
        "archived_at": null,
        "type": "product_groups",
        "name": "iPad Pro",
        "group_name": null,
        "slug": "ipad-pro",
        "sku": "SKU",
        "lead_time": 0,
        "lag_time": 0,
        "product_type": "rental",
        "tracking_type": "bulk",
        "trackable": false,
        "has_variations": false,
        "variation": false,
        "extra_information": null,
        "photo_url": null,
        "description": null,
        "excerpt": null,
        "show_in_store": true,
        "sorting_weight": 0,
        "base_price_in_cents": 0,
        "price_type": "simple",
        "price_period": "day",
        "deposit_in_cents": 0,
        "discountable": true,
        "taxable": true,
        "seo_title": null,
        "seo_description": null,
        "tag_list": [],
        "properties": {},
        "photo_id": null,
        "tax_category_id": null,
        "price_ruleset_id": null,
        "price_structure_id": null,
        "allow_shortage": false,
        "shortage_limit": 0,
        "variation_fields": [],
        "flat_fee_price_in_cents": 0,
        "structure_price_in_cents": 0,
        "stock_item_properties": []
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/product_groups

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq, gt
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
type String
eq, not_eq
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
group_name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
slug String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
sku String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
lead_time Integer
eq, not_eq, gt, gte, lt, lte
lag_time Integer
eq, not_eq, gt, gte, lt, lte
product_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
tracking_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
trackable Boolean
eq
has_variations Boolean
eq
variation Boolean
eq
extra_information String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
description String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
excerpt String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
show_in_store Boolean
eq
sorting_weight Integer
eq, not_eq, gt, gte, lt, lte
base_price_in_cents Integer
eq, not_eq, gt, gte, lt, lte
price_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
price_period String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
deposit_in_cents Integer
eq, not_eq, gt, gte, lt, lte
discountable Boolean
eq
taxable Boolean
eq
seo_title String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
seo_description String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
tag_list String
eq
tax_category_id Uuid
eq, not_eq
price_ruleset_id Uuid
eq, not_eq
price_structure_id Uuid
eq, not_eq
q String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
collection_id Uuid
eq, not_eq
product_group_id Uuid
eq
allow_shortage Boolean
eq
shortage_limit Integer
eq, not_eq, gt, gte, lt, lte
flat_fee_price_in_cents Integer
eq, not_eq, gt, gte, lt, lte
structure_price_in_cents Integer
eq, not_eq, gt, gte, lt, lte
photo_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count
archived Array
count
tag_list Array
count
taxable Array
count
discountable Array
count
product_type Array
count
tracking_type Array
count
show_in_store Array
count
price_type Array
count
price_period Array
count
tax_category_id Array
count
deposit_in_cents Array
sum, maximum, minimum, average
base_price_in_cents Array
sum, maximum, minimum, average

Includes

This request accepts the following includes:

photo

properties

Searching product groups

Use advanced search to make logical filter groups with and/or operators.

How to search for product groups:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/product_groups/search' \
    --header 'content-type: application/json' \
    --data '{
      "fields": {
        "product_groups": "id"
      },
      "filter": {
        "conditions": {
          "operator": "or",
          "attributes": [
            {
              "operator": "and",
              "attributes": [
                {
                  "discountable": true
                },
                {
                  "taxable": true
                }
              ]
            },
            {
              "operator": "and",
              "attributes": [
                {
                  "show_in_store": true
                },
                {
                  "taxable": true
                }
              ]
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "6d7c728a-4347-4a2e-9be0-90e9c7b2d65f"
    },
    {
      "id": "66966493-68fc-4923-bba2-a4067b30f803"
    },
    {
      "id": "53733dfb-8d29-4e1c-bdd0-dca863401367"
    }
  ]
}

HTTP Request

POST api/boomerang/product_groups/search

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq, gt
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
type String
eq, not_eq
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
group_name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
slug String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
sku String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
lead_time Integer
eq, not_eq, gt, gte, lt, lte
lag_time Integer
eq, not_eq, gt, gte, lt, lte
product_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
tracking_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
trackable Boolean
eq
has_variations Boolean
eq
variation Boolean
eq
extra_information String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
description String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
excerpt String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
show_in_store Boolean
eq
sorting_weight Integer
eq, not_eq, gt, gte, lt, lte
base_price_in_cents Integer
eq, not_eq, gt, gte, lt, lte
price_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
price_period String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
deposit_in_cents Integer
eq, not_eq, gt, gte, lt, lte
discountable Boolean
eq
taxable Boolean
eq
seo_title String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
seo_description String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
tag_list String
eq
tax_category_id Uuid
eq, not_eq
price_ruleset_id Uuid
eq, not_eq
price_structure_id Uuid
eq, not_eq
q String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
collection_id Uuid
eq, not_eq
product_group_id Uuid
eq
allow_shortage Boolean
eq
shortage_limit Integer
eq, not_eq, gt, gte, lt, lte
flat_fee_price_in_cents Integer
eq, not_eq, gt, gte, lt, lte
structure_price_in_cents Integer
eq, not_eq, gt, gte, lt, lte
photo_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count
archived Array
count
tag_list Array
count
taxable Array
count
discountable Array
count
product_type Array
count
tracking_type Array
count
show_in_store Array
count
price_type Array
count
price_period Array
count
tax_category_id Array
count
deposit_in_cents Array
sum, maximum, minimum, average
base_price_in_cents Array
sum, maximum, minimum, average

Includes

This request accepts the following includes:

photo

properties

Fetching a product group

How to fetch a product group:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/product_groups/6bfd7e96-290a-47fd-b6f4-c6666573be76' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "6bfd7e96-290a-47fd-b6f4-c6666573be76",
    "type": "product_groups",
    "attributes": {
      "created_at": "2024-11-18T09:27:16.996410+00:00",
      "updated_at": "2024-11-18T09:27:17.005451+00:00",
      "archived": false,
      "archived_at": null,
      "type": "product_groups",
      "name": "iPad Pro",
      "group_name": null,
      "slug": "ipad-pro",
      "sku": "SKU",
      "lead_time": 0,
      "lag_time": 0,
      "product_type": "rental",
      "tracking_type": "bulk",
      "trackable": false,
      "has_variations": false,
      "variation": false,
      "extra_information": null,
      "photo_url": null,
      "description": null,
      "excerpt": null,
      "show_in_store": true,
      "sorting_weight": 0,
      "base_price_in_cents": 0,
      "price_type": "simple",
      "price_period": "day",
      "deposit_in_cents": 0,
      "discountable": true,
      "taxable": true,
      "seo_title": null,
      "seo_description": null,
      "tag_list": [],
      "properties": {},
      "photo_id": null,
      "tax_category_id": null,
      "price_ruleset_id": null,
      "price_structure_id": null,
      "allow_shortage": false,
      "shortage_limit": 0,
      "variation_fields": [],
      "flat_fee_price_in_cents": 0,
      "structure_price_in_cents": 0,
      "stock_item_properties": []
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/product_groups/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

photo

properties

tax_category

barcode

products

price_structure => price_tiles

Creating a product group

How to create a product group:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/product_groups' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "product_groups",
        "attributes": {
          "name": "iPad mini",
          "tracking_type": "trackable",
          "trackable": true,
          "price_type": "simple",
          "price_period": "day",
          "tag_list": [
            "tablets",
            "apple"
          ]
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "cc07cabe-565b-4566-8295-ee03a2b271a3",
    "type": "product_groups",
    "attributes": {
      "created_at": "2024-11-18T09:27:20.245114+00:00",
      "updated_at": "2024-11-18T09:27:20.245114+00:00",
      "archived": false,
      "archived_at": null,
      "type": "product_groups",
      "name": "iPad mini",
      "group_name": null,
      "slug": "ipad-mini",
      "sku": "IPAD_MINI",
      "lead_time": 0,
      "lag_time": 0,
      "product_type": "rental",
      "tracking_type": "trackable",
      "trackable": true,
      "has_variations": false,
      "variation": false,
      "extra_information": null,
      "photo_url": null,
      "description": null,
      "excerpt": null,
      "show_in_store": true,
      "sorting_weight": 0,
      "base_price_in_cents": 0,
      "price_type": "simple",
      "price_period": "day",
      "deposit_in_cents": 0,
      "discountable": true,
      "taxable": true,
      "seo_title": null,
      "seo_description": null,
      "tag_list": [
        "tablets",
        "apple"
      ],
      "properties": {},
      "photo_id": null,
      "tax_category_id": null,
      "price_ruleset_id": null,
      "price_structure_id": null,
      "allow_shortage": false,
      "shortage_limit": 0,
      "variation_fields": [],
      "flat_fee_price_in_cents": 0,
      "structure_price_in_cents": 0,
      "stock_item_properties": []
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/product_groups

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the item
data[attributes][slug] String
Slug of the item
data[attributes][sku] String
Stock keeping unit
data[attributes][lead_time] Integer
The amount of seconds the item should be unavailable before a reservation
data[attributes][lag_time] Integer
The amount of seconds the item should be unavailable after a reservation
data[attributes][product_type] String
One of rental, consumable, service
data[attributes][tracking_type] String
Tracking type (One of none, bulk, trackable, can only be set on creating ProductGroups)
data[attributes][trackable] Boolean
Whether stock items are tracked
data[attributes][has_variations] Boolean
Whether variations are enabled. Not applicable for product_type service
data[attributes][variation] Boolean
Whether this Item is a variation in a ProductGroup.
data[attributes][extra_information] String
Extra information about the item, shown on orders and documents
data[attributes][excerpt] String
Excerpt used in the online store
data[attributes][show_in_store] Boolean
Whether to show this item in the online
data[attributes][sorting_weight] Integer
Defines sort order in the online store, the lower the weight - the higher it shows up in lists
data[attributes][price_type] String
One of structure, private_structure, fixed, simple, none
data[attributes][price_period] String
One of hour, day, week, month (Only used for price type simple)
data[attributes][deposit_in_cents] Integer
The value to use for deposit calculations
data[attributes][discountable] Boolean
Whether discounts should be applied to this item (note that price rules will still apply)
data[attributes][taxable] Boolean
Whether item is taxable
data[attributes][seo_title] String
SEO title tag
data[attributes][seo_description] String
SEO meta description tag
data[attributes][tag_list][] Array
List of tags
data[attributes][tax_category_id] Uuid
Associated Tax category
data[attributes][price_ruleset_id] Uuid
Associated Price ruleset
data[attributes][price_structure_id] Uuid
Associated Price structure
data[attributes][allow_shortage] Boolean
Whether shortages are allowed
data[attributes][shortage_limit] Integer
The maximum allowed shortage for any date range
data[attributes][variation_fields][] Array
Array of fields that distinguish variations (e.g. color or size)
data[attributes][flat_fee_price_in_cents] Integer
Use this value when price type is simple
data[attributes][structure_price_in_cents] Integer
Use this value when price type is structure or private_structure
data[attributes][properties_attributes][] Array
Create or update multiple properties associated with this product group
data[attributes][stock_item_properties][] Array
Available properties for stock items
data[attributes][confirm_shortage] Boolean
Whether to confirm the shortage (over limit by changing shortage_limit)
data[attributes][remote_photo_url] String
Url to an image on the web
data[attributes][photo_base64] String
Base64 encoded photo, use this field to store a main photo

Includes

This request accepts the following includes:

photo

properties

tax_category

barcode

price_structure => price_tiles

Updating a product group

How to update a product group:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/product_groups/f023c10a-b952-4217-bb77-b7f9b9dc3558' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "f023c10a-b952-4217-bb77-b7f9b9dc3558",
        "type": "product_groups",
        "attributes": {
          "name": "iPad mini"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "f023c10a-b952-4217-bb77-b7f9b9dc3558",
    "type": "product_groups",
    "attributes": {
      "created_at": "2024-11-18T09:27:19.185964+00:00",
      "updated_at": "2024-11-18T09:27:19.437848+00:00",
      "archived": false,
      "archived_at": null,
      "type": "product_groups",
      "name": "iPad mini",
      "group_name": null,
      "slug": "ipad-mini",
      "sku": "SKU",
      "lead_time": 0,
      "lag_time": 0,
      "product_type": "rental",
      "tracking_type": "bulk",
      "trackable": false,
      "has_variations": false,
      "variation": false,
      "extra_information": null,
      "photo_url": null,
      "description": null,
      "excerpt": null,
      "show_in_store": true,
      "sorting_weight": 0,
      "base_price_in_cents": 0,
      "price_type": "simple",
      "price_period": "day",
      "deposit_in_cents": 0,
      "discountable": true,
      "taxable": true,
      "seo_title": null,
      "seo_description": null,
      "tag_list": [],
      "properties": {},
      "photo_id": null,
      "tax_category_id": null,
      "price_ruleset_id": null,
      "price_structure_id": null,
      "allow_shortage": false,
      "shortage_limit": 0,
      "variation_fields": [],
      "flat_fee_price_in_cents": 0,
      "structure_price_in_cents": 0,
      "stock_item_properties": []
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/product_groups/{id}

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the item
data[attributes][slug] String
Slug of the item
data[attributes][sku] String
Stock keeping unit
data[attributes][lead_time] Integer
The amount of seconds the item should be unavailable before a reservation
data[attributes][lag_time] Integer
The amount of seconds the item should be unavailable after a reservation
data[attributes][product_type] String
One of rental, consumable, service
data[attributes][tracking_type] String
Tracking type (One of none, bulk, trackable, can only be set on creating ProductGroups)
data[attributes][trackable] Boolean
Whether stock items are tracked
data[attributes][has_variations] Boolean
Whether variations are enabled. Not applicable for product_type service
data[attributes][variation] Boolean
Whether this Item is a variation in a ProductGroup.
data[attributes][extra_information] String
Extra information about the item, shown on orders and documents
data[attributes][excerpt] String
Excerpt used in the online store
data[attributes][show_in_store] Boolean
Whether to show this item in the online
data[attributes][sorting_weight] Integer
Defines sort order in the online store, the lower the weight - the higher it shows up in lists
data[attributes][price_type] String
One of structure, private_structure, fixed, simple, none
data[attributes][price_period] String
One of hour, day, week, month (Only used for price type simple)
data[attributes][deposit_in_cents] Integer
The value to use for deposit calculations
data[attributes][discountable] Boolean
Whether discounts should be applied to this item (note that price rules will still apply)
data[attributes][taxable] Boolean
Whether item is taxable
data[attributes][seo_title] String
SEO title tag
data[attributes][seo_description] String
SEO meta description tag
data[attributes][tag_list][] Array
List of tags
data[attributes][tax_category_id] Uuid
Associated Tax category
data[attributes][price_ruleset_id] Uuid
Associated Price ruleset
data[attributes][price_structure_id] Uuid
Associated Price structure
data[attributes][allow_shortage] Boolean
Whether shortages are allowed
data[attributes][shortage_limit] Integer
The maximum allowed shortage for any date range
data[attributes][variation_fields][] Array
Array of fields that distinguish variations (e.g. color or size)
data[attributes][flat_fee_price_in_cents] Integer
Use this value when price type is simple
data[attributes][structure_price_in_cents] Integer
Use this value when price type is structure or private_structure
data[attributes][properties_attributes][] Array
Create or update multiple properties associated with this product group
data[attributes][stock_item_properties][] Array
Available properties for stock items
data[attributes][confirm_shortage] Boolean
Whether to confirm the shortage (over limit by changing shortage_limit)
data[attributes][remote_photo_url] String
Url to an image on the web
data[attributes][photo_base64] String
Base64 encoded photo, use this field to store a main photo

Includes

This request accepts the following includes:

photo

properties

tax_category

barcode

price_structure => price_tiles

Archiving a product group

How to delete a product group:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/product_groups/0bb56781-68aa-4ff5-bce3-d66f994d66ef' \
    --header 'content-type: application/json' \
    --data '{}'

A 200 status response looks like this:

  {
  "data": {
    "id": "0bb56781-68aa-4ff5-bce3-d66f994d66ef",
    "type": "product_groups",
    "attributes": {
      "created_at": "2024-11-18T09:27:20.818441+00:00",
      "updated_at": "2024-11-18T09:27:21.050010+00:00",
      "archived": true,
      "archived_at": "2024-11-18T09:27:21.050010+00:00",
      "type": "product_groups",
      "name": "iPad Pro",
      "group_name": null,
      "slug": "ipad-pro-archived-0bb56781-68aa-4ff5-bce3-d66f994d66ef",
      "sku": "SKU",
      "lead_time": 0,
      "lag_time": 0,
      "product_type": "rental",
      "tracking_type": "bulk",
      "trackable": false,
      "has_variations": false,
      "variation": false,
      "extra_information": null,
      "photo_url": null,
      "description": null,
      "excerpt": null,
      "show_in_store": true,
      "sorting_weight": 0,
      "base_price_in_cents": 0,
      "price_type": "simple",
      "price_period": "day",
      "deposit_in_cents": 0,
      "discountable": true,
      "taxable": true,
      "seo_title": null,
      "seo_description": null,
      "tag_list": [],
      "properties": {},
      "photo_id": null,
      "tax_category_id": null,
      "price_ruleset_id": null,
      "price_structure_id": null,
      "allow_shortage": false,
      "shortage_limit": 0,
      "variation_fields": [],
      "flat_fee_price_in_cents": 0,
      "structure_price_in_cents": 0,
      "stock_item_properties": []
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/product_groups/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Products

Products are items that are plannable on orders. They always belong to a product group and can only be created separately if the group has variations enabled.

Most of the settings are inherited from the associated product group. When the group has variations enabled, the base_price_in_cents field is not inherited from the group anymore but can be set individually.

Endpoints

GET /api/boomerang/products

POST api/boomerang/products/search

GET /api/boomerang/products/{id}

POST /api/boomerang/products

PUT /api/boomerang/products/{id}

DELETE /api/boomerang/products/{id}

Fields

Every product has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
archived Boolean readonly
Whether item is archived
archived_at Datetime nullable readonly
When the item was archived
type String readonly
One of product_groups, products, bundles
name String readonly
Name of the item (based on product group and variations_values)
group_name String readonly
The name of the ProductGroup, if this is a Product that is one of the variations in the group.
slug String
Slug of the item
sku String
Stock keeping unit
lead_time Integer readonly
Inherited from product group: The amount of seconds the item should be unavailable before a reservation
lag_time Integer readonly
Inherited from product group: The amount of seconds the item should be unavailable after a reservation
product_type String readonly
Inherited from product group: One of rental, consumable, service
tracking_type String readonly
Inherited from product group: Tracking type (One of none, bulk, trackable, can only be set on creating ProductGroups)
trackable Boolean readonly
Inherited from product group: Whether stock items are tracked
has_variations Boolean
Whether variations are enabled. Not applicable for product_type service
variation Boolean readonly
Whether this Item is a variation in a ProductGroup.
extra_information String readonly
Inherited from product group: Extra information about the item, shown on orders and documents
photo_url String readonly
Main photo url
description String readonly
Inherited from product group: Description used in the online store
excerpt String
Excerpt used in the online store
show_in_store Boolean readonly
Inherited from product group: Whether to show this item in the online
sorting_weight Integer
Defines sorting weight within its associated product group, the lower the weight - the higher it shows up in lists
base_price_in_cents Integer
The value that is being calculated with. This value is writable if group has variations enabled, otherwise it's inherited from the group
price_type String readonly
Inherited from product group: One of structure, private_structure, fixed, simple, none
price_period String readonly
Inherited from product group: One of hour, day, week, month (Only used for price type simple)
deposit_in_cents Integer
The value to use for deposit calculations
discountable Boolean readonly
Inherited from product group: Whether discounts should be applied to this item (note that price rules will still apply)
taxable Boolean readonly
Inherited from product group: Whether item is taxable
seo_title String
SEO title tag
seo_description String
SEO meta description tag
tag_list Array readonly
Inherited from product group: List of tags
properties Hash readonly
Inherited from product group: Key value pairs of associated properties
photo_id Uuid
Associated Photo
tax_category_id Uuid readonly
Associated Tax category
price_ruleset_id Uuid readonly
Associated Price ruleset
price_structure_id Uuid readonly
Associated Price structure
product_group_id Uuid
Associated Product group
variation_values Array
List of values for product_group.variation_fields (Should be in the same order)
allow_shortage Boolean readonly
Inherited from product group: Whether shortages are allowed
shortage_limit Integer readonly
Inherited from product group: The maximum allowed shortage for any date range
confirm_shortage Boolean writeonly
Whether to confirm the shortage (over limit by changing shortage_limit)

Relationships

Products have the following relationships:

Name Description
barcode Barcodes
Associated Barcode
inventory_levels Inventory levels readonly
Associated Inventory levels
photo Photos readonly
Associated Photo
price_ruleset Price rulesets readonly
Associated Price ruleset
price_structure Price structures readonly
Associated Price structure
product_group Product groups readonly
Associated Product group
properties Properties readonly
Associated Properties
tax_category Tax categories readonly
Associated Tax category

Listing products

How to fetch a list of products:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "acaacb60-a9c7-4277-82a7-c5afa7bdc725",
      "type": "products",
      "attributes": {
        "created_at": "2024-11-18T09:28:06.681258+00:00",
        "updated_at": "2024-11-18T09:28:06.886229+00:00",
        "archived": false,
        "archived_at": null,
        "type": "products",
        "name": "iPad Pro",
        "group_name": "iPad Pro",
        "slug": "ipad-pro",
        "sku": null,
        "lead_time": 0,
        "lag_time": 0,
        "product_type": "rental",
        "tracking_type": "bulk",
        "trackable": false,
        "has_variations": true,
        "variation": true,
        "extra_information": null,
        "photo_url": null,
        "description": null,
        "excerpt": null,
        "show_in_store": true,
        "sorting_weight": 1,
        "base_price_in_cents": 0,
        "price_type": "simple",
        "price_period": "day",
        "deposit_in_cents": 0,
        "discountable": true,
        "taxable": true,
        "seo_title": null,
        "seo_description": null,
        "tag_list": [],
        "properties": {},
        "photo_id": null,
        "tax_category_id": null,
        "price_ruleset_id": null,
        "price_structure_id": null,
        "variation_values": [
          "green"
        ],
        "allow_shortage": false,
        "shortage_limit": 0,
        "product_group_id": "f38564b2-9c8c-4293-8e44-6ea781347e5e"
      },
      "relationships": {}
    },
    {
      "id": "6ea4485f-2e7c-43fc-9830-3dab07dc097a",
      "type": "products",
      "attributes": {
        "created_at": "2024-11-18T09:28:06.970712+00:00",
        "updated_at": "2024-11-18T09:28:06.970712+00:00",
        "archived": false,
        "archived_at": null,
        "type": "products",
        "name": "iPad Pro - blue",
        "group_name": "iPad Pro",
        "slug": "ipad-pro-blue",
        "sku": "PRODUCT 1000078",
        "lead_time": 0,
        "lag_time": 0,
        "product_type": "rental",
        "tracking_type": "bulk",
        "trackable": false,
        "has_variations": true,
        "variation": true,
        "extra_information": null,
        "photo_url": null,
        "description": null,
        "excerpt": null,
        "show_in_store": true,
        "sorting_weight": 2,
        "base_price_in_cents": 0,
        "price_type": "simple",
        "price_period": "day",
        "deposit_in_cents": 0,
        "discountable": true,
        "taxable": true,
        "seo_title": null,
        "seo_description": null,
        "tag_list": [],
        "properties": {},
        "photo_id": null,
        "tax_category_id": null,
        "price_ruleset_id": null,
        "price_structure_id": null,
        "variation_values": [
          "blue"
        ],
        "allow_shortage": false,
        "shortage_limit": 0,
        "product_group_id": "f38564b2-9c8c-4293-8e44-6ea781347e5e"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/products

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq, gt
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
type String
eq, not_eq
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
group_name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
slug String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
sku String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
lead_time Integer
eq, not_eq, gt, gte, lt, lte
lag_time Integer
eq, not_eq, gt, gte, lt, lte
product_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
tracking_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
trackable Boolean
eq
has_variations Boolean
eq
variation Boolean
eq
extra_information String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
description String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
excerpt String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
show_in_store Boolean
eq
sorting_weight Integer
eq, not_eq, gt, gte, lt, lte
base_price_in_cents Integer
eq, not_eq, gt, gte, lt, lte
price_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
price_period String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
deposit_in_cents Integer
eq, not_eq, gt, gte, lt, lte
discountable Boolean
eq
taxable Boolean
eq
seo_title String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
seo_description String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
tag_list Array
eq
tax_category_id Uuid
eq, not_eq
price_ruleset_id Uuid
eq, not_eq
price_structure_id Uuid
eq, not_eq
q String
eq
collection_id Uuid
eq, not_eq
product_group_id Uuid
eq, not_eq
allow_shortage Boolean
eq
shortage_limit Integer
eq, not_eq, gt, gte, lt, lte
photo_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count
archived Array
count
tag_list Array
count
taxable Array
count
discountable Array
count
product_type Array
count
tracking_type Array
count
show_in_store Array
count
price_type Array
count
price_period Array
count
tax_category_id Array
count
deposit_in_cents Array
sum, maximum, minimum, average
base_price_in_cents Array
sum, maximum, minimum, average

Includes

This request accepts the following includes:

barcode

inventory_levels

photo

price_structure => price_tiles

product_group

properties

tax_category

Searching products

Use advanced search to make logical filter groups with and/or operators.

How to search for products:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/products/search' \
    --header 'content-type: application/json' \
    --data '{
      "fields": {
        "products": "id"
      },
      "filter": {
        "conditions": {
          "operator": "or",
          "attributes": [
            {
              "operator": "and",
              "attributes": [
                {
                  "discountable": true
                },
                {
                  "taxable": true
                }
              ]
            },
            {
              "operator": "and",
              "attributes": [
                {
                  "show_in_store": true
                },
                {
                  "taxable": true
                }
              ]
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "f608646f-8ecd-42d1-baa6-7bcc3c1791c4"
    },
    {
      "id": "dbed1b37-8c0f-4d6c-ab0d-54f4d02f0adb"
    },
    {
      "id": "4d3de3be-0f4d-4fc5-8ed1-7166bcf26776"
    },
    {
      "id": "dcd2a4a1-a498-476e-8e23-5ff2fcac7375"
    }
  ]
}

HTTP Request

POST api/boomerang/products/search

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq, gt
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
type String
eq, not_eq
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
group_name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
slug String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
sku String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
lead_time Integer
eq, not_eq, gt, gte, lt, lte
lag_time Integer
eq, not_eq, gt, gte, lt, lte
product_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
tracking_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
trackable Boolean
eq
has_variations Boolean
eq
variation Boolean
eq
extra_information String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
description String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
excerpt String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
show_in_store Boolean
eq
sorting_weight Integer
eq, not_eq, gt, gte, lt, lte
base_price_in_cents Integer
eq, not_eq, gt, gte, lt, lte
price_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
price_period String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
deposit_in_cents Integer
eq, not_eq, gt, gte, lt, lte
discountable Boolean
eq
taxable Boolean
eq
seo_title String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
seo_description String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
tag_list Array
eq
tax_category_id Uuid
eq, not_eq
price_ruleset_id Uuid
eq, not_eq
price_structure_id Uuid
eq, not_eq
q String
eq
collection_id Uuid
eq, not_eq
product_group_id Uuid
eq, not_eq
allow_shortage Boolean
eq
shortage_limit Integer
eq, not_eq, gt, gte, lt, lte
photo_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count
archived Array
count
tag_list Array
count
taxable Array
count
discountable Array
count
product_type Array
count
tracking_type Array
count
show_in_store Array
count
price_type Array
count
price_period Array
count
tax_category_id Array
count
deposit_in_cents Array
sum, maximum, minimum, average
base_price_in_cents Array
sum, maximum, minimum, average

Includes

This request accepts the following includes:

barcode

inventory_levels

photo

price_structure => price_tiles

product_group

properties

tax_category

Fetching a product

How to fetch a product:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/products/5a276944-e4f5-4811-ba42-7d1642567d5d' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "5a276944-e4f5-4811-ba42-7d1642567d5d",
    "type": "products",
    "attributes": {
      "created_at": "2024-11-18T09:28:10.252927+00:00",
      "updated_at": "2024-11-18T09:28:10.453272+00:00",
      "archived": false,
      "archived_at": null,
      "type": "products",
      "name": "iPad Pro",
      "group_name": "iPad Pro",
      "slug": "ipad-pro",
      "sku": null,
      "lead_time": 0,
      "lag_time": 0,
      "product_type": "rental",
      "tracking_type": "bulk",
      "trackable": false,
      "has_variations": true,
      "variation": true,
      "extra_information": null,
      "photo_url": null,
      "description": null,
      "excerpt": null,
      "show_in_store": true,
      "sorting_weight": 1,
      "base_price_in_cents": 0,
      "price_type": "simple",
      "price_period": "day",
      "deposit_in_cents": 0,
      "discountable": true,
      "taxable": true,
      "seo_title": null,
      "seo_description": null,
      "tag_list": [],
      "properties": {},
      "photo_id": null,
      "tax_category_id": null,
      "price_ruleset_id": null,
      "price_structure_id": null,
      "variation_values": [
        "green"
      ],
      "allow_shortage": false,
      "shortage_limit": 0,
      "product_group_id": "747fb42e-cd12-48c7-b37c-6dcaf0ffca50"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/products/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=barcode,inventory_levels,photo
fields[] Array
List of comma seperated fields to include ?fields[products]=created_at,updated_at,archived

Includes

This request accepts the following includes:

barcode

inventory_levels

photo

price_structure => price_tiles

product_group

properties

tax_category

Creating a product

How to create a product:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/products' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "products",
        "attributes": {
          "product_group_id": "2cc980c6-061e-4458-bed2-7f4813ce85a8",
          "variation_values": [
            "red"
          ]
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "eb012d9d-e415-4fd2-a2fb-046addd500d1",
    "type": "products",
    "attributes": {
      "created_at": "2024-11-18T09:28:07.925095+00:00",
      "updated_at": "2024-11-18T09:28:07.925095+00:00",
      "archived": false,
      "archived_at": null,
      "type": "products",
      "name": "iPad Pro - red",
      "group_name": "iPad Pro",
      "slug": "ipad-pro-red",
      "sku": null,
      "lead_time": 0,
      "lag_time": 0,
      "product_type": "rental",
      "tracking_type": "bulk",
      "trackable": false,
      "has_variations": true,
      "variation": true,
      "extra_information": null,
      "photo_url": null,
      "description": null,
      "excerpt": null,
      "show_in_store": true,
      "sorting_weight": 3,
      "base_price_in_cents": 0,
      "price_type": "simple",
      "price_period": "day",
      "deposit_in_cents": 0,
      "discountable": true,
      "taxable": true,
      "seo_title": null,
      "seo_description": null,
      "tag_list": [],
      "properties": {},
      "photo_id": null,
      "tax_category_id": null,
      "price_ruleset_id": null,
      "price_structure_id": null,
      "variation_values": [
        "red"
      ],
      "allow_shortage": false,
      "shortage_limit": 0,
      "product_group_id": "2cc980c6-061e-4458-bed2-7f4813ce85a8"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/products

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=barcode,inventory_levels,photo
fields[] Array
List of comma seperated fields to include ?fields[products]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][slug] String
Slug of the item
data[attributes][sku] String
Stock keeping unit
data[attributes][has_variations] Boolean
Whether variations are enabled. Not applicable for product_type service
data[attributes][excerpt] String
Excerpt used in the online store
data[attributes][sorting_weight] Integer
Defines sorting weight within its associated product group, the lower the weight - the higher it shows up in lists
data[attributes][base_price_in_cents] Integer
The value that is being calculated with. This value is writable if group has variations enabled, otherwise it's inherited from the group
data[attributes][deposit_in_cents] Integer
The value to use for deposit calculations
data[attributes][seo_title] String
SEO title tag
data[attributes][seo_description] String
SEO meta description tag
data[attributes][photo_id] Uuid
Associated Photo
data[attributes][product_group_id] Uuid
Associated Product group
data[attributes][variation_values][] Array
List of values for product_group.variation_fields (Should be in the same order)
data[attributes][confirm_shortage] Boolean
Whether to confirm the shortage (over limit by changing shortage_limit)

Includes

This request accepts the following includes:

barcode

inventory_levels

photo

price_structure => price_tiles

product_group

properties

tax_category

Updating a product

How to update a product:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/products/9fa6b4da-88e4-4fa1-bf3b-86cefad2c99e' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "9fa6b4da-88e4-4fa1-bf3b-86cefad2c99e",
        "type": "products",
        "attributes": {
          "variation_values": [
            "red"
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "9fa6b4da-88e4-4fa1-bf3b-86cefad2c99e",
    "type": "products",
    "attributes": {
      "created_at": "2024-11-18T09:28:04.755232+00:00",
      "updated_at": "2024-11-18T09:28:05.193756+00:00",
      "archived": false,
      "archived_at": null,
      "type": "products",
      "name": "iPad Pro - red",
      "group_name": "iPad Pro",
      "slug": "ipad-pro",
      "sku": null,
      "lead_time": 0,
      "lag_time": 0,
      "product_type": "rental",
      "tracking_type": "bulk",
      "trackable": false,
      "has_variations": true,
      "variation": true,
      "extra_information": null,
      "photo_url": null,
      "description": null,
      "excerpt": null,
      "show_in_store": true,
      "sorting_weight": 1,
      "base_price_in_cents": 0,
      "price_type": "simple",
      "price_period": "day",
      "deposit_in_cents": 0,
      "discountable": true,
      "taxable": true,
      "seo_title": null,
      "seo_description": null,
      "tag_list": [],
      "properties": {},
      "photo_id": null,
      "tax_category_id": null,
      "price_ruleset_id": null,
      "price_structure_id": null,
      "variation_values": [
        "red"
      ],
      "allow_shortage": false,
      "shortage_limit": 0,
      "product_group_id": "7bc44027-580b-40e1-a695-c3703c81c8da"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/products/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=barcode,inventory_levels,photo
fields[] Array
List of comma seperated fields to include ?fields[products]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][slug] String
Slug of the item
data[attributes][sku] String
Stock keeping unit
data[attributes][has_variations] Boolean
Whether variations are enabled. Not applicable for product_type service
data[attributes][excerpt] String
Excerpt used in the online store
data[attributes][sorting_weight] Integer
Defines sorting weight within its associated product group, the lower the weight - the higher it shows up in lists
data[attributes][base_price_in_cents] Integer
The value that is being calculated with. This value is writable if group has variations enabled, otherwise it's inherited from the group
data[attributes][deposit_in_cents] Integer
The value to use for deposit calculations
data[attributes][seo_title] String
SEO title tag
data[attributes][seo_description] String
SEO meta description tag
data[attributes][photo_id] Uuid
Associated Photo
data[attributes][product_group_id] Uuid
Associated Product group
data[attributes][variation_values][] Array
List of values for product_group.variation_fields (Should be in the same order)
data[attributes][confirm_shortage] Boolean
Whether to confirm the shortage (over limit by changing shortage_limit)

Includes

This request accepts the following includes:

barcode

inventory_levels

photo

price_structure => price_tiles

product_group

properties

tax_category

Archiving a product

How to delete a product:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/products/9c269a83-49d5-4605-bdf5-c64d1cc3d137' \
    --header 'content-type: application/json' \
    --data '{}'

A 200 status response looks like this:

  {
  "data": {
    "id": "9c269a83-49d5-4605-bdf5-c64d1cc3d137",
    "type": "products",
    "attributes": {
      "created_at": "2024-11-18T09:28:05.755016+00:00",
      "updated_at": "2024-11-18T09:28:06.167509+00:00",
      "archived": true,
      "archived_at": "2024-11-18T09:28:06.167509+00:00",
      "type": "products",
      "name": "iPad Pro",
      "group_name": "iPad Pro",
      "slug": "ipad-pro",
      "sku": null,
      "lead_time": 0,
      "lag_time": 0,
      "product_type": "rental",
      "tracking_type": "bulk",
      "trackable": false,
      "has_variations": true,
      "variation": true,
      "extra_information": null,
      "photo_url": null,
      "description": null,
      "excerpt": null,
      "show_in_store": true,
      "sorting_weight": 1,
      "base_price_in_cents": 0,
      "price_type": "simple",
      "price_period": "day",
      "deposit_in_cents": 0,
      "discountable": true,
      "taxable": true,
      "seo_title": null,
      "seo_description": null,
      "tag_list": [],
      "properties": {},
      "photo_id": null,
      "tax_category_id": null,
      "price_ruleset_id": null,
      "price_structure_id": null,
      "variation_values": [
        "green"
      ],
      "allow_shortage": false,
      "shortage_limit": 0,
      "product_group_id": "e71cc53e-1561-4189-befd-b1a688fcfc25"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/products/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Properties

While Booqable comes with standard fields, like a customer's name and a product's SKU, you can add custom properties to capture additional information that's important for you or your customers.

Types

Properties can have different types and behave differently. These are the values you can supply for each type:

text_field Renders a text field
value String
text_area Renders a text area
value String
phone Renders a phone field
value String
email Renders an email field
value String
date Renders a date picker
value String
select Renders a dropdown select
value String
address Renders multiple fields
first_name String
last_name String
address1 String
address2 String
city String
region String
zipcode String
country String
country_id UUID
province_id UUID

Properties inherit their configuration fields from a default property when they are connected. When creating properties, they are mapped with their default when one of the following fields correspond:

Endpoints

GET /api/boomerang/properties

GET /api/boomerang/properties/{id}

POST /api/boomerang/properties

PUT /api/boomerang/properties/{id}

DELETE /api/boomerang/properties/{id}

Fields

Every property has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
name String
Name of the property (used as label and to compute identifier if left blank)
identifier String
Key that will be used in exports, responses and custom field variables in templates
position Integer
Which position the property has
property_type String
One of address, date_field, email, phone, select, text_area, text_field
show_on Array
Array of items to show this custom field on. Any of contract, invoice, packing, quote
validation_required Boolean
Whether this property has to be validated
meets_validation_requirements Boolean
Whether this property meets the validation requirements
first_name String
For type address
last_name String
For type address
address1 String
For type address
address2 String
For type address
city String
For type address
region String
For type address
zipcode String
For type address
country String
For type address
country_id String
For type address
province_id String
For type address
latitude String
For type address
longitude String
For type address
value String
For type text_field, text_area, phone, email, date_field, select
default_property_id Uuid
Associated Default property
owner_id Uuid
ID of its owner
owner_type String
The resource type of the owner. One of companies, customers, locations, orders, product_groups, stock_items, users, order_delivery_rates

Relationships

Properties have the following relationships:

Name Description
default_property Default properties readonly
Associated Default property
owner Customer, Order, Product group, Stock item, Order delivery rate
Associated Owner

Listing properties

How to fetch a list of properties:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/properties?include=owner' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "26cf9df0-e81f-4b3c-8dec-66c830a438f7",
      "type": "properties",
      "attributes": {
        "created_at": "2024-11-18T09:24:28.813693+00:00",
        "updated_at": "2024-11-18T09:24:28.813693+00:00",
        "name": "Phone",
        "identifier": "property_1",
        "position": 0,
        "property_type": "phone",
        "show_on": [],
        "validation_required": false,
        "meets_validation_requirements": true,
        "value": "+316000000",
        "default_property_id": null,
        "owner_id": "528c8cce-2149-42a6-a321-89f33d0ab2ab",
        "owner_type": "customers"
      },
      "relationships": {
        "owner": {
          "data": {
            "type": "customers",
            "id": "528c8cce-2149-42a6-a321-89f33d0ab2ab"
          }
        }
      }
    }
  ],
  "included": [
    {
      "id": "528c8cce-2149-42a6-a321-89f33d0ab2ab",
      "type": "customers",
      "attributes": {
        "created_at": "2024-11-18T09:24:28.748777+00:00",
        "updated_at": "2024-11-18T09:24:28.815767+00:00",
        "archived": false,
        "archived_at": null,
        "number": 1,
        "name": "John Doe",
        "email": "[email protected]",
        "deposit_type": "default",
        "deposit_value": 0.0,
        "discount_percentage": 0.0,
        "legal_type": "person",
        "email_marketing_consented": false,
        "email_marketing_consent_updated_at": null,
        "properties": {
          "property_1": "+316000000"
        },
        "tag_list": [],
        "merge_suggestion_customer_id": null,
        "tax_region_id": null
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/properties

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
identifier String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
default_property_id Uuid
eq, not_eq
owner_id Uuid
eq, not_eq
owner_type String
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

owner

Fetching a property

How to fetch a properties:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/properties/88bf8e87-2103-4a11-a005-f752146112eb?include=owner' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "88bf8e87-2103-4a11-a005-f752146112eb",
    "type": "properties",
    "attributes": {
      "created_at": "2024-11-18T09:24:31.937440+00:00",
      "updated_at": "2024-11-18T09:24:31.937440+00:00",
      "name": "Phone",
      "identifier": "property_6",
      "position": 0,
      "property_type": "phone",
      "show_on": [],
      "validation_required": false,
      "meets_validation_requirements": true,
      "value": "+316000000",
      "default_property_id": null,
      "owner_id": "63e5b595-dd76-44c5-b05b-cd7af5b31f6a",
      "owner_type": "customers"
    },
    "relationships": {
      "owner": {
        "data": {
          "type": "customers",
          "id": "63e5b595-dd76-44c5-b05b-cd7af5b31f6a"
        }
      }
    }
  },
  "included": [
    {
      "id": "63e5b595-dd76-44c5-b05b-cd7af5b31f6a",
      "type": "customers",
      "attributes": {
        "created_at": "2024-11-18T09:24:31.898157+00:00",
        "updated_at": "2024-11-18T09:24:31.939221+00:00",
        "archived": false,
        "archived_at": null,
        "number": 1,
        "name": "John Doe",
        "email": "[email protected]",
        "deposit_type": "default",
        "deposit_value": 0.0,
        "discount_percentage": 0.0,
        "legal_type": "person",
        "email_marketing_consented": false,
        "email_marketing_consent_updated_at": null,
        "properties": {
          "property_6": "+316000000"
        },
        "tag_list": [],
        "merge_suggestion_customer_id": null,
        "tax_region_id": null
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/properties/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

owner

Creating a property

How to create a property and assign it to an owner:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/properties' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "properties",
        "attributes": {
          "name": "Phone",
          "property_type": "phone",
          "value": "+316000000",
          "owner_id": "f6840cf5-2d0d-4bfd-b7bf-3b929677f8f6",
          "owner_type": "customers"
        }
      },
      "include": "owner"
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "985e61d4-6372-4f2d-b8e7-c158ff081bad",
    "type": "properties",
    "attributes": {
      "created_at": "2024-11-18T09:24:33.252791+00:00",
      "updated_at": "2024-11-18T09:24:33.252791+00:00",
      "name": "Phone",
      "identifier": "phone",
      "position": 0,
      "property_type": "phone",
      "show_on": [],
      "validation_required": false,
      "meets_validation_requirements": true,
      "value": "+316000000",
      "default_property_id": null,
      "owner_id": "f6840cf5-2d0d-4bfd-b7bf-3b929677f8f6",
      "owner_type": "customers"
    },
    "relationships": {
      "owner": {
        "data": {
          "type": "customers",
          "id": "f6840cf5-2d0d-4bfd-b7bf-3b929677f8f6"
        }
      }
    }
  },
  "included": [
    {
      "id": "f6840cf5-2d0d-4bfd-b7bf-3b929677f8f6",
      "type": "customers",
      "attributes": {
        "created_at": "2024-11-18T09:24:33.203650+00:00",
        "updated_at": "2024-11-18T09:24:33.254767+00:00",
        "archived": false,
        "archived_at": null,
        "number": 2,
        "name": "Jane Doe",
        "email": "[email protected]",
        "deposit_type": "default",
        "deposit_value": 0.0,
        "discount_percentage": 0.0,
        "legal_type": "person",
        "email_marketing_consented": false,
        "email_marketing_consent_updated_at": null,
        "properties": {
          "phone": "+316000000"
        },
        "tag_list": [],
        "merge_suggestion_customer_id": null,
        "tax_region_id": null
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

POST /api/boomerang/properties

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the property (used as label and to compute identifier if left blank)
data[attributes][identifier] String
Key that will be used in exports, responses and custom field variables in templates
data[attributes][position] Integer
Which position the property has
data[attributes][property_type] String
One of address, date_field, email, phone, select, text_area, text_field
data[attributes][show_on][] Array
Array of items to show this custom field on. Any of contract, invoice, packing, quote
data[attributes][validation_required] Boolean
Whether this property has to be validated
data[attributes][meets_validation_requirements] Boolean
Whether this property meets the validation requirements
data[attributes][first_name] String
For type address
data[attributes][last_name] String
For type address
data[attributes][address1] String
For type address
data[attributes][address2] String
For type address
data[attributes][city] String
For type address
data[attributes][region] String
For type address
data[attributes][zipcode] String
For type address
data[attributes][country] String
For type address
data[attributes][country_id] String
For type address
data[attributes][province_id] String
For type address
data[attributes][latitude] String
For type address
data[attributes][longitude] String
For type address
data[attributes][value] String
For type text_field, text_area, phone, email, date_field, select
data[attributes][default_property_id] Uuid
Associated Default property
data[attributes][owner_id] Uuid
ID of its owner
data[attributes][owner_type] String
The resource type of the owner. One of companies, customers, locations, orders, product_groups, stock_items, users, order_delivery_rates

Includes

This request accepts the following includes:

owner

Updating a property

How to update a property:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/properties/596f9d51-e202-4dd0-bf1b-ad1d6f946b52' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "596f9d51-e202-4dd0-bf1b-ad1d6f946b52",
        "type": "properties",
        "attributes": {
          "value": "+316000001"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "596f9d51-e202-4dd0-bf1b-ad1d6f946b52",
    "type": "properties",
    "attributes": {
      "created_at": "2024-11-18T09:24:31.384828+00:00",
      "updated_at": "2024-11-18T09:24:31.436391+00:00",
      "name": "Phone",
      "identifier": "property_5",
      "position": 0,
      "property_type": "phone",
      "show_on": [],
      "validation_required": false,
      "meets_validation_requirements": true,
      "value": "+316000001",
      "default_property_id": null,
      "owner_id": "18e348f0-bf01-4305-9138-63df20281204",
      "owner_type": "customers"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/properties/{id}

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the property (used as label and to compute identifier if left blank)
data[attributes][identifier] String
Key that will be used in exports, responses and custom field variables in templates
data[attributes][position] Integer
Which position the property has
data[attributes][property_type] String
One of address, date_field, email, phone, select, text_area, text_field
data[attributes][show_on][] Array
Array of items to show this custom field on. Any of contract, invoice, packing, quote
data[attributes][validation_required] Boolean
Whether this property has to be validated
data[attributes][meets_validation_requirements] Boolean
Whether this property meets the validation requirements
data[attributes][first_name] String
For type address
data[attributes][last_name] String
For type address
data[attributes][address1] String
For type address
data[attributes][address2] String
For type address
data[attributes][city] String
For type address
data[attributes][region] String
For type address
data[attributes][zipcode] String
For type address
data[attributes][country] String
For type address
data[attributes][country_id] String
For type address
data[attributes][province_id] String
For type address
data[attributes][latitude] String
For type address
data[attributes][longitude] String
For type address
data[attributes][value] String
For type text_field, text_area, phone, email, date_field, select
data[attributes][default_property_id] Uuid
Associated Default property
data[attributes][owner_id] Uuid
ID of its owner
data[attributes][owner_type] String
The resource type of the owner. One of companies, customers, locations, orders, product_groups, stock_items, users, order_delivery_rates

Includes

This request accepts the following includes:

owner

Deleting a property

How to delete a property:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/properties/922d4eea-2e25-4c1f-a012-353f0a9f53dc' \
    --header 'content-type: application/json' \
    --data '{}'

A 200 status response looks like this:

  {
  "data": {
    "id": "922d4eea-2e25-4c1f-a012-353f0a9f53dc",
    "type": "properties",
    "attributes": {
      "created_at": "2024-11-18T09:24:32.510937+00:00",
      "updated_at": "2024-11-18T09:24:32.510937+00:00",
      "name": "Phone",
      "identifier": "property_7",
      "position": 0,
      "property_type": "phone",
      "show_on": [],
      "validation_required": false,
      "meets_validation_requirements": null,
      "value": "+316000000",
      "default_property_id": null,
      "owner_id": "03cdaa0c-73b3-4ff1-85ad-fba9056c0082",
      "owner_type": "customers"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/properties/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

owner

Managing multiple properties on a resource

On the following resources you can manage multiple properties at once:

Creating properties that correspond with an existing default property (we've already created a default phone property for a customer):

  curl --request  \
    --url 'https://example.booqable.com/api/boomerang/customers' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "customers",
        "attributes": {
          "name": "John Doe",
          "properties_attributes": [
            {
              "identifier": "phone",
              "value": "+316000000"
            }
          ]
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "017f3cbd-7669-4080-bb47-7add3bc4932b",
    "type": "customers",
    "attributes": {
      "created_at": "2024-11-18T09:24:30.058963+00:00",
      "updated_at": "2024-11-18T09:24:30.062940+00:00",
      "archived": false,
      "archived_at": null,
      "number": 2,
      "name": "John Doe",
      "email": null,
      "deposit_type": "default",
      "deposit_value": 0.0,
      "discount_percentage": 0.0,
      "legal_type": "person",
      "email_marketing_consented": false,
      "email_marketing_consent_updated_at": null,
      "properties": {
        "phone": "+316000000"
      },
      "tag_list": [],
      "merge_suggestion_customer_id": null,
      "tax_region_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

Creating one-off properties (no corresponding default property):

  curl --request  \
    --url 'https://example.booqable.com/api/boomerang/customers' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "customers",
        "attributes": {
          "name": "John Doe",
          "properties_attributes": [
            {
              "name": "Phone",
              "value": "+316000000",
              "property_type": "phone"
            }
          ]
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "7d65b68b-fa74-4716-bbe6-8cc120214892",
    "type": "customers",
    "attributes": {
      "created_at": "2024-11-18T09:24:29.415361+00:00",
      "updated_at": "2024-11-18T09:24:29.419513+00:00",
      "archived": false,
      "archived_at": null,
      "number": 2,
      "name": "John Doe",
      "email": null,
      "deposit_type": "default",
      "deposit_value": 0.0,
      "discount_percentage": 0.0,
      "legal_type": "person",
      "email_marketing_consented": false,
      "email_marketing_consent_updated_at": null,
      "properties": {
        "phone": "+316000000"
      },
      "tag_list": [],
      "merge_suggestion_customer_id": null,
      "tax_region_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

Deleting a property while updating another one:

  curl --request  \
    --url 'https://example.booqable.com/api/boomerang/customers/3d7b1f51-9edd-42e1-8294-fcf0d394c2f5' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "customers",
        "id": "3d7b1f51-9edd-42e1-8294-fcf0d394c2f5",
        "attributes": {
          "name": "John Doe",
          "properties_attributes": [
            {
              "identifier": "phone",
              "_destroy": true
            },
            {
              "identifier": "birthday",
              "value": "01-01-1970"
            }
          ]
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "3d7b1f51-9edd-42e1-8294-fcf0d394c2f5",
    "type": "customers",
    "attributes": {
      "created_at": "2024-11-18T09:24:30.744646+00:00",
      "updated_at": "2024-11-18T09:24:30.831106+00:00",
      "archived": false,
      "archived_at": null,
      "number": 2,
      "name": "John Doe",
      "email": "[email protected]",
      "deposit_type": "default",
      "deposit_value": 0.0,
      "discount_percentage": 0.0,
      "legal_type": "person",
      "email_marketing_consented": false,
      "email_marketing_consent_updated_at": null,
      "properties": {
        "birthday": "01-01-1970"
      },
      "tag_list": [],
      "merge_suggestion_customer_id": null,
      "tax_region_id": null
    },
    "relationships": {}
  },
  "meta": {}
}

Includes

All includes are allowed on this request

Provinces

The Province resource describes provinces/states etc. in a country.

Fields

Every province has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
name String readonly
The name of the province/state.
code String readonly
The code of the province/state.
position Integer readonly
The position of the province/state in the list.
country_id Uuid readonly
The ID of the country the province/state belongs to.

Listing provinces

How to fetch a list of provinces.:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "8cc070fd-3693-4940-b79b-e348c6ffc16a",
      "type": "provinces",
      "attributes": {
        "created_at": "2024-11-18T09:22:27.057084+00:00",
        "updated_at": "2024-11-18T09:22:27.057084+00:00",
        "name": "Friesland",
        "code": "FR",
        "position": 0,
        "country_id": "a795f587-f6d5-43b4-aba8-b0859d0cb648"
      }
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/provinces

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
country_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request does not accept any includes

Sessions

The session tells you whether settings are changed since the last time they were being requested. Every response includes a Session-Id header which contains a session ID. If that ID does not match with the ID of the last session that was fetched, this indicates that the following information may have been changed:

When there's an ID mismatch, it's advised to fetch the session again to reload these resources.

Fields

Every session has the following fields:

Name Description
id Uuid
Primary key
company_id Uuid
Associated Company
employee_id Uuid
Associated Employee
locations_updated_at Datetime
When locations were last updated
clusters_updated_at Datetime
When the clusters were last updated
default_properties_updated_at Datetime
When the default properties were last updated
notification_subscriptions_updated_at Datetime
When the employee last made a change to their notification subscriptions
countries_updated_at Datetime
When the countries were last updated
operating_rules_updated_at Datetime
When the operating rules were last updated

Relationships

Sessions have the following relationships:

Name Description
app_subscriptions App subscriptions readonly
Associated App subscriptions
clusters Clusters readonly
Associated Clusters
company Companies readonly
Associated Company
default_properties Default properties readonly
Associated Default properties
employee Employees readonly
Associated Employee
locations Locations readonly
Associated Locations
operating_rules Operating rules readonly
Associated Operating rules
settings Settings readonly
Associated Settings

Fetching the session

How to fetch the session:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/sessions/current?extra_fields%5Bcompanies%5D=subscription&include=company%2Cemployee%2Csettings' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "4bb4e738-088a-506e-9ebc-a9a8e2f12880",
    "type": "sessions",
    "attributes": {
      "updated_at": "2024-11-18T09:27:25.910380+00:00",
      "company_id": "627f4155-a2f0-4083-a183-27aeb508a429",
      "employee_id": "a2d5fbf0-9995-44cb-a99d-fa8e57d3512b",
      "locations_updated_at": null,
      "clusters_updated_at": null,
      "default_properties_updated_at": null,
      "notification_subscriptions_updated_at": "2024-11-18T09:27:25.914618+00:00",
      "countries_updated_at": null,
      "operating_rules_updated_at": null
    },
    "relationships": {
      "company": {
        "data": {
          "type": "companies",
          "id": "627f4155-a2f0-4083-a183-27aeb508a429"
        }
      },
      "employee": {
        "data": {
          "type": "employees",
          "id": "a2d5fbf0-9995-44cb-a99d-fa8e57d3512b"
        }
      },
      "settings": {
        "data": {
          "type": "settings",
          "id": "4ebd0208-8328-5d69-8c44-ec50939c0967"
        }
      }
    }
  },
  "included": [
    {
      "id": "627f4155-a2f0-4083-a183-27aeb508a429",
      "type": "companies",
      "attributes": {
        "created_at": "2024-11-18T09:27:25.889806+00:00",
        "updated_at": "2024-11-18T09:27:25.899642+00:00",
        "name": "Company name 258",
        "slug": "company-name-258",
        "email": "[email protected]",
        "billing_email": null,
        "phone": "0581234567",
        "website": "www.booqable.com",
        "address_line_1": "Blokhuispoort",
        "address_line_2": "Leeuwarden",
        "zipcode": "8900AB",
        "city": "Leeuwarden",
        "region": null,
        "country": "the Netherlands",
        "market": "AV / Camera",
        "use_billing_address": false,
        "billing_company": null,
        "billing_address_line_1": null,
        "billing_address_line_2": null,
        "billing_address_zipcode": null,
        "billing_address_city": null,
        "billing_address_region": null,
        "billing_address_country": null,
        "logo_url": null,
        "favicon_url": null,
        "default_timezone": "UTC",
        "currency": "usd",
        "financial_line_1": "Blokhuispoort",
        "financial_line_2": "Leeuwarden",
        "vat_number": null,
        "custom_domain": null,
        "custom_domain_validation": null,
        "development": false,
        "shop_theme_id": null,
        "installed_online_store": false,
        "source": null,
        "medium": null,
        "tenant_token": "d4b44d657f3adc30a4702fdf72b1de26",
        "pending_subscription": false,
        "team_size": null,
        "projected_revenue": null,
        "year_business_start": null,
        "address": "Blokhuispoort\nLeeuwarden\n8900AB Leeuwarden\nthe Netherlands",
        "main_address": {
          "meets_validation_requirements": false,
          "first_name": null,
          "last_name": null,
          "address1": "Blokhuispoort",
          "address2": "Leeuwarden",
          "city": "Leeuwarden",
          "region": null,
          "zipcode": "8900AB",
          "country": "the Netherlands",
          "country_id": null,
          "province_id": null,
          "latitude": null,
          "longitude": null,
          "value": "Blokhuispoort\nLeeuwarden\n8900AB Leeuwarden\nthe Netherlands"
        },
        "billing_address": null,
        "subscription": {
          "trial_ends_at": "2024-12-02T09:27:25.878Z",
          "activated": false,
          "active_subscription": false,
          "suspended": false,
          "canceled": false,
          "canceled_at": null,
          "on_hold": false,
          "needs_activation": false,
          "product": "Premium",
          "plan_id": "premium_monthly",
          "interval": "month",
          "current_period_end": null,
          "extra_employees": 0,
          "extra_locations": 0,
          "amount_in_cents": 29900,
          "discount_in_cents": 0,
          "balance_in_cents": 0,
          "coupon": null,
          "coupon_percent_off": null,
          "coupon_duration": null,
          "coupon_duration_in_months": null,
          "strategy": "charge_automatically",
          "source": null,
          "enabled_features": [],
          "allowed_features": [
            "bundles",
            "multiple_locations",
            "advanced_pricing",
            "api",
            "custom_fields",
            "overbookings",
            "customer_auth",
            "custom_domain",
            "barcodes",
            "reports",
            "permissions",
            "exports",
            "coupons",
            "shop_tracking",
            "sso",
            "iprestrictions",
            "2fa_enforcing",
            "remove_powered_by"
          ],
          "restrictions": {
            "employees": 15,
            "email_max_recipients": 2000,
            "rate_limit_max": 250,
            "rate_limit_period": 60,
            "locations": 3
          },
          "can_try_plan": true
        }
      }
    },
    {
      "id": "a2d5fbf0-9995-44cb-a99d-fa8e57d3512b",
      "type": "employees",
      "attributes": {
        "created_at": "2024-11-18T09:27:25.910380+00:00",
        "updated_at": "2024-11-18T09:27:25.910380+00:00",
        "name": "John Doe",
        "firstname": "John",
        "lastname": "Doe",
        "locale": null,
        "email": "[email protected]",
        "unconfirmed_email": null,
        "viewed_whats_new_at": "2024-11-18T09:27:25.905972+00:00",
        "active": true,
        "owner": true,
        "confirmed": true,
        "time_to_confirm": 0,
        "permissions": [
          "reports",
          "products",
          "settings",
          "security_settings",
          "account",
          "exports",
          "cancel_orders",
          "revert_orders",
          "delete_invoices",
          "make_invoice_revisions",
          "override_rental_period"
        ],
        "has_two_factor_autentication": false,
        "avatar_url": "https://gravatar.com/avatar/6a6c19fea4a3676970167ce51f39e6ee.png?d=404",
        "large_avatar_url": "https://gravatar.com/avatar/6a6c19fea4a3676970167ce51f39e6ee.png?d=mm&size=200"
      }
    },
    {
      "id": "4ebd0208-8328-5d69-8c44-ec50939c0967",
      "type": "settings",
      "attributes": {
        "currency": {
          "name": "USD",
          "decimal": ".",
          "thousand": ",",
          "symbol": "$",
          "precision": 2,
          "format": "%s%v"
        },
        "defaults": {
          "timezone": "UTC",
          "timezone_offset": 0,
          "tax_category_id": null,
          "tax_region_id": null,
          "shop_start_location_id": null,
          "shop_stop_location_id": null
        },
        "pricing": {
          "enabled": true,
          "tax_strategy": "exclusive",
          "deposit_type": "percentage",
          "deposit_value": 100,
          "currency_format": "symbol",
          "currency_position": "left"
        },
        "dates": {
          "format": "DD-MM-YYYY",
          "use_am_pm": false,
          "first_day_of_week": 0
        },
        "orders": {
          "use_times": true,
          "start_type": "fixed",
          "start_relative_offset": 0,
          "start_fixed_at": "09:00",
          "stop_type": "fixed",
          "stop_relative_offset": 48,
          "stop_fixed_at": "15:00"
        },
        "security": {
          "sso_forced": false,
          "2fa_forced": false,
          "iprestrictions_enabled": false
        },
        "address": {
          "fields_order": [
            "zipcode",
            "city",
            "region"
          ]
        },
        "store": {
          "enabled": true,
          "public": true,
          "send_order_confirmation": true,
          "brand_color": "#136DEB",
          "use_availability": true,
          "use_prices": true,
          "display_price": "period",
          "show_powered_by": true,
          "use_order_lag_time": false,
          "order_lag_time_value": null,
          "order_lag_time_interval": null,
          "behaviors.add_button": "show_cart",
          "behaviors.location_picker": "start_stop",
          "payment_strategy": "none",
          "payment_strategy_value": 30,
          "payment_deposit": false,
          "payment_methods": [],
          "use_toc": false,
          "toc_label": "",
          "toc_content": "",
          "use_business_hours": false,
          "use_away_mode": false,
          "period_type": "freely",
          "use_times": true,
          "use_coupons_in_checkout": true,
          "time_increment": 60,
          "show_product_availability": true,
          "hide_product_availability_quantities": false,
          "show_cart_availability": true,
          "website": null,
          "checkout_scripts": "",
          "google_analytics_id": null,
          "google_anlaytics_options": "{}",
          "facebook_pixel_id": null,
          "facebook_domain_verification": null
        },
        "user": {
          "auth_enabled": false,
          "allow_signup": true,
          "allow_guest_checkout": true,
          "require_verification": true
        },
        "documents": {
          "show_tax_column": true,
          "css": "",
          "scss": "",
          "scope_numbering_to_prefix": false,
          "page_size": "a4"
        },
        "invoices": {
          "footer": "",
          "show_product_photos": true,
          "show_stock_identifiers": false,
          "show_free_lines": true,
          "hide_section_lines": false,
          "prefix": null,
          "default_due_period": null
        },
        "quotes": {
          "footer": "",
          "body": "",
          "show_product_photos": true,
          "show_stock_identifiers": false,
          "show_free_lines": true,
          "hide_section_lines": false,
          "prefix": null
        },
        "contracts": {
          "footer": "",
          "body": "",
          "show_product_photos": true,
          "show_stock_identifiers": false,
          "show_free_lines": true,
          "hide_section_lines": false,
          "prefix": null
        },
        "labels": {
          "customer": "customer",
          "order": "order",
          "quote": "quote",
          "contract": "contract",
          "packing_slip": "packing_slip",
          "start": "pick_up",
          "stop": "return"
        },
        "emails": {},
        "deliveries": {
          "distance_unit": "metric"
        }
      }
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/sessions/current

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=app_subscriptions,clusters,company
fields[] Array
List of comma seperated fields to include ?fields[sessions]=company_id,employee_id,locations_updated_at

Includes

This request accepts the following includes:

app_subscriptions

clusters

company

default_properties

employee

locations

operating_rules

settings

Settings

Settings are configured globally for a company account. They are divided in the following sections:

Currency

Information on how to display and handle the currency.

Name Description
name String readonly
Currency code
decimal String readonly
Decimal seperator
thousand String readonly
Thousand seperator
symbol String readonly
Currency symbol
precision String readonly
Precision
format String readonly
The format

Defaults

Defaults derived from other resources.

Name Description
timezone String readonly
The default timezone (managed on the company resource)
timezone_offset Integer readonly
The UTC offset of the default timezone, in minutes
tax_category_id Uuid readonly
ID the default tax category
tax_region_id Uuid readonly
ID the default tax region

Pricing

Configuration on how to handle and display pricing

Name Description
enabled Boolean
Whether pricing is enabled
tax_strategy Uuid
How taxes should be calculated, one of exclusive, inclusive
deposit_type String
Default deposit type (applied to orders if customer deposit type is default, one of none, percentage_total, percentage, fixed)
deposit_value Integer
Default deposit value (applied to orders if customer deposit type is default)
currency_format String
Currency format
currency_position String
Where to place the currency symbol, one of left, right

Dates

Information on how to display dates. The settings below should be used (and combined) to select the format string for the date library being used.

Name Description
format String
How dates should be formatted. Supported formats are DD-MM-YYYY, MM-DD-YYYY and YYYY-MM-DD.
use_am_pm Boolean
Whether to use 24h clock or AM/PM
first_day_of_week Integer
Which day to display as first day of the week (0 for Sunday)

Orders

Configuration for orders (these settings also apply to the online store)

Name Description
use_times Boolean
Whether time selection is enabled, if not, full days are always planned and calculated
start_type String
Behavior of default start time, one of fixed, relative
start_relative_offset Integer
Offset in seconds from now, used when start_type is relative
start_fixed_at String
Fixed time of day, e.g. 14:00, used when start_type is fixed
stop_type String
Behavior of default stop time, one of fixed, relative
stop_relative_offset Integer
Offset in seconds from now, used when stop_type is relative
stop_fixed_at String
Fixed time of day, e.g. 14:00, used when stop_type is fixed

Security

Global security settings

Name Description
sso_forced Boolean
Whether to force SSO
iprestrictions_enabled Boolean
Whether IP restrictions are enabled

Address

Settings on how to display addresses

Name Description
fields_order Array
Order of how the fields are displayed, e.g. ["zipcode", "city", "region"]

Store

Settings for the online store

Name Description
enabled Boolean
Whether to accept online reservations
public Boolean
Whether to hosted online store is public
send_order_confirmation Boolean
Whether to send order confirmations automatically after checkout
brand_color String
Brand color as HEX code
use_availability Boolean
Whether to show availability and block checkouts when items are unavailable
use_prices Boolean
Whether to show prices
display_price String
One of period (label will be populated with actual period), charge (label will be populated with the name of the price tile), cheapest (show "starting from" as label)
show_powered_by Boolean
Whether to display "Powered by" in the cart
use_order_lag_time Boolean
Whether to prevent last-minute reservations
order_lag_time_interval String
One of minutes, hours, days, weeks, months
order_lag_time_value Integer
The value applied for order_lag_time_interval
payment_strategy String
One of none (no payment required at checkout), full (full payment required at checkout), partial (partial payment required at checkout)
payment_strategy_value Integer
Percentage to be paid at checkout (for payment_strategy partial)
payment_deposit Boolean
Whether deposit should be paid during checkout
payment_methods Array
List of enabled payment methods, any of ideal, bancontact, eps, alipay, p24, creditcard, paypal
use_toc Boolean
Wheter the agreement should be accepted during checkout
toc_label String
The label of the agreement checkbox
toc_content String
The contents of the actual agreement
use_business_hours Boolean
Whether to take opening hours into account while selecting a period (see operating rules for more information)
use_away_mode Boolean
Whether away mode is enabled (see operating rules for more information)
period_type String
How the period picker is setup, one of freely (free selection), timeslot_duration (select a day, time and duration), timeslot_fixed (fixed timeslots for days). See operating rules for more information
use_times Boolean
Whether to use time selection in the online store
use_coupons_in_checkout Boolean
Whether supplying coupons during checkout is enabled
time_increment Integer
Time increments for time selection (e.g. 15, 30, 60)
show_product_availability Boolean
Whether to show detailed product availability for products
hide_product_availability_quantities Boolean
Whether hide quantities in the product availability calendar
show_cart_availability Boolean
Whether to show on which dates the products in a cart are available during the period selection
website String
Website to use to redirect back to from the checkout
checkout_scripts String
Custom scripts to execute during checkout
google_analytics_id String
Google analytics ID to use for tracking
facebook_pixel_id String
Facebook pixel ID to use for tracking
facebook_domain_verification String
Content for the facebook-domain-verification meta tag

User

Settings that apply to user accounts

Name Description
auth_enabled Boolean
Whether user accounts are enabled
allow_signup Boolean
Whether signup during checkout is allowed
allow_guest_checkout Boolean
Whether to allow guest checkouts
require_verification Boolean
Whether e-mail addresses need to be verified

Documents

Settings that apply to all document types

Name Description
show_tax_column Boolean
Whether to show the tax column on lines
css String
Custom css used for documents
scss String
Custom scss used for documents
scope_numbering_to_prefix Boolean
Whether to scope numbering to prefix, e.g. 1980-1, 1980-2, 1981-1 or 1980-1, 1980-2, 1981-3
page_size String
The page size to use for pdf downloads, one of a4, letter

Invoices

Settings that apply to invoices

Name Description
footer String
HTML formatted footer to display on invoices
show_product_photos Boolean
Whether to show product photos
show_stock_identifiers Boolean
Whether to show identifiers of the stock items that are booked
show_free_lines Boolean
Whether to display lines that don't have price
hide_section_lines Boolean
Whether to hide lines within a section, if enabled to total price of all lines in a section is summed and displayed next to the section
prefix String
Prefix to use for document numbering, e.g. {{year}} or {{customer_number}}, combinations are also possible {{year}}-{{order_number}}
default_due_period Integer
A period of time during which invoices can await payment, in seconds

Quotes

Settings that apply to quotes

Name Description
footer String
HTML formatted footer to display on quotes
body String
HTML formatted body to display on quotes
show_product_photos Boolean
Whether to show product photos
show_stock_identifiers Boolean
Whether to show identifiers of the stock items that are booked
show_free_lines Boolean
Whether to display lines that don't have price
hide_section_lines Boolean
Whether to hide lines within a section, if enabled to total price of all lines in a section is summed and displayed next to the section
prefix String
Prefix to use for document numbering, e.g. {{year}} or {{customer_number}}, combinations are also possible {{year}}-{{order_number}}

Contracts

Settings that apply to contracts

Name Description
footer String
HTML formatted footer to display on contracts
body String
HTML formatted body to display on contracts
show_product_photos Boolean
Whether to show product photos
show_stock_identifiers Boolean
Whether to show identifiers of the stock items that are booked
show_free_lines Boolean
Whether to display lines that don't have price
hide_section_lines Boolean
Whether to hide lines within a section, if enabled to total price of all lines in a section is summed and displayed next to the section
prefix String
Prefix to use for document numbering, e.g. {{year}} or {{customer_number}}, combinations are also possible {{year}}-{{order_number}}

Labels

Customization settings for labels

Name Description
customer String
What to call a customer (one of customer, client, student`)
order String
What to call an order (one of order, booking, project`)
quote String
What to call a quote (one of quote, proposal)
contract String
What to call a contract (one of contract, waiver)
packing_slip String
What to call a packing slip (one of packing_slip, pull_sheet)

Labels

Settings for emails

Name Description
bcc String
BCC addresses to use for all emails

Fields

Every setting has the following fields:

Name Description
id Uuid
Primary key
currency Hash readonly
Information on how to display and handle the currency (managed on Company resource)
defaults Hash readonly
Defaults derived from other resources
pricing Hash
Configuration on how to handle and display pricing
dates Hash
Information on how to display dates
orders Hash
Configuration for orders (these settings also apply to the online store)
security Hash
Global security settings
address Hash
Settings on how to display addresses
store Hash
Settings for the online store
user Hash
Settings that apply to user accounts
documents Hash
Settings that apply to all document types
invoices Hash
Settings that apply to invoices
quotes Hash
Settings that apply to quotes
contracts Hash
Settings that apply to contracts
labels Hash
Customization settings for labels
emails Hash
Settings for emails
deliveries Hash
Settings for deliveries
dashboard Hash
Dashboard settings (Used internally by Booqable)
setup_checklist Hash
Setup checklist settings (Used internally by Booqable)
onboarding Hash
Onboarding settings (Used internally by Booqable)
instructions Hash
Settings for in app instructions (Used internally by Booqable)
tracking Hash
Tracking settings (Used internally by Booqable)
feature_enrollments Hash
Feature enrollments settings (Used internally by Booqable)

Fetching settings

How to fetch settings:

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

A 200 status response looks like this:

  {
  "data": {
    "id": "1f5650da-6406-55f0-bb69-a750e18473cd",
    "type": "settings",
    "attributes": {
      "updated_at": "2024-11-18T09:24:11.405355+00:00",
      "currency": {
        "name": "USD",
        "decimal": ".",
        "thousand": ",",
        "symbol": "$",
        "precision": 2,
        "format": "%s%v"
      },
      "defaults": {
        "timezone": "UTC",
        "timezone_offset": 0,
        "tax_category_id": "90d36861-8677-4f46-a92b-cc1e3fe6b6bc",
        "tax_region_id": "88629637-c4d3-4566-94d5-7bfd1381e62b",
        "shop_start_location_id": null,
        "shop_stop_location_id": null
      },
      "pricing": {
        "enabled": true,
        "tax_strategy": "exclusive",
        "deposit_type": "percentage",
        "deposit_value": 100,
        "currency_format": "symbol",
        "currency_position": "left"
      },
      "dates": {
        "format": "DD-MM-YYYY",
        "use_am_pm": false,
        "first_day_of_week": 0
      },
      "orders": {
        "use_times": true,
        "start_type": "fixed",
        "start_relative_offset": 0,
        "start_fixed_at": "09:00",
        "stop_type": "fixed",
        "stop_relative_offset": 48,
        "stop_fixed_at": "15:00"
      },
      "security": {
        "sso_forced": false,
        "2fa_forced": false,
        "iprestrictions_enabled": false
      },
      "address": {
        "fields_order": [
          "zipcode",
          "city",
          "region"
        ]
      },
      "store": {
        "enabled": true,
        "public": true,
        "send_order_confirmation": true,
        "brand_color": "#136DEB",
        "use_availability": true,
        "use_prices": true,
        "display_price": "period",
        "show_powered_by": true,
        "use_order_lag_time": false,
        "order_lag_time_value": null,
        "order_lag_time_interval": null,
        "behaviors.add_button": "show_cart",
        "behaviors.location_picker": "start_stop",
        "payment_strategy": "none",
        "payment_strategy_value": 30,
        "payment_deposit": false,
        "payment_methods": [],
        "use_toc": false,
        "toc_label": "",
        "toc_content": "",
        "use_business_hours": false,
        "use_away_mode": false,
        "period_type": "freely",
        "use_times": true,
        "use_coupons_in_checkout": true,
        "time_increment": 60,
        "show_product_availability": true,
        "hide_product_availability_quantities": false,
        "show_cart_availability": true,
        "website": null,
        "checkout_scripts": "",
        "google_analytics_id": null,
        "google_anlaytics_options": "{}",
        "facebook_pixel_id": null,
        "facebook_domain_verification": null
      },
      "user": {
        "auth_enabled": false,
        "allow_signup": true,
        "allow_guest_checkout": true,
        "require_verification": true
      },
      "documents": {
        "show_tax_column": true,
        "css": "",
        "scss": "",
        "scope_numbering_to_prefix": false,
        "page_size": "a4"
      },
      "invoices": {
        "footer": "",
        "show_product_photos": true,
        "show_stock_identifiers": false,
        "show_free_lines": true,
        "hide_section_lines": false,
        "prefix": "{{year}}-{{order_number}}",
        "default_due_period": null
      },
      "quotes": {
        "footer": "",
        "body": "",
        "show_product_photos": true,
        "show_stock_identifiers": false,
        "show_free_lines": true,
        "hide_section_lines": false,
        "prefix": "{{year}}-{{customer_number}}"
      },
      "contracts": {
        "footer": "",
        "body": "",
        "show_product_photos": true,
        "show_stock_identifiers": false,
        "show_free_lines": true,
        "hide_section_lines": false,
        "prefix": null
      },
      "labels": {
        "customer": "customer",
        "order": "order",
        "quote": "quote",
        "contract": "contract",
        "packing_slip": "packing_slip",
        "start": "pick_up",
        "stop": "return"
      },
      "emails": {},
      "deliveries": {
        "distance_unit": "metric"
      }
    }
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/settings/current

Request params

This request accepts the following parameters:

Name Description
fields[] Array
List of comma seperated fields to include ?fields[settings]=currency,defaults,pricing

Includes

This request does not accept any includes

Signatures

Signatures are used to confirm and store a signature for contracts and quotes. This resource can also be used to update the signature of a document or add one later. When a contract is confirmed and a signature is supplied the has_signed_contract flag will be set accordingly on the associated order.

Fields

Every signature has the following fields:

Name Description
id Uuid readonly
Primary key
signature_base64 String required writeonly
Base64 encoded signature, use this field to store a signature
document_id Uuid
Associated Document
order_id Uuid readonly
Associated Order
customer_id Uuid readonly
Associated Customer

Relationships

Signatures have the following relationships:

Name Description
customer Customers readonly
Associated Customer
document Documents readonly
Associated Document
order Orders readonly
Associated Order

Confirm a contract

Confirm and add a signature to a contract:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/signatures' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "signatures",
        "attributes": {
          "document_id": "a6c11f5f-c187-40bd-a6e4-578f21141c31",
          "signature_base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAAAXNSR0IArs4c6QAAFwJJREFUeF7tnX+MHsV5x5+9s7mzTXxnjO/8C2N+2wcGwgW3wY1rkahNRBJRIVCSNlEihJQgJY3SSqWNhCr1HyI1ilI1IqRKFJQmVSE/SgiYmIRE/lXXmACWsR0w4J/x+cfhc2zOd7bvtnrefed9Z+ed3Z2dndmd3X3uH8zd7uzM93k+8zzPzLz7er7v+0A/pAApIFXAI0DIM0iBaAUIEOe9AwO81+hl+1/hfxsbAv8AY42WuyECpNz2o95bVoAAsSwwNV9uBRQBodhbbjNT73UVUAREt3m6r1YKVHAezQ2QCmpXK9+3M9g0XpHmWnO9zQ0QcRXG3BCoJVLAngK5AmJvGC63rDPz6dzjsgbl7VtpASEXKo/TldlWpQVEzz3KbCpxxFUai7o18x51zQBRNwRdWTMFIsgjQGrmB2rDzXueVutV6qsMnM0hQFKrTjfEK1AiuBS6SoBU1d8VjF/VoZscFwFiUs2ktshpkxRy7u+FA0I+45xPWOlQWe1cOCBWrCE0Wlbj5KGNW8/QtZTufcmjrwUgyTLQFfoKhJ0z+D9bDmur3ejREyD6nkF35qVA/ly0RkaA5GVkek4pFSBASmk2hU4XOOsq9I67xO2OEiDprElX10wBAqRmBqfhplOg1oC4HdzTGZKutqNArQGxIym1WiUFCJAqWbNSY3EjvhMgCk7lhqkUOkqXGFeAADEuKTXoigImJjYCxBVrUj8MKmACjaA7BIhBsyQ1Zc5sSU9y9e/lU4AAcdWXqF9OKECAOGEGW50o34xtSwnddgkQXeXovlooQIDUwsw4yDJHk+L6ToCkBKQ4U7GOFt+DlJKV+vLcACGzuugnEVYhY7WMlRsgLroH9YkUSFKAAElSKOvfVWZjlWuy9sP0/WXss4YGBIiGaHRLfRQgQOpjaxqphgIEiIZoxd+Sb36T79OKV5fvAQHilj0q05vyQBXfUwKkSJdM5UWpLi5yVJV6NgFSKXPSYEwrQICYVpTaq5QCAiAUxitlXRpMZgUogmSWkBpwUgFDcz0B4qR1qVOuKFAwIIYwL0RNB/vuYJeMmKbAcRUMiBH5OhspUFBLI6JmC1KgmoDoiklg6SpX2fsIkMqalgZmYr4jQMiPSIEYBQiQWPcwMQeR/5VZAScBIbcss0tVq+9OAlItiVVGQ1OCikpFXEOA5Ko6gZBabuuS0XH31DahG0gBpkCtIoj1yYj8ypIChiyn0UytALFkPWq2wgoQIBU2Lg0tuwIESHYNrbWgkRFY60tdGyZA6mp5GreSAnJAaOpSEi/rRaMXAc5OAxyY8OGE78GJCRQ++FnQ68F1PQB9XQCXdgHMn5H1aVnur69DUATJ4jcp70UgjlwE2Hrah33jAPsnAXaN+3BxBsCMi+3G8P/xZ94sr/HfoV6A63sAVvR48L5ZAFdekvLBjl5eBuwcBqQM8ql5HoKx6R2AF0d9+Om4D11TnfdNdwe/8wMmGtCIPwyYu/sAPtALsHZu82K1btBVUQrEuJrDgJTZnoHiPBjPjLbTpynO+ae72uMUIYkChUUXBOVjcz24uVdfq+pMQ/oaxN1ZGUBcM/T2UYCnjvuw/kQbDDQED4QqKLJowoyKUeUz8wA+1e8VXKekcVDXrBXd98oAksY8Nq/FqPH0YYB/OzgNM8/LgeAhwb4wUMTfq6RdLJpgnfLxuR7c02dzdPVrmwAxaHOMGj/c78O2Uz50TbfhUAVCBopO2vU3/V5lCnmD5tFqigDRki18UyNq7AN49PA0zLgQ/I05Np9WqaRXptKuhwY8WDen6OXhcn91KNouDIix1NBYQwbc124TGDV+useHLafbtYas8Ga/i4ompusTrE2wiKdoks3+FEE09TtzDuAnBwD+4+1puGSy3cjFmdyqlGSFKgkUVYDS1CcYTWpTmxiem6sLiGGheI5Y1NjOrVCx/Qu8LgoSPvWSgRKVXkUV8vL6pHPg+UcTi+JrTmi6t2UHpDpaJGrIosaLbwK8Pj4dup45twoouvWJKihRy8Jr5nlwfx9tMCYamrsgOyBpnlbia98YAfjuPh9ePuKD16TA9/zwvgamV81SJA0oeaZd5dw3Kc5xCBAF7X/7NsCTuwHeHuMK8dbRkDAk/CyP/24dHeFqE7EgZxHFJCghQIVjKwgJ7pv83YJsu/AK0pX+EgIkxoSYUv1mD8C39/jQ3Tw/hY4nPx4SDQrvrHE1SlZQZP0KQSoBRbWAr1EmHfIIAiQCEEypfvYSwJbjsqgR3KQCCl9466Rd4nOyFvJifcIK+M9fVqajKvkFJgJEovWmPQBPvOjDkfPBH6OjhhySRprVHT6DlRUU1eVf3Y1GLOAp5ep0BgKE0wRTqh+/BPD0Xh+6m5/PEB076vStSjTh65O80i4+AvGrZ7Jj9RhNVFOu/ObwYp9EgDT1ZynVSweCmT9uxk4bUcTVrihQ+P2TNIW8ybSLUq4wkAQIALCUanQsEEfF4eIgca0+0Um7KOUKfKHWgLCU6rmdfuu4yFRz+TYOFFtpF6t32ByW9diKaoEfdWwFo8nXB2u2sSgs19UWEEypNmwH2PZmUG/wTs9DwoOSV9rFg6Kbdqn0W/b5E3H/pO51iWFAyrFavns/wE82+vDmsXC+yUMSrETJ/x4FCnOu1oYfd3/W/RPVaKIaNaIAivr8yecWelDHpWDDgBS74qDy9B2/A/jx/wKMNnfFL0jeEBIHilZ9gqd6vfauusqKl4vLwne/x4MvLqnOh7FUpvPaAIL1xgvbAH62w4eeic5VKlOglKU+Ud1XESPKTbM9eHh5fY6oOA6ICuPJcePsyQl4fGsv7HwVDxoG14vpEGtFBCVr2sWeZWP/JK/6RNw/QUg+uagenzFxHJCGewX5iebPyRGARzf4cGS/vAGxNsCrTEUTPs+XPYefnfNIu1TrE5VlYTyy8veDHnx+UN82mibN9bYSAKKvx943AL6/AeDc4faxj8lZne2pRhNx6Vcs5LXqE+6FcdGHDYVj9dyhQ53zXarpVRIoF2YGkNw7v7rnuCoLCBbj658HGD3lt9IpHg2ToEStdsXN2CZ34/mUEf+tuuKV5W0rjbF1B6nqR+d58I9XVBOSBECypTf6c7/+nawYf2FDu94QHYi1LoMkqj5Jm3bx0SZuWRgTlKmItyuqpF1iGscrpwOKShQU+8UgcXaFK4MbVyqCIBxbfwOwfqPfeGmbrJ4QDwniNSajiZh2qYAi3iMWxVlAkUHSgJLbozH1+fgb51RjhYvnqTKAND7c9AzApq3hY+ZsRhUjQN6gqMzMadOuINq5VZ+snFsNSJjflBiQNue4jLv+2V7Y/ooPMycBLvREp2g8KKqQsNZ0VrwKqU+8doSIKuLF+ijrpxn59hCSLy2uxhmuEgMSuC0u4z73pA+793ZCoQqKrEaJSrvEekKWxrGeuHS+S2W1ixXevLPrFvJVgaTUgDA49u0EOB/xpTIqkIyPH2n49MTkaIuyc+dPSsPQuXNHoWtgWftvPsDM7tmt/7+kb0nr3zP6F3a0oXJamK9botIuBrVKfaJ7bCUKlKh0Ufx9FSApLSAIx4bHfXh9X9gHo0BpzPTN1Ovddw/BWTgF3ul3YHzWNEydOhp6ly5eK+5Sy6IMe7LsWvxbT38AkndpP8yeuaDxb4Qmj7Qr6G8+9UlclJnsBfjecq+0X/ZTICD6a29RcPCo8KCcHzsIZ7vPwrnzx2H83SBahFZxhFO7fDtRzi+rX6Kuneqahu6mF4nQePPbUUZlZk5byKt+mlGcFGSRSfe1RFj3fefackJSICDSDCbxlwyOA7sAcHaK+jk73oZi8o9HOmdtCRT88qrYriooUdex9hAW/mf23OWtCDM9GE7J4vZP4l7xo5J2iWlcVDSUHd3XWRbOBxL9STfKj0oFCA+HOCAGCwPjzMjLoQ9BiVGj5bAGQEkTTRr9ECBhfWGw9C5dFRqeKih4E9vdbvxbugFpNu0SnxMXBW1CEqBRRkAM9TkJDgTjxNRbcPGdZgoV8bXJYv4fBU5cNBHTEebNOqAsW3wZXLmkHxYtmAODl89pgXFwrBfO9SyDQ6M+HD8b/Jp3ePvH6gPDJe7G466j8DI9PjqJfUZInhjqyvS9iolphsELrEYQQ2wA7nP8z3/1wKHtnSMfnT4I7xza1FjF8rkZkzeSTK+8QeGhWrK0H/701iVw4zUL4OahpfAeyQFKvB43P0dOA+z5A8DeowDbjgYnBPIAxeb+ybWXl2cz0SogJkBGJ9nxI4CXn223NjnbhzMnX4N3/VMwNnmgo75wARTZe6/W3LIMbnnvQrjz/ddHQhGl2ZkJgEMjAP93GOB3b/kwMh6+Uny7vO3Pn8QV8WK0k0UUhOTrV7v/6UTnAdn+BMDm/247w/mJE3B0ai+cGQ+DIYsIqqDI7tVJvWQFOqYUCMYH110dGy3STCb4wonN+zpBUU27rNcnCWkXe/5d8z34ynXyU8Cmso80usqubQLiSnfCXdz9PMBz327/7uT4Ljhx+lWYmhGct4pMk7jhiJDEpV6qaVfDwDFLwyydWn27WTBEA2YFJaqIT6p3WD8S65Nmyhu3T/KhJR7861XufujK2QiCn+fY/S2Ak2MAfNQQnUTVqVWjSSx4wsOjILnuhgH4sw8t10qldGY8fEvLL14LahT2ylRxIjC6f4KNN30668d+EZ4vL+2Czy7XGbn9e5wEBFesNn4NYP/BAI6DxzbAxGz5KV0mUZGgsIiCYAwPLYSPfvh6uPTymE0aC3bFWu2V/cFLt+Pqk6z7J600Dt/Swo1DNZrIohOmod8acnMj0TlAcMXq59/tgZHtHmBKdXLs1Y5PBLIUS+ZnuYPiA0zPALjtjmXw4F+vhcs7j19ZwCG6Sfa2yKRCXkx72P5JER/7Reg+MMeDr6xyr2h3DhAsyl94/AT8cfpYAw7+R1wZCoHC1R2qRbeJtOuaoQG4+54hYwW4KZpY2vXiofivYQgBwb2/S2WTUZbG6dYnCMlHFkQX7Um62KqinQLk9S0jsO17C2HHjh+2NqhUDg1GRRQb0YTVKJgWfOKvbi4knUpyFvZ39g1Zz+8KNhtd3z9BSL60zK16xBlAMLV69pHjsPn5TR0nabNAkqboVokoCN1tty2FtR+/FtYML1X11UKvY1/tgNEET7nIQIl6barsjS/t1xWpfe1cmvoEjwx9Z2UXrJ5fqGSthzsDyKYfvQ1Pfm1r6/yU8rENoVjMWp/IloVZKnHFvD4Y/siVcNc9N6fe6DNr7vQJhelowhYm4k4L4zUqH9QSP82IS79R+yNmdUxuzQlAcNXqsS88A8feGmsAgiuILHNWBSW2PuF0UK1PGsZtruNjn2653XLUSO/zydaVXKESTZhj29iNx7aTIgq+lO6rN3XB3QNaQwxuMqSnE4D8/BuvwK++/1pLDfF1n0qQNKnKAooMnkWDrkSNDM4i3CpGk0Y04M6xqe7Ih+7pbk5swoe0+EI+zfmu1fM9ePiW4t+1VTggfPQQXUALFCGsBwaK3kOJiig4y930/qXwwBfWFb50aw6NcEtx0UR07KhoIsIVVZ/ofOz3H27NGEUMCFc4IGL0kI0pb1AGFlcvakT5io1owtcnSdGJ9UuWdr1voPgoUigguHL1zQd+Daf2jMH5mFf18LMZE1SWdon5bdS1ccvCK9ZWO2pEgSJGkyTHzqM+QWi+Oay4omWo5hD1KRQQ3Pf49wd/3fp+wCRITIIiQjL/ivpEDd1oIupv9HwXd16Rjyb3X9MFn11hIFfSbKJQQDC92vhYuzjHMahAogqK6v7JXX+5Ev78/uHK1hppfSMpmpiuT+IK+TV9Hnx12CtsWb0wQDD3feqhLfDKL+Vf3GEbFDRK39VzHdnXSOvC9q+X1Sam066k9tiE+Y3VimmWBVkKAwTrj8fu+xUcO3w6tMQojtE0KDMuBF+Q8+G7VlDUUHAoFk1eOhBeCcy6LKyyG4/dQ1v9y1AXrLtKobOmLuHqGScAEWcS2ThVQFFZ7Zpzw1x44MHbYdFtC62EbUu1oinTa7WjEk3i0q6GfRO+KChuR/4zK4urQ5wBhFlOPIatE1FEUFio/ti9N8Kdn16R+2c1tLzSwZtktUlSmpRmtQvbkr0NUgcQUxNVGBBTrSoa9z//dgvsXC+vQeJACaIJfyCl84EICX66Dgv1O9Ysh9X3XQPXryn4wxqKurh8Gftg1s43ADZyX21nEhSEhLWHdnxkbQ1rEBQADyg+/c9bI/0hazQZvLof1t47BO/9i0UUNQxTF5V2mQbl2ku74JE7wUo6rCJJYSkWdg6PmTz+qV80CvW4n+RoEr4bwVi1dgnc8clbaelWxQsyXMNeHPHsruCdXSy9VX0bZNK3aX3iVq+++yBoF9wL2fxoeC8kyl5JEWXR4j5Y/sFFtDqVweF1b+U/wci/WTUtKPzm41X9Hnx5GOC6vDNjF1axmCFwufepf9oBr/72gLJtRNEZGKvWLaE6Q1lFwxf6AI2X2x0L3rDCPpzFnpJ2WRiXdx/6Ey/f5V2JJIWmWKw/mGr98uHNqSGZt5JSKcNubqQ5rE8QFPYWSPZuYdX6BOG4b7iI1KpzlcoJQFA4jCQv/GAvvPH04ciaBGchjBaDq+Y1VqUW39BvsPjOeQnPiCsmNBIzpLxGizUKe7cwvohbfCURjoDVLQjGsvke3DsEhUUOURdnAOFTrj/8fgz2bh+BC+NTcO74BMwa6IWBqy6DwStnGYYiDy+lZ6AC7EXcI6cA9o0CnBDWZVYsApg7D2B4YXErVjJLuQFIXtOZs75aTwEQGvyJert9vuaS28ANQPJVgp7mogKOzhEEiIvOQn1yRgEFQBxFW1XCkndfdZh0nR0FFACx82BqlRQogwIESBmsRH0sTIFqAkJpVWEO1X5wNYxQTUAccA/qQl4K2AWRALFmR7uG0+u2i33SG0ledxEgeSlNzymlAoYBoRnKihc4Jqtj3UkteZr+xwCSppnUfaQbSIFSKGA4gpRizNRJUkBZAQJEWaoKXEhJQWojEiCpJavLDTWmyaWP3NbF3Wic5VTAkQhierYy3V7JjFvD4dsasiOAlMwBXemuLa9wZXwO9IMAkRqBPM8B33SiC/kBUrjPFd4BJwxOnUinQH6ApOsXXa2gACGvIFLGSwiQjALS7dVWwCAgNJ9V21XqOTqDgNRTQBp1tRUgQKptXxpdRgUIkIwC0u3VVoAAqbZ9aXQZFSBAMgro8u20bJLFOoF6BEgWDeneyitAgFTexDTALAoQIFnUo3srrwABUnkTmxtgHWsaAsSc/zjRUvFOXHwPwGAXCBAn3Np+Jwz6jP3OWniC7vg7AdFtycKgqElSoGgFKIIUbQF6vr4COUzmBIi+eejOiijQ5qyTODuA5EA22ianx1TEDWgYOgrYAUSnJ3QPKeCgAu4CwoUHihQOek5NuuQuIDUxAA3TbQXqCQiFJCteWUVZPX/a98GzolfJGq2ieUtmgsTuqttI/cr4h9YzgiQagi4gBQIFCBDyBFIgRoFaAhKEX1NBuFNdey2TL+etQPkAqbL3VXlseXu2oeeVDxBDA69XM0Serr0JEF3l6L5aKECA1MLMNMhkBeRRlgBJVq74KyhDKswGdgGpkWFrNNTCnLWIB9sFpIgR0TNJAYMK5AsITbMGTUdN5aFAvoDkMaLaPINmmzxMTYDkoXLaZ5DvSxSzJUp8uzUExJbQaSmg68ugQA0BccEsFYG0IsOI8whv2vf9wj8OUgGhKzAEF2YO5/pAEcQ5k0R0iAgsxFIOA0IeUYhH0ENDCjgMCFnKLQWKm7CKezJ9ojC9DxZprfS9bd5Ryk5rj9bIjU3JKIIYUZMa0VHA9ic7dfok3kOAZFGRJuYs6pXi3v8HOZ5zbDYLrEsAAAAASUVORK5CYII=\n"
        }
      },
      "include": "document,order",
      "fields": {
        "orders": "has_signed_contract"
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "94aa15ba-5d55-5108-9355-ed7a65da0874",
    "type": "signatures",
    "attributes": {
      "document_id": "a6c11f5f-c187-40bd-a6e4-578f21141c31",
      "order_id": "19a87214-8c53-4aa1-9201-f8e7f72eb70b",
      "customer_id": "c2fbf00b-3c00-4170-b6a9-b45349d9c98f"
    },
    "relationships": {
      "document": {
        "data": {
          "type": "documents",
          "id": "a6c11f5f-c187-40bd-a6e4-578f21141c31"
        }
      },
      "order": {
        "data": {
          "type": "orders",
          "id": "19a87214-8c53-4aa1-9201-f8e7f72eb70b"
        }
      }
    }
  },
  "included": [
    {
      "id": "a6c11f5f-c187-40bd-a6e4-578f21141c31",
      "type": "documents",
      "attributes": {
        "created_at": "2024-11-18T09:27:57.547706+00:00",
        "updated_at": "2024-11-18T09:27:57.603534+00:00",
        "archived": false,
        "archived_at": null,
        "document_type": "contract",
        "number": 1,
        "prefix": null,
        "prefix_with_number": "1",
        "date": "2024-11-18",
        "due_date": null,
        "name": "John Doe",
        "address": null,
        "reference": null,
        "revised": false,
        "finalized": true,
        "sent": false,
        "confirmed": true,
        "status": "confirmed",
        "signature_url": "/uploads/09ec624ef026cb3e013cef3065aaa172/document/contract/signature/a6c11f5f-c187-40bd-a6e4-578f21141c31/5bb313ab-dc09-45d6-a194-b151f8f5feaa.png",
        "deposit_type": "none",
        "deposit_value": 0.0,
        "tag_list": [],
        "price_in_cents": 0,
        "grand_total_in_cents": 0,
        "grand_total_with_tax_in_cents": 0,
        "discount_in_cents": 0,
        "coupon_discount_in_cents": 0,
        "total_discount_in_cents": 0,
        "deposit_in_cents": 0,
        "deposit_paid_in_cents": 0,
        "deposit_refunded_in_cents": 0,
        "deposit_held_in_cents": 0,
        "deposit_to_refund_in_cents": 0,
        "to_be_paid_in_cents": 0,
        "paid_in_cents": 0,
        "tax_in_cents": 0,
        "discount_percentage": 0.0,
        "order_id": "19a87214-8c53-4aa1-9201-f8e7f72eb70b",
        "customer_id": "c2fbf00b-3c00-4170-b6a9-b45349d9c98f",
        "tax_region_id": null,
        "coupon_id": null
      },
      "relationships": {}
    },
    {
      "id": "19a87214-8c53-4aa1-9201-f8e7f72eb70b",
      "type": "orders",
      "attributes": {
        "has_signed_contract": true
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

POST /api/boomerang/signatures

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=document,order,customer
fields[] Array
List of comma seperated fields to include ?fields[signatures]=document_id,order_id,customer_id

Request body

This request accepts the following body:

Name Description
data[attributes][signature_base64] String
Base64 encoded signature, use this field to store a signature
data[attributes][document_id] Uuid
Associated Document

Includes

This request accepts the following includes:

document

order

customer

Sortings

A convienient way to bulk update positions for supported models.

Fields

Every sorting has the following fields:

Name Description
id Uuid readonly
Primary key
type String_enum writeonly
Type of model to update. Any of bundle_items, default_properties, lines, photos, properties, tax_rates, collection_items, products
ids Array_of_strings writeonly
Array of ids, positions are determined by the order of the array

Sorting a resource

How to update positions:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/sortings' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "sorting",
        "attributes": {
          "type": "default_properties",
          "ids": [
            "bb7f4276-da73-494f-8d73-54b7f5041d92",
            "cd6d9345-70b5-49c7-bb07-0f367d7da7dc",
            "c8beb36c-ecbf-43a6-98cc-ed52272f66ba",
            "59e9fb5f-4855-4e17-a8a0-f224c8cedea7",
            "552d9ad0-341b-4b2c-b015-16e9cf01cf50"
          ]
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "53550759-e6c0-5d3c-b928-aa062ab05149",
    "type": "sortings"
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/sortings

Request body

This request accepts the following body:

Name Description
data[attributes][type] String_enum
Type of model to update. Any of bundle_items, default_properties, lines, photos, properties, tax_rates, collection_items, products
data[attributes][ids] Array_of_strings
Array of ids, positions are determined by the order of the array

Includes

This request does not accept any includes

Stock item plannings

Stock item plannings hold information about the planning of individual stock items (for trackable products). They make it possible to know precisely which stock items have been where and define when an item is available during a given period.

Stock item plannings are never directly created or updated through their resource; instead they are created by booking or specifying stock items; they are updated by starting or stoppinmg them. See the OrderFulfilments resource for examples.

Endpoints

GET /api/boomerang/stock_item_plannings

DELETE /api/boomerang/stock_item_plannings/{id}

Fields

Every stock item planning has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
archived Boolean readonly
Whether stock item planning is archived
archived_at Datetime nullable readonly
When the stock item planning was archived
reserved Boolean readonly
Wheter stock item is reserved, meaning it's unavailable for other orders
started Boolean readonly
Wheter stock item is started
stopped Boolean readonly
Wheter stock item is stopped. Meaning it's available again
stock_item_id Uuid readonly
Associated Stock item
planning_id Uuid readonly
Associated Planning
order_id Uuid readonly
Associated Order

Relationships

Stock item plannings have the following relationships:

Name Description
order Orders readonly
Associated Order
planning Plannings readonly
Associated Planning
stock_item Stock items readonly
Associated Stock item

Listing stock item plannings

How to fetch a list of stock item plannings:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "4ad3c7af-cfa0-43c0-9f34-5daae8a36669",
      "type": "stock_item_plannings",
      "attributes": {
        "created_at": "2024-11-18T09:25:18.245107+00:00",
        "updated_at": "2024-11-18T09:25:18.245107+00:00",
        "archived": false,
        "archived_at": null,
        "reserved": false,
        "started": false,
        "stopped": false,
        "stock_item_id": "eaa2c494-5168-4ad3-836f-aa09f20e5185",
        "planning_id": "870fd7e6-2392-40aa-9134-8c4005e7d04d",
        "order_id": "717daba6-e911-45e7-aa81-fee3bd75a543"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/stock_item_plannings

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=stock_item,planning,order
fields[] Array
List of comma seperated fields to include ?fields[stock_item_plannings]=created_at,updated_at,archived
filter Hash
The filters to apply ?filter[attribute][eq]=value
sort String
How to sort the data ?sort=attribute1,-attribute2
meta Hash
Metadata to send along ?meta[total][]=count
page[number] String
The page to request
page[size] String
The amount of items per page (max 100)

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
reserved Boolean
eq
started Boolean
eq
stopped Boolean
eq
stock_item_id Uuid
eq, not_eq
planning_id Uuid
eq, not_eq
order_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

stock_item => product => photo

planning

order

Archiving a stock_item planning

How to archive a stock item planning:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/stock_item_plannings/bd731992-db6e-4968-8521-3a5188892e90' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "bd731992-db6e-4968-8521-3a5188892e90",
    "type": "stock_item_plannings",
    "attributes": {
      "created_at": "2024-11-18T09:25:17.350471+00:00",
      "updated_at": "2024-11-18T09:25:17.350471+00:00",
      "archived": false,
      "archived_at": null,
      "reserved": false,
      "started": false,
      "stopped": false,
      "stock_item_id": "3f3b5e57-68a2-4e5a-a097-7bc925d3212d",
      "planning_id": "7de7367a-6680-465d-b4bf-fd857af7b5d4",
      "order_id": "28c2c0b5-6654-4672-9a56-41f7badb7d93"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/stock_item_plannings/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Stock items

For trackable products, each stock item is tracked and managed individually. Each stock item has a unique identifier that helps to keep track of it throughout Booqable.

A stock item can have one of the following types:

Endpoints

GET /api/boomerang/stock_items

GET /api/boomerang/stock_items/{id}

POST /api/boomerang/stock_items

PUT /api/boomerang/stock_items/{id}

Fields

Every stock item has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
archived Boolean readonly
Whether item is archived
archived_at Datetime nullable readonly
When the item was archived
identifier String
Unique identifier (like serial number)
status String readonly
Whether item is out with a customer or in-store/warehouse. One of archived, expected, in_stock, started, overdue, expired
from Datetime nullable
When the stock item will be available in stock (temporary items or expected arrival date)
till Datetime nullable
When item will be out of stock (temporary items)
stock_item_type String readonly
Based on the values of from and till. One of regular, temporary
product_group_id String readonly
Unique identifier of the product group this stock item belongs to
properties Hash readonly
A hash containing all basic property values (include properties if you need more detailed information about properties)
properties_attributes Array writeonly
Create or update multiple properties associated with this item
confirm_shortage Boolean writeonly
Whether to confirm a shortage when updating from, till or location of a stock item
product_id Uuid
Associated Product
location_id Uuid
Associated Location

Relationships

Stock items have the following relationships:

Name Description
barcode Barcodes
Associated Barcode
location Locations readonly
Associated Location
product Products
Associated Product
properties Properties readonly
Associated Properties

Listing stock_items

How to fetch a list of stock items:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "27d3da68-1bfa-4130-b850-37896122c717",
      "type": "stock_items",
      "attributes": {
        "created_at": "2024-11-18T09:26:15.656564+00:00",
        "updated_at": "2024-11-18T09:26:15.656564+00:00",
        "archived": false,
        "archived_at": null,
        "identifier": "id1000156",
        "status": "in_stock",
        "from": null,
        "till": null,
        "stock_item_type": "regular",
        "product_group_id": "3b302307-5c29-4daf-bf16-3f16d327a60d",
        "properties": {},
        "product_id": "7eede27c-cd89-45b2-be55-d9642fde97bc",
        "location_id": "03f07e26-3a7a-466c-b8d7-cea91455d54a"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/stock_items

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
identifier String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
status String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
from Datetime
eq, not_eq, gt, gte, lt, lte
till Datetime
eq, not_eq, gt, gte, lt, lte
stock_item_type String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
product_group_id Uuid
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
product_id Uuid
eq, not_eq
location_id Uuid
eq, not_eq
q String
eq

Meta

Results can be aggregated on:

Name Description
total Array
count
stock_item_type Array
count
status Array
count

Includes

This request accepts the following includes:

product

barcode

location

properties

Fetching a stock_item

How to fetch a stock item:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/stock_items/410d787a-23b1-41cf-a879-055256821b56' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "410d787a-23b1-41cf-a879-055256821b56",
    "type": "stock_items",
    "attributes": {
      "created_at": "2024-11-18T09:26:15.000272+00:00",
      "updated_at": "2024-11-18T09:26:15.000272+00:00",
      "archived": false,
      "archived_at": null,
      "identifier": "id1000155",
      "status": "in_stock",
      "from": null,
      "till": null,
      "stock_item_type": "regular",
      "product_group_id": "8809d688-d86d-4b34-abc3-29a3ff30ea4a",
      "properties": {},
      "product_id": "3dd8833c-4a18-4571-b419-77806db6b944",
      "location_id": "c7d2798a-db1e-482d-9a28-e7ba6134cf67"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/stock_items/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

barcode

location

properties

product => product_group

Creating a stock_item

How to create a stock item:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/stock_items' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "stock_items",
        "attributes": {
          "identifier": "12345",
          "product_id": "fdb197d5-81ba-492c-ba43-8938e023cada"
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "93ba9bc4-e135-42fb-8aa9-79cff1d0bfe9",
    "type": "stock_items",
    "attributes": {
      "created_at": "2024-11-18T09:26:14.298427+00:00",
      "updated_at": "2024-11-18T09:26:14.298427+00:00",
      "archived": false,
      "archived_at": null,
      "identifier": "12345",
      "status": "in_stock",
      "from": null,
      "till": null,
      "stock_item_type": "regular",
      "product_group_id": "1ece0599-1bc6-42e4-ac36-765c9e1e7fea",
      "properties": {},
      "product_id": "fdb197d5-81ba-492c-ba43-8938e023cada",
      "location_id": "151e9f3e-e2c7-46ec-88a0-18992482c43a"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/stock_items

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][identifier] String
Unique identifier (like serial number)
data[attributes][from] Datetime
When the stock item will be available in stock (temporary items or expected arrival date)
data[attributes][till] Datetime
When item will be out of stock (temporary items)
data[attributes][properties_attributes][] Array
Create or update multiple properties associated with this item
data[attributes][confirm_shortage] Boolean
Whether to confirm a shortage when updating from, till or location of a stock item
data[attributes][product_id] Uuid
Associated Product
data[attributes][location_id] Uuid
Associated Location

Includes

This request accepts the following includes:

barcode

location

properties

product => product_group

Updating a stock_item

How to update a stock item:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/stock_items/35873521-88a7-48c5-a989-5ade6ce13645' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "35873521-88a7-48c5-a989-5ade6ce13645",
        "type": "stock_items",
        "attributes": {
          "identifier": "12346"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "35873521-88a7-48c5-a989-5ade6ce13645",
    "type": "stock_items",
    "attributes": {
      "created_at": "2024-11-18T09:26:16.309527+00:00",
      "updated_at": "2024-11-18T09:26:16.370862+00:00",
      "archived": false,
      "archived_at": null,
      "identifier": "12346",
      "status": "in_stock",
      "from": null,
      "till": null,
      "stock_item_type": "regular",
      "product_group_id": "06c3c62a-1a8e-4b0b-b44b-239fd76f907a",
      "properties": {},
      "product_id": "7daf2d45-a4d5-490e-8153-832697031d53",
      "location_id": "56c86c9b-78e4-4642-af19-1d8cadc34c7b"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/stock_items/{id}

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][identifier] String
Unique identifier (like serial number)
data[attributes][from] Datetime
When the stock item will be available in stock (temporary items or expected arrival date)
data[attributes][till] Datetime
When item will be out of stock (temporary items)
data[attributes][properties_attributes][] Array
Create or update multiple properties associated with this item
data[attributes][confirm_shortage] Boolean
Whether to confirm a shortage when updating from, till or location of a stock item
data[attributes][product_id] Uuid
Associated Product
data[attributes][location_id] Uuid
Associated Location

Includes

This request accepts the following includes:

barcode

location

properties

product => product_group

Stock item archivations

Archives a stock item.

Archivation is final and can not be undone.

When the request fails, the error.code attribute can have the following values:

Fields

Every stock item archivation has the following fields:

Name Description
id Uuid readonly
Primary key
confirm_shortage Boolean writeonly
A value of true overrides shortage warnings.
stock_item_id Uuid
ID of the stock item that needs to be archived.

Relationships

Stock item archivations have the following relationships:

Name Description
stock_item Stock items
Associated Stock item

Archive

When the StockItem is not used, it can be archived:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/stock_item_archivations' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "stock_item_archivations",
        "attributes": {
          "stock_item_id": "de1bdad3-3e09-46f4-b6bc-1af0410fc57a"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "8c6daf03-caa7-54e3-9eac-a2a8fa0640e7",
    "type": "stock_item_archivations",
    "attributes": {
      "stock_item_id": "de1bdad3-3e09-46f4-b6bc-1af0410fc57a"
    },
    "relationships": {}
  },
  "meta": {}
}

When the StockItem was already archived:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/stock_item_archivations' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "stock_item_archivations",
        "attributes": {
          "stock_item_id": "9558b000-cc4e-426a-9300-d4aa018c9990"
        }
      }
    }'

A 422 status response looks like this:

  {
  "errors": [
    {
      "code": "stock_item_archived",
      "status": "422",
      "title": "Stock item archived",
      "detail": "Stock item is already archived",
      "meta": null
    }
  ]
}

When the StockItem is specified on a reserved Order:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/stock_item_archivations' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "stock_item_archivations",
        "attributes": {
          "stock_item_id": "85634a3e-fd0c-471f-9796-6a069eecd00a"
        }
      }
    }'

A 422 status response looks like this:

  {
  "errors": [
    {
      "code": "stock_item_specified",
      "status": "422",
      "title": "Stock item specified",
      "detail": "This stock item is specified on a current or future order",
      "meta": {
        "blocking": [
          {
            "order_ids": [
              "596a1911-d691-4f05-bd83-ad09c5e19b8c"
            ]
          }
        ]
      }
    }
  ]
}

When archival would create unallowed shortage:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/stock_item_archivations' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "stock_item_archivations",
        "attributes": {
          "stock_item_id": "0eb8bfd3-7011-4025-8a5a-f404ba1c89f3"
        }
      }
    }'

A 422 status response looks like this:

  {
  "errors": [
    {
      "code": "shortage",
      "status": "422",
      "title": "Shortage",
      "detail": "This will create shortage for running or future orders",
      "meta": {
        "warning": [],
        "blocking": [
          {
            "reason": "shortage",
            "shortage": 1,
            "item_id": "42decec4-28d1-4d4c-9ef2-b597653a3226",
            "mutation": -1,
            "order_ids": [
              "1da148f8-695d-4319-964e-7d0eb5d0c942"
            ],
            "location_id": "3c2bb066-ed8c-47d9-95d8-49f0d681e46a",
            "available": 0,
            "plannable": 0,
            "stock_count": 1,
            "planned": 1,
            "needed": 1,
            "cluster_available": 0,
            "cluster_plannable": 0,
            "cluster_stock_count": 1,
            "cluster_planned": 1,
            "cluster_needed": 1
          }
        ]
      }
    }
  ]
}

When archival would create allowed shortage, but confirm_shortage is unspecified:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/stock_item_archivations' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "stock_item_archivations",
        "attributes": {
          "stock_item_id": "394f9a6b-1d12-40f7-abbc-caa3b1ceaf56"
        }
      }
    }'

A 422 status response looks like this:

  {
  "errors": [
    {
      "code": "shortage",
      "status": "422",
      "title": "Shortage",
      "detail": "This will create shortage for running or future orders",
      "meta": {
        "warning": [
          {
            "reason": "shortage",
            "shortage": 1,
            "item_id": "d8c3a49b-974d-4ec0-9d96-600c35d70070",
            "mutation": -1,
            "order_ids": [
              "f43e2a7e-52f5-450a-b463-f681e89799ec"
            ],
            "location_id": "28400993-31cc-4908-8608-fa6a5f672c64",
            "available": 0,
            "plannable": 1,
            "stock_count": 1,
            "planned": 1,
            "needed": 1,
            "cluster_available": 0,
            "cluster_plannable": 1,
            "cluster_stock_count": 1,
            "cluster_planned": 1,
            "cluster_needed": 1
          }
        ],
        "blocking": []
      }
    }
  ]
}

When archival would create allowed shortage, and confirm_shortage is true:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/stock_item_archivations' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "stock_item_archivations",
        "attributes": {
          "stock_item_id": "05968e4b-5e3f-417f-a5d6-6093b5ba1ddd",
          "confirm_shortage": true
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "0c22ff21-7325-5fc7-8078-1384e5ad4772",
    "type": "stock_item_archivations",
    "attributes": {
      "stock_item_id": "05968e4b-5e3f-417f-a5d6-6093b5ba1ddd"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/stock_item_archivations

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=stock_item
fields[] Array
List of comma seperated fields to include ?fields[stock_item_archivations]=stock_item_id

Request body

This request accepts the following body:

Name Description
data[attributes][confirm_shortage] Boolean
A value of true overrides shortage warnings.
data[attributes][stock_item_id] Uuid
ID of the stock item that needs to be archived.

Includes

This request accepts the following includes:

stock_item

Stock item suggestions

Use stock item suggestions to figure out which stock item can be booked, started, or stopped.

The suggestions are sorted: 1. Temporary stock items are sorted before permanent stock items. 2. Available stock items are sorted before overdue, unavailable and already_booked stock items. 3. Equally relevant stock items are sorted by the identifier.

Fields

Every stock item suggestion has the following fields:

Name Description
id Uuid readonly
Primary key
stock_item_id Uuid
ID of the suggested stock item.
item_id Uuid readonly
ID of the Product the suggested stock item belongs to.
status String_enum readonly
Status of the suggested stock item. One of available_in_location, available_in_cluster, overdue, unavailable, already_booked

Relationships

Stock item suggestions have the following relationships:

Name Description
stock_item Stock items readonly
Associated Stock item

Listing stock item suggestions

Retrieve stock item suggestions for booking:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/stock_item_suggestions?filter%5Baction%5D=book&filter%5Bitem_id%5D=ddf5186e-09ad-4294-97bd-7af70a2b6d8a&filter%5Border_id%5D=46bec75b-a35b-4bf8-bc2d-e4506dc330db' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "41bf5a91-0b08-5314-a67f-f03c6d431fc3",
      "type": "stock_item_suggestions",
      "attributes": {
        "stock_item_id": "38b0aaa1-a169-4605-9ab3-b7d9c780be6b",
        "item_id": "ddf5186e-09ad-4294-97bd-7af70a2b6d8a",
        "status": "available_in_location"
      },
      "relationships": {}
    },
    {
      "id": "8c16ba54-f162-550a-acf5-b72602115dd5",
      "type": "stock_item_suggestions",
      "attributes": {
        "stock_item_id": "c3d58a50-3f57-48a2-8cf1-4ac6b7f85f63",
        "item_id": "ddf5186e-09ad-4294-97bd-7af70a2b6d8a",
        "status": "already_booked"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/stock_item_suggestions

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
item_id Uuid required
eq
status String_enum
eq
order_id Uuid required
eq
action String_enum required
eq
q String
eq
location_id Uuid
eq
from Datetime
eq
till Datetime
eq
stock_item_id Uuid
eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

stock_item

Tags

Tags are designed to find specific resources faster. They can be added to the following resources by supplying a tag_list.

Fields

Every tag has the following fields:

Name Description
id Uuid readonly
Primary key
for String writeonly
The resource to show the tag counts for. One of Order, Customer, ProductGroup, Bundle, Document
name String
Name of the tag
count Integer
Total count

Listing tags

How to fetch a list of tags with their counts:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/tags?filter%5Bfor%5D=Order' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "bcbe3816-3813-43f6-a513-fde09d143179",
      "type": "tags",
      "attributes": {
        "name": "vip",
        "count": 1
      }
    },
    {
      "id": "62f4b42e-b436-43c4-aeff-d432fca8e2cf",
      "type": "tags",
      "attributes": {
        "name": "webshop",
        "count": 3
      }
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/tags

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
for String
eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request does not accept any includes

Tax categories

You can create different tax categories and assign them according to the tax requirements of a product. The tax rates in the category are charged over a product when it's added to an order. An order's total tax rate is the sum of all product taxes on that order.

Endpoints

GET /api/boomerang/tax_categories

GET /api/boomerang/tax_categories/{id}

POST /api/boomerang/tax_categories

PUT /api/boomerang/tax_categories/{id}

DELETE /api/boomerang/tax_categories/{id}

Fields

Every tax category has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
archived Boolean readonly
Whether tax category is archived
archived_at Datetime nullable readonly
When the tax category was archived
name String
Name of the tax category
default Boolean
Whether this is the default tax category. Setting this value to true will set other tax categories to false
tax_rates_attributes Array writeonly
The tax rates to associate

Relationships

Tax categories have the following relationships:

Name Description
tax_rates Tax rates readonly
Associated Tax rates

Listing tax categories

How to fetch a list of tax categories:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "349f0d0a-2b72-4076-83f0-306c2fbc61e5",
      "type": "tax_categories",
      "attributes": {
        "created_at": "2024-11-18T09:23:18.814015+00:00",
        "updated_at": "2024-11-18T09:23:18.817262+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Sales Tax",
        "default": false
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/tax_categories

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
default Boolean
eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

tax_rates

Fetching a tax category

How to fetch a tax categories with it's tax rates:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/tax_categories/aebae488-57b7-4008-aab4-a46d38891e82?include=tax_rates' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "aebae488-57b7-4008-aab4-a46d38891e82",
    "type": "tax_categories",
    "attributes": {
      "created_at": "2024-11-18T09:23:20.142078+00:00",
      "updated_at": "2024-11-18T09:23:20.145391+00:00",
      "archived": false,
      "archived_at": null,
      "name": "Sales Tax",
      "default": false
    },
    "relationships": {
      "tax_rates": {
        "data": [
          {
            "type": "tax_rates",
            "id": "a74ecde5-55dc-44f4-9614-06e40cee4387"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "a74ecde5-55dc-44f4-9614-06e40cee4387",
      "type": "tax_rates",
      "attributes": {
        "created_at": "2024-11-18T09:23:20.143771+00:00",
        "updated_at": "2024-11-18T09:23:20.143771+00:00",
        "name": "VAT",
        "value": 21.0,
        "position": 1,
        "owner_id": "aebae488-57b7-4008-aab4-a46d38891e82",
        "owner_type": "tax_categories"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/tax_categories/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=tax_rates
fields[] Array
List of comma seperated fields to include ?fields[tax_categories]=created_at,updated_at,archived

Includes

This request accepts the following includes:

tax_rates

Creating a tax category

How to create a tax category with tax rates:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/tax_categories' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "tax_categories",
        "attributes": {
          "name": "Sales Tax",
          "tax_rates_attributes": [
            {
              "name": "VAT",
              "value": 21
            }
          ]
        }
      },
      "include": "tax_rates"
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "71ed86bf-3e3e-49f3-992c-5521ee1d431f",
    "type": "tax_categories",
    "attributes": {
      "created_at": "2024-11-18T09:23:20.607418+00:00",
      "updated_at": "2024-11-18T09:23:20.610466+00:00",
      "archived": false,
      "archived_at": null,
      "name": "Sales Tax",
      "default": false
    },
    "relationships": {
      "tax_rates": {
        "data": [
          {
            "type": "tax_rates",
            "id": "4eb439da-3ddc-45ce-a9ab-00a65a4922a2"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "4eb439da-3ddc-45ce-a9ab-00a65a4922a2",
      "type": "tax_rates",
      "attributes": {
        "created_at": "2024-11-18T09:23:20.609011+00:00",
        "updated_at": "2024-11-18T09:23:20.609011+00:00",
        "name": "VAT",
        "value": 21.0,
        "position": 1,
        "owner_id": "71ed86bf-3e3e-49f3-992c-5521ee1d431f",
        "owner_type": "tax_categories"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

POST /api/boomerang/tax_categories

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=tax_rates
fields[] Array
List of comma seperated fields to include ?fields[tax_categories]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the tax category
data[attributes][default] Boolean
Whether this is the default tax category. Setting this value to true will set other tax categories to false
data[attributes][tax_rates_attributes][] Array
The tax rates to associate

Includes

This request accepts the following includes:

tax_rates

Updating a tax category

How to update a tax category with tax rates:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/tax_categories/c8aaf27a-51df-409b-8bd7-ef4eb91b2ed7' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "c8aaf27a-51df-409b-8bd7-ef4eb91b2ed7",
        "type": "tax_categories",
        "attributes": {
          "name": "State Tax",
          "tax_rates_attributes": [
            {
              "name": "VAT",
              "value": 9
            },
            {
              "id": "9b46c068-cd32-4330-9fa5-42b378ff1e24",
              "_destroy": true
            }
          ]
        }
      },
      "include": "tax_rates"
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "c8aaf27a-51df-409b-8bd7-ef4eb91b2ed7",
    "type": "tax_categories",
    "attributes": {
      "created_at": "2024-11-18T09:23:19.691221+00:00",
      "updated_at": "2024-11-18T09:23:19.734007+00:00",
      "archived": false,
      "archived_at": null,
      "name": "State Tax",
      "default": false
    },
    "relationships": {
      "tax_rates": {
        "data": [
          {
            "type": "tax_rates",
            "id": "8309c68c-be4f-4fe7-9f4f-305517860040"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "8309c68c-be4f-4fe7-9f4f-305517860040",
      "type": "tax_rates",
      "attributes": {
        "created_at": "2024-11-18T09:23:19.732562+00:00",
        "updated_at": "2024-11-18T09:23:19.732562+00:00",
        "name": "VAT",
        "value": 9.0,
        "position": 2,
        "owner_id": "c8aaf27a-51df-409b-8bd7-ef4eb91b2ed7",
        "owner_type": "tax_categories"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

PUT /api/boomerang/tax_categories/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=tax_rates
fields[] Array
List of comma seperated fields to include ?fields[tax_categories]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the tax category
data[attributes][default] Boolean
Whether this is the default tax category. Setting this value to true will set other tax categories to false
data[attributes][tax_rates_attributes][] Array
The tax rates to associate

Includes

This request accepts the following includes:

tax_rates

Deleting a tax category

How to delete a tax category with tax rates:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/tax_categories/80917815-7038-490b-ba8c-89c2601dfb46' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "80917815-7038-490b-ba8c-89c2601dfb46",
    "type": "tax_categories",
    "attributes": {
      "created_at": "2024-11-18T09:23:19.245783+00:00",
      "updated_at": "2024-11-18T09:23:19.266063+00:00",
      "archived": true,
      "archived_at": "2024-11-18T09:23:19.266063+00:00",
      "name": "Sales Tax (Deleted)",
      "default": false
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/tax_categories/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Tax rates

Tax rates are always assigned to either a TaxRegion or TaxCategory. Tax rates define the individual rates that will be taxed.

Endpoints

GET api/boomerang/tax_rates

GET /api/boomerang/tax_rates/{id}

POST /api/boomerang/tax_rates

PUT /api/boomerang/tax_rates/{id}

DELETE /api/boomerang/tax_rates/{id}

Fields

Every tax rate has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
name String
The name of the tax rate
value Float
The percentage value of the rate
position Integer readonly
Position of the tax rate
owner_id Uuid
ID of its owner
owner_type String
The resource type of the owner. One of tax_regions, tax_categories

Relationships

Tax rates have the following relationships:

Name Description
owner Tax category, Tax region
Associated Owner

Listing tax rates

How to fetch a list of tax rates:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "0883b333-57c5-4bfe-88ec-5c3ec45b520a",
      "type": "tax_rates",
      "attributes": {
        "created_at": "2024-11-18T09:24:06.523068+00:00",
        "updated_at": "2024-11-18T09:24:06.523068+00:00",
        "name": "VAT",
        "value": 21.0,
        "position": 1,
        "owner_id": "40aecc65-50b4-464c-922a-f0325590b137",
        "owner_type": "tax_regions"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET api/boomerang/tax_rates

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
owner_id Uuid
eq, not_eq
owner_type String
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

owner

Fetching a tax rate

How to fetch a tax rate:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/tax_rates/59fe4a07-97e6-493a-a1bd-e048819417ef?include=owner' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "59fe4a07-97e6-493a-a1bd-e048819417ef",
    "type": "tax_rates",
    "attributes": {
      "created_at": "2024-11-18T09:24:05.624698+00:00",
      "updated_at": "2024-11-18T09:24:05.624698+00:00",
      "name": "VAT",
      "value": 21.0,
      "position": 1,
      "owner_id": "b982f9e1-5f21-474b-be9d-3d31bf59d26b",
      "owner_type": "tax_regions"
    },
    "relationships": {
      "owner": {
        "data": {
          "type": "tax_regions",
          "id": "b982f9e1-5f21-474b-be9d-3d31bf59d26b"
        }
      }
    }
  },
  "included": [
    {
      "id": "b982f9e1-5f21-474b-be9d-3d31bf59d26b",
      "type": "tax_regions",
      "attributes": {
        "created_at": "2024-11-18T09:24:05.615797+00:00",
        "updated_at": "2024-11-18T09:24:05.626470+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Sales Tax",
        "strategy": "add_to",
        "default": false
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/tax_rates/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

owner

Creating a tax rate

How to create a tax rate and associate it with an owner:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/tax_rates' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "tax_rates",
        "attributes": {
          "name": "VAT",
          "value": 21,
          "owner_id": "8db3da14-c12f-4e41-8956-bc75f56caa31",
          "owner_type": "tax_regions"
        }
      },
      "include": "owner"
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "045d17c5-27c1-457c-8262-e2d5c1c1e5a5",
    "type": "tax_rates",
    "attributes": {
      "created_at": "2024-11-18T09:24:06.993735+00:00",
      "updated_at": "2024-11-18T09:24:06.993735+00:00",
      "name": "VAT",
      "value": 21.0,
      "position": 1,
      "owner_id": "8db3da14-c12f-4e41-8956-bc75f56caa31",
      "owner_type": "tax_regions"
    },
    "relationships": {
      "owner": {
        "data": {
          "type": "tax_regions",
          "id": "8db3da14-c12f-4e41-8956-bc75f56caa31"
        }
      }
    }
  },
  "included": [
    {
      "id": "8db3da14-c12f-4e41-8956-bc75f56caa31",
      "type": "tax_regions",
      "attributes": {
        "created_at": "2024-11-18T09:24:06.975064+00:00",
        "updated_at": "2024-11-18T09:24:06.995196+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Sales Tax",
        "strategy": "add_to",
        "default": false
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

POST /api/boomerang/tax_rates

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
The name of the tax rate
data[attributes][value] Float
The percentage value of the rate
data[attributes][owner_id] Uuid
ID of its owner
data[attributes][owner_type] String
The resource type of the owner. One of tax_regions, tax_categories

Includes

This request accepts the following includes:

owner

Updating a tax rate

How to update a tax rate:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/tax_rates/2ce5eee8-98b6-45bd-a646-bc3f43cdb322' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "2ce5eee8-98b6-45bd-a646-bc3f43cdb322",
        "type": "tax_rates",
        "attributes": {
          "value": 9
        }
      },
      "include": "owner"
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "2ce5eee8-98b6-45bd-a646-bc3f43cdb322",
    "type": "tax_rates",
    "attributes": {
      "created_at": "2024-11-18T09:24:06.073950+00:00",
      "updated_at": "2024-11-18T09:24:06.095465+00:00",
      "name": "Vat",
      "value": 9.0,
      "position": 1,
      "owner_id": "90a0bd99-8928-4f22-ab38-163a219ac9f0",
      "owner_type": "tax_categories"
    },
    "relationships": {
      "owner": {
        "data": {
          "type": "tax_categories",
          "id": "90a0bd99-8928-4f22-ab38-163a219ac9f0"
        }
      }
    }
  },
  "included": [
    {
      "id": "90a0bd99-8928-4f22-ab38-163a219ac9f0",
      "type": "tax_categories",
      "attributes": {
        "created_at": "2024-11-18T09:24:06.061674+00:00",
        "updated_at": "2024-11-18T09:24:06.097071+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Sales Tax",
        "default": false
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

PUT /api/boomerang/tax_rates/{id}

Request params

This request accepts the following parameters:

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

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
The name of the tax rate
data[attributes][value] Float
The percentage value of the rate
data[attributes][owner_id] Uuid
ID of its owner
data[attributes][owner_type] String
The resource type of the owner. One of tax_regions, tax_categories

Includes

This request accepts the following includes:

owner

Deleting a tax rate

How to delete a tax rate:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/tax_rates/c91c91ae-a492-48e3-b1a6-89a1804c400b' \
    --header 'content-type: application/json' \
    --data '{}'

A 200 status response looks like this:

  {
  "data": {
    "id": "c91c91ae-a492-48e3-b1a6-89a1804c400b",
    "type": "tax_rates",
    "attributes": {
      "created_at": "2024-11-18T09:24:07.402149+00:00",
      "updated_at": "2024-11-18T09:24:07.402149+00:00",
      "name": "VAT",
      "value": 21.0,
      "position": 1,
      "owner_id": "32eb80c0-f05b-4812-8d53-830838af718d",
      "owner_type": "tax_regions"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/tax_rates/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Tax regions

You can create tax regions for specific customers. Booqable's tax system supports adding, replacing and compounding rates. A tax region can have one of the following strategies:

Endpoints

GET /api/boomerang/tax_regions

GET /api/boomerang/tax_regions/{id}

POST /api/boomerang/tax_regions

PUT /api/boomerang/tax_regions/{id}

DELETE /api/boomerang/tax_regions/{id}

Fields

Every tax region has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
archived Boolean readonly
Whether tax region is archived
archived_at Datetime nullable readonly
When the tax region was archived
name String
Name of the tax region
strategy String
The strategy to apply. One of add_to, replace, compound
default Boolean
Whether this is the default tax region. Setting this value to true will set other tax regions to false
tax_rates_attributes Array writeonly
The tax rates to associate

Relationships

Tax regions have the following relationships:

Name Description
tax_rates Tax rates readonly
Associated Tax rates

Listing tax regions

How to fetch a list of tax regions:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "34b197fd-c8b8-44ad-bd1d-e1283be2c201",
      "created_at": "2024-11-18T09:28:03.363145+00:00",
      "updated_at": "2024-11-18T09:28:03.366263+00:00",
      "archived": false,
      "archived_at": null,
      "name": "Sales Tax",
      "strategy": "add_to",
      "default": false
    }
  ]
}

HTTP Request

GET /api/boomerang/tax_regions

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
archived Boolean
eq
archived_at Datetime
eq, not_eq, gt, gte, lt, lte
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
strategy String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
default Boolean
eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

tax_rates

Fetching a tax region

How to fetch a tax regions with it's tax rates:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/tax_regions/5123b41e-7b6e-4cc1-9e0c-d02294258572?include=tax_rates' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "5123b41e-7b6e-4cc1-9e0c-d02294258572",
    "created_at": "2024-11-18T09:28:02.106182+00:00",
    "updated_at": "2024-11-18T09:28:02.110333+00:00",
    "archived": false,
    "archived_at": null,
    "name": "Sales Tax",
    "strategy": "add_to",
    "default": false,
    "tax_rates": [
      {
        "id": "91d9a099-4952-4949-ab94-7cebdb5df0af",
        "created_at": "2024-11-18T09:28:02.108504+00:00",
        "updated_at": "2024-11-18T09:28:02.108504+00:00",
        "name": "VAT",
        "value": 21.0,
        "position": 1,
        "owner_id": "5123b41e-7b6e-4cc1-9e0c-d02294258572",
        "owner_type": "tax_regions"
      }
    ]
  }
}

HTTP Request

GET /api/boomerang/tax_regions/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=tax_rates
fields[] Array
List of comma seperated fields to include ?fields[tax_regions]=created_at,updated_at,archived

Includes

This request accepts the following includes:

tax_rates

Creating a tax region

How to create a tax region with tax rates:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/tax_regions' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "tax_regions",
        "attributes": {
          "name": "Sales Tax",
          "strategy": "compound",
          "tax_rates_attributes": [
            {
              "name": "VAT",
              "value": 21
            }
          ]
        }
      },
      "include": "tax_rates"
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "f767e440-c51f-4d7c-b8ea-ce478da4824a",
    "type": "tax_regions",
    "attributes": {
      "created_at": "2024-11-18T09:28:01.670717+00:00",
      "updated_at": "2024-11-18T09:28:01.673312+00:00",
      "archived": false,
      "archived_at": null,
      "name": "Sales Tax",
      "strategy": "compound",
      "default": false
    },
    "relationships": {
      "tax_rates": {
        "data": [
          {
            "type": "tax_rates",
            "id": "b32d3af4-c932-4979-b3df-aa1c023dc1c0"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "b32d3af4-c932-4979-b3df-aa1c023dc1c0",
      "type": "tax_rates",
      "attributes": {
        "created_at": "2024-11-18T09:28:01.672044+00:00",
        "updated_at": "2024-11-18T09:28:01.672044+00:00",
        "name": "VAT",
        "value": 21.0,
        "position": 1,
        "owner_id": "f767e440-c51f-4d7c-b8ea-ce478da4824a",
        "owner_type": "tax_regions"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

POST /api/boomerang/tax_regions

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=tax_rates
fields[] Array
List of comma seperated fields to include ?fields[tax_regions]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the tax region
data[attributes][strategy] String
The strategy to apply. One of add_to, replace, compound
data[attributes][default] Boolean
Whether this is the default tax region. Setting this value to true will set other tax regions to false
data[attributes][tax_rates_attributes][] Array
The tax rates to associate

Includes

This request accepts the following includes:

tax_rates

Updating a tax region

How to update a tax region with tax rates:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/tax_regions/3cbdc8ec-d9d1-4349-8360-512e12f18835' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "3cbdc8ec-d9d1-4349-8360-512e12f18835",
        "type": "tax_regions",
        "attributes": {
          "name": "State Tax",
          "tax_rates_attributes": [
            {
              "name": "VAT",
              "value": 9
            },
            {
              "id": "6949f5f5-6bb2-4411-9e27-af746ae42f6e",
              "_destroy": true
            }
          ]
        }
      },
      "include": "tax_rates"
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "3cbdc8ec-d9d1-4349-8360-512e12f18835",
    "type": "tax_regions",
    "attributes": {
      "created_at": "2024-11-18T09:28:02.913348+00:00",
      "updated_at": "2024-11-18T09:28:02.951507+00:00",
      "archived": false,
      "archived_at": null,
      "name": "State Tax",
      "strategy": "add_to",
      "default": false
    },
    "relationships": {
      "tax_rates": {
        "data": [
          {
            "type": "tax_rates",
            "id": "aba909af-b1c6-49de-bda0-206fa16634a3"
          }
        ]
      }
    }
  },
  "included": [
    {
      "id": "aba909af-b1c6-49de-bda0-206fa16634a3",
      "type": "tax_rates",
      "attributes": {
        "created_at": "2024-11-18T09:28:02.950153+00:00",
        "updated_at": "2024-11-18T09:28:02.950153+00:00",
        "name": "VAT",
        "value": 9.0,
        "position": 2,
        "owner_id": "3cbdc8ec-d9d1-4349-8360-512e12f18835",
        "owner_type": "tax_regions"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

PUT /api/boomerang/tax_regions/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=tax_rates
fields[] Array
List of comma seperated fields to include ?fields[tax_regions]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][name] String
Name of the tax region
data[attributes][strategy] String
The strategy to apply. One of add_to, replace, compound
data[attributes][default] Boolean
Whether this is the default tax region. Setting this value to true will set other tax regions to false
data[attributes][tax_rates_attributes][] Array
The tax rates to associate

Includes

This request accepts the following includes:

tax_rates

Deleting a tax region

How to delete a tax region with tax rates:

  curl --request DELETE \
    --url 'https://example.booqable.com/api/boomerang/tax_regions/24ad741f-56a2-484e-b1a0-d2291c3ee1b5' \
    --header 'content-type: application/json' \
    --data '{}'

A 200 status response looks like this:

  {
  "data": {
    "id": "24ad741f-56a2-484e-b1a0-d2291c3ee1b5",
    "type": "tax_regions",
    "attributes": {
      "created_at": "2024-11-18T09:28:02.470529+00:00",
      "updated_at": "2024-11-18T09:28:02.485857+00:00",
      "archived": true,
      "archived_at": "2024-11-18T09:28:02.485857+00:00",
      "name": "Sales Tax (Deleted)",
      "strategy": "add_to",
      "default": false
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

DELETE /api/boomerang/tax_regions/{id}

Request params

This request accepts the following parameters:

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

Includes

This request does not accept any includes

Tax values

Tax values are always generated automatically by price calculations for orders and carts. They hold information about the amount taxed for a specific rate.

Endpoints

GET api/boomerang/tax_values

GET /api/boomerang/tax_values/{id}

Fields

Every tax value has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
name String readonly
Name of the tax rate
percentage Float readonly
The percentage taxed
value_in_cents Integer readonly
Amount of tax in cents
tax_rate_id Uuid readonly
Associated Tax rate
owner_id Uuid readonly
ID of its owner
owner_type String readonly
The resource type of the owner. One of orders, documents, carts, lines

Relationships

Tax values have the following relationships:

Name Description
owner Order
Associated Owner
tax_rate Tax rates readonly
Associated Tax rate

Listing tax values

How to fetch a list of tax values:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "d15038c8-c532-4029-80c9-4650118f3973",
      "type": "tax_values",
      "attributes": {
        "created_at": "2024-11-18T09:28:03.800207+00:00",
        "updated_at": "2024-11-18T09:28:03.800207+00:00",
        "name": "VAT 19%",
        "percentage": 19.0,
        "value_in_cents": 13800,
        "tax_rate_id": "9b812d59-2f4b-4c95-86ef-dd27b477ca74",
        "owner_id": "7e1fd780-17fa-4eed-bf93-9fda23c4dcb9",
        "owner_type": "orders"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET api/boomerang/tax_values

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
percentage Float
eq, not_eq, gt, gte, lt, lte
value_in_cents Integer
eq, not_eq, gt, gte, lt, lte
tax_rate_id Uuid
eq, not_eq
owner_id Uuid
eq, not_eq
owner_type String
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count
value_in_cents Array
sum, maximum, minimum, average

Includes

This request does not accept any includes

Fetching a tax value

How to fetch a tax value:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/tax_values/c4cc4ad7-e838-4742-899c-215b8512b769?include=owner' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "c4cc4ad7-e838-4742-899c-215b8512b769",
    "type": "tax_values",
    "attributes": {
      "created_at": "2024-11-18T09:28:04.262227+00:00",
      "updated_at": "2024-11-18T09:28:04.262227+00:00",
      "name": "VAT 19%",
      "percentage": 19.0,
      "value_in_cents": 13800,
      "tax_rate_id": "c86e8762-9c53-4da3-a68c-aaa29e0acecc",
      "owner_id": "f7f1be2d-2e4e-464e-859b-4efaed5df699",
      "owner_type": "orders"
    },
    "relationships": {
      "owner": {
        "data": {
          "type": "orders",
          "id": "f7f1be2d-2e4e-464e-859b-4efaed5df699"
        }
      }
    }
  },
  "included": [
    {
      "id": "f7f1be2d-2e4e-464e-859b-4efaed5df699",
      "type": "orders",
      "attributes": {
        "created_at": "2024-11-18T09:28:04.238783+00:00",
        "updated_at": "2024-11-18T09:28:04.238783+00:00",
        "number": null,
        "status": "new",
        "statuses": [
          "new"
        ],
        "status_counts": {
          "new": 0,
          "concept": 0,
          "reserved": 0,
          "started": 0,
          "stopped": 0
        },
        "starts_at": "2024-11-16T09:15:00.000000+00:00",
        "stops_at": "2024-11-20T09:15:00.000000+00:00",
        "deposit_type": "percentage",
        "deposit_value": 100.0,
        "entirely_started": true,
        "entirely_stopped": false,
        "location_shortage": false,
        "shortage": false,
        "payment_status": "paid",
        "override_period_restrictions": false,
        "has_signed_contract": false,
        "tag_list": [],
        "properties": {},
        "price_in_cents": 0,
        "grand_total_in_cents": 0,
        "grand_total_with_tax_in_cents": 0,
        "tax_in_cents": 0,
        "discount_in_cents": 0,
        "coupon_discount_in_cents": 0,
        "total_discount_in_cents": 0,
        "deposit_in_cents": 0,
        "deposit_paid_in_cents": 0,
        "deposit_refunded_in_cents": 0,
        "deposit_held_in_cents": 0,
        "deposit_to_refund_in_cents": 0,
        "to_be_paid_in_cents": 0,
        "paid_in_cents": 0,
        "discount_type": "percentage",
        "discount_percentage": 0.0,
        "billing_address_property_id": null,
        "fulfillment_type": "pickup",
        "customer_id": null,
        "tax_region_id": null,
        "coupon_id": null,
        "start_location_id": "92e3d60b-dcfb-4f8e-a379-e587afc8dc78",
        "stop_location_id": "92e3d60b-dcfb-4f8e-a379-e587afc8dc78"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/tax_values/{id}

Request params

This request accepts the following parameters:

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

Includes

This request accepts the following includes:

owner

Transfers

When an order causes a shortage for a location and that shortage can be solved by the inventory in the cluster, one or multiple transfers are created.

Fields

Every transfer has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
quantity Integer readonly
Quantity of items being transfered
available_at Datetime readonly
Date when item should be available at destination location
finalized Boolean readonly
Whether or not the transfer has completed
item_id Uuid readonly
ID of the product being transfered
order_id Uuid readonly
Order the item is being transfered for
source_location_id Uuid readonly
Location item is being transfered from
destination_location_id Uuid readonly
Location item is being transfered to

Relationships

Transfers have the following relationships:

Name Description
destination_location Locations readonly
Associated Destination location
item Items readonly
Associated Item
order Orders readonly
Associated Order
source_location Locations readonly
Associated Source location

Listing transfers

How to fetch a list of transfers:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "9d597fd3-732a-4dc2-99d6-fabd2a9fc6da",
      "type": "transfers",
      "attributes": {
        "created_at": "2024-11-18T09:25:53.486812+00:00",
        "updated_at": "2024-11-18T09:25:53.486812+00:00",
        "quantity": 1,
        "available_at": "2024-11-16T09:15:00.000000+00:00",
        "finalized": false,
        "item_id": "ebd4c0f1-6e59-44fb-9e85-7c7e89c1fa82",
        "order_id": "34810cc9-084e-48c4-9b03-eb85f0ec1a36",
        "source_location_id": "2bc930e6-60c2-4b0a-9073-cae5792052b7",
        "destination_location_id": "2bc930e6-60c2-4b0a-9073-cae5792052b7"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/transfers

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
q String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
quantity Integer
eq, not_eq, gt, gte, lt, lte
available_at Datetime
eq, not_eq, gt, gte, lt, lte
finalized Boolean
eq
item_id Uuid
eq, not_eq
order_id Uuid
eq, not_eq
source_location_id Uuid
eq, not_eq
destination_location_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request accepts the following includes:

order

item => photo

source_location

destination_location

Users

Users can be used to log into the web shop. They are useful for exposing your shop to a limited audience or verifiying that a customers can actually be reached via an email.

A user always belongs to a Customer. A customer can have multiple users. This is relevant for companies where multiple people are allowed to book orders in the name of that company. Because of this, a user should always be an actual person, not a legal person.

Depending on the setting in your Booqable account, creating a user can actually mean that you're inviting the user. In that case, the user still needs to confirm their email and set a password before the account is active. (See status)

Endpoints

GET /api/boomerang/users

GET /api/boomerang/users/{id}

POST /api/boomerang/users

PUT /api/boomerang/users/{id}

Fields

Every user has the following fields:

Name Description
id Uuid readonly
Primary key
created_at Datetime readonly
When the resource was created
updated_at Datetime readonly
When the resource was last updated
first_name String
The first name of the user
last_name String
The last name of the user
name String
The full name of the user (first_name + last_name)
email String
The email of the user
status String readonly
One of disabled, active, invited, unconfirmed
disabled Boolean writeonly
When a user is disabled they cannot log into their account or create orders
customer_id Uuid
Associated Customer

Relationships

Users have the following relationships:

Name Description
customer Customers
Associated Customer
notes Notes readonly
Associated Notes

Listing users

How to fetch a list of users:

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

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "0511d556-6634-444f-a9ef-290f3402c6c8",
      "type": "users",
      "attributes": {
        "created_at": "2024-11-18T09:26:12.074705+00:00",
        "updated_at": "2024-11-18T09:26:12.074705+00:00",
        "first_name": "John",
        "last_name": "Doe",
        "name": "John Doe",
        "email": "[email protected]",
        "status": "active",
        "customer_id": "2dd2f530-3140-4864-afee-6031b6483a0a"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

How to find users belonging to a customer:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/users?filter%5Bcustomer_id%5D=f3bafa39-d8cf-4286-8b31-6fede3d87b4e&include=customer' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": [
    {
      "id": "a4aac9e1-26b6-4306-93a7-eebf442d3611",
      "type": "users",
      "attributes": {
        "created_at": "2024-11-18T09:26:12.549637+00:00",
        "updated_at": "2024-11-18T09:26:12.549637+00:00",
        "first_name": "John",
        "last_name": "Doe",
        "name": "John Doe",
        "email": "[email protected]",
        "status": "active",
        "customer_id": "f3bafa39-d8cf-4286-8b31-6fede3d87b4e"
      },
      "relationships": {}
    }
  ],
  "meta": {}
}

HTTP Request

GET /api/boomerang/users

Request params

This request accepts the following parameters:

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

Filters

This request can be filtered on:

Name Description
id Uuid
eq, not_eq
created_at Datetime
eq, not_eq, gt, gte, lt, lte
updated_at Datetime
eq, not_eq, gt, gte, lt, lte
first_name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
last_name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
name String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
email String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
status String
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
customer_id Uuid
eq, not_eq

Meta

Results can be aggregated on:

Name Description
total Array
count

Includes

This request does not accept any includes

Fetching a user

How to fetch a user:

  curl --request GET \
    --url 'https://example.booqable.com/api/boomerang/users/72e8d3b1-fcd7-4eec-9c8c-9c4266a7245d' \
    --header 'content-type: application/json' \

A 200 status response looks like this:

  {
  "data": {
    "id": "72e8d3b1-fcd7-4eec-9c8c-9c4266a7245d",
    "type": "users",
    "attributes": {
      "created_at": "2024-11-18T09:26:10.366517+00:00",
      "updated_at": "2024-11-18T09:26:10.366517+00:00",
      "first_name": "John",
      "last_name": "Doe",
      "name": "John Doe",
      "email": "[email protected]",
      "status": "active",
      "customer_id": "564b3db7-01f4-466d-8c54-7f554415e750"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

GET /api/boomerang/users/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=customer,disabled_by,notes
fields[] Array
List of comma seperated fields to include ?fields[users]=created_at,updated_at,first_name

Includes

This request accepts the following includes:

customer

disabled_by

notes

Inviting a user

How to invite a user:

  curl --request POST \
    --url 'https://example.booqable.com/api/boomerang/users' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "type": "users",
        "attributes": {
          "first_name": "Bob",
          "last_name": "Bobsen",
          "email": "[email protected]",
          "customer_id": "982884a7-74e6-4596-b8f6-23ce24b4e3b5"
        }
      }
    }'

A 201 status response looks like this:

  {
  "data": {
    "id": "d35b853e-9b2b-4eb9-92a7-3cb02124fc77",
    "type": "users",
    "attributes": {
      "created_at": "2024-11-18T09:26:11.605249+00:00",
      "updated_at": "2024-11-18T09:26:11.617479+00:00",
      "first_name": "Bob",
      "last_name": "Bobsen",
      "name": "Bob Bobsen",
      "email": "[email protected]",
      "status": "invited",
      "customer_id": "982884a7-74e6-4596-b8f6-23ce24b4e3b5"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

POST /api/boomerang/users

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=customer,disabled_by,notes
fields[] Array
List of comma seperated fields to include ?fields[users]=created_at,updated_at,first_name

Request body

This request accepts the following body:

Name Description
data[attributes][first_name] String
The first name of the user
data[attributes][last_name] String
The last name of the user
data[attributes][name] String
The full name of the user (first_name + last_name)
data[attributes][email] String
The email of the user
data[attributes][disabled] Boolean
When a user is disabled they cannot log into their account or create orders
data[attributes][customer_id] Uuid
Associated Customer

Includes

This request accepts the following includes:

customer

disabled_by

notes

Updating a user

How to update a user:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/users/38cf8587-6092-4448-817e-0d6dda33ed52' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "38cf8587-6092-4448-817e-0d6dda33ed52",
        "type": "users",
        "attributes": {
          "first_name": "Bobba"
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "38cf8587-6092-4448-817e-0d6dda33ed52",
    "type": "users",
    "attributes": {
      "created_at": "2024-11-18T09:26:09.872981+00:00",
      "updated_at": "2024-11-18T09:26:09.926979+00:00",
      "first_name": "Bobba",
      "last_name": "Doe",
      "name": "Bobba Doe",
      "email": "[email protected]",
      "status": "active",
      "customer_id": "6ef395d6-9fe9-4f08-9078-3c6a4b3eccde"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/users/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=customer,disabled_by,notes
fields[] Array
List of comma seperated fields to include ?fields[users]=created_at,updated_at,first_name

Request body

This request accepts the following body:

Name Description
data[attributes][first_name] String
The first name of the user
data[attributes][last_name] String
The last name of the user
data[attributes][name] String
The full name of the user (first_name + last_name)
data[attributes][email] String
The email of the user
data[attributes][disabled] Boolean
When a user is disabled they cannot log into their account or create orders
data[attributes][customer_id] Uuid
Associated Customer

Includes

This request accepts the following includes:

customer

disabled_by

notes

Enabling a user

How to enable a user:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/users/525a3aaf-f158-4232-a3af-2548763575db' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "525a3aaf-f158-4232-a3af-2548763575db",
        "type": "users",
        "attributes": {
          "disabled": false
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "525a3aaf-f158-4232-a3af-2548763575db",
    "type": "users",
    "attributes": {
      "created_at": "2024-11-18T09:26:10.858173+00:00",
      "updated_at": "2024-11-18T09:26:10.934780+00:00",
      "first_name": "John",
      "last_name": "Doe",
      "name": "John Doe",
      "email": "[email protected]",
      "status": "active",
      "customer_id": "5128b52c-aab3-4967-8d74-a0c0a83dd082"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/users/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=customer,disabled_by,notes
fields[] Array
List of comma seperated fields to include ?fields[users]=created_at,updated_at,first_name

Request body

This request accepts the following body:

Name Description
data[attributes][first_name] String
The first name of the user
data[attributes][last_name] String
The last name of the user
data[attributes][name] String
The full name of the user (first_name + last_name)
data[attributes][email] String
The email of the user
data[attributes][disabled] Boolean
When a user is disabled they cannot log into their account or create orders
data[attributes][customer_id] Uuid
Associated Customer

Includes

This request accepts the following includes:

customer

disabled_by

notes

Disabling a user

How to disable a user:

  curl --request PUT \
    --url 'https://example.booqable.com/api/boomerang/users/be93edff-cc93-427d-90f1-31aa1e9d46e7' \
    --header 'content-type: application/json' \
    --data '{
      "data": {
        "id": "be93edff-cc93-427d-90f1-31aa1e9d46e7",
        "type": "users",
        "attributes": {
          "disabled": true
        }
      }
    }'

A 200 status response looks like this:

  {
  "data": {
    "id": "be93edff-cc93-427d-90f1-31aa1e9d46e7",
    "type": "users",
    "attributes": {
      "created_at": "2024-11-18T09:26:09.385905+00:00",
      "updated_at": "2024-11-18T09:26:09.440300+00:00",
      "first_name": "John",
      "last_name": "Doe",
      "name": "John Doe",
      "email": "[email protected]",
      "status": "disabled",
      "customer_id": "1addab35-b05e-4388-a537-95f8bbb4d79d"
    },
    "relationships": {}
  },
  "meta": {}
}

HTTP Request

PUT /api/boomerang/users/{id}

Request params

This request accepts the following parameters:

Name Description
include String
List of comma seperated relationships ?include=customer,disabled_by,notes
fields[] Array
List of comma seperated fields to include ?fields[users]=created_at,updated_at,first_name

Request body

This request accepts the following body:

Name Description
data[attributes][first_name] String
The first name of the user
data[attributes][last_name] String
The last name of the user
data[attributes][name] String
The full name of the user (first_name + last_name)
data[attributes][email] String
The email of the user
data[attributes][disabled] Boolean
When a user is disabled they cannot log into their account or create orders
data[attributes][customer_id] Uuid
Associated Customer

Includes

This request accepts the following includes:

customer

disabled_by

notes