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

Authentication methods

Authentication methods define ways to authenticate with the API. They are always scoped to the currently signed-in employee.

See Authentication for more information on authenticating with the API.

Relationships

Name Description
company Company required
The company this authentication method belongs to.
employee Employee required
The employee this authentication method belongs to.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
algorithm enum
Algorithm used for signing.
One of: ES256, RS256, HS256.
company_id uuid readonly
The company this authentication method belongs to.
created_at datetime readonly
When this authentication method was created.
employee_id uuid readonly
The employee this authentication method belongs to.
id uuid readonly
Primary key.
key string extra
Key that is being used for authentication strategy. Because this key is supposed to be kept secret (depending on kind), its value is only returned when explicitly requested.
kind enum
Kind of strategy used for authentication.
One of: token, single_use, oauth.
name string
Name of the key (for identification by user).

List authentication methods

How to fetch a list of authentication methods:

  curl --get 'https://example.booqable.com/api/boomerang/authentication_methods'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "63e16d3e-a24d-4137-8fc5-dc94f18a5068",
        "type": "authentication_methods",
        "attributes": {
          "created_at": "2019-09-26T20:08:02.000000+00:00",
          "updated_at": "2019-09-26T20:08:02.000000+00:00",
          "name": "Segment integration",
          "kind": "single_use",
          "algorithm": "ES256",
          "employee_id": "ca0083cb-ea69-4e2b-8270-e691e0599f5e",
          "company_id": "b5c213f3-bf74-40ee-825d-3fd6219fc0a0"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/authentication_methods

Request params

This request accepts the following parameters:

Name Description
extra_fields[] array
List of comma separated fields to include in addition to the default fields. ?extra_fields[authentication_methods]=key
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[authentication_methods]=created_at,name,kind
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
algorithm string_enum
eq
company_id uuid
eq, not_eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
employee_id uuid
eq, not_eq
id uuid
eq, not_eq
kind string_enum
eq
name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request does not accept any includes

Fetch an authentication method

How to fetch an authentication method:

  curl --get 'https://example.booqable.com/api/boomerang/authentication_methods/874482c4-c602-4605-8e8f-bdd68bc4e0fe'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "874482c4-c602-4605-8e8f-bdd68bc4e0fe",
      "type": "authentication_methods",
      "attributes": {
        "created_at": "2014-12-11T10:59:01.000000+00:00",
        "updated_at": "2014-12-11T10:59:01.000000+00:00",
        "name": "Segment integration",
        "kind": "single_use",
        "algorithm": "ES256",
        "key": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEDRq3Sua6NyUU0WusNISEcchCLBL\nShY0rPpRLfU+Y96OcMiSWaKazYmQDKq4zyIVLlnGiHjv4lwEfhe3Psr39A==\n-----END PUBLIC KEY-----\n",
        "employee_id": "24cc151b-daa4-48f0-8535-f63d7ec20fe7",
        "company_id": "84e60c43-023a-4c37-809c-a941cbac102a"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/authentication_methods/{id}

Request params

This request accepts the following parameters:

Name Description
extra_fields[] array
List of comma separated fields to include in addition to the default fields. ?extra_fields[authentication_methods]=key
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[authentication_methods]=created_at,name,kind

Includes

This request does not accept any includes

Create an authentication method

How to create a token authentication method:

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/authentication_methods'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "authentication_methods",
           "attributes": {
             "name": "Segment integration"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "220c0989-a7b1-4962-884e-01ee74df46dc",
      "type": "authentication_methods",
      "attributes": {
        "created_at": "2027-11-18T02:17:01.000000+00:00",
        "updated_at": "2027-11-18T02:17:01.000000+00:00",
        "name": "Segment integration",
        "kind": "token",
        "algorithm": null,
        "key": "821465b1c39ad8d8584eee99c158868d986e7291281dfbedf3855cc9142c197a",
        "employee_id": "d6313cd4-52d0-4f71-87e9-0a5fbd855b19",
        "company_id": "d79aa57f-76cb-483a-8e40-c25404c26a5d"
      },
      "relationships": {}
    },
    "meta": {}
  }

How to create a single_use authentication method (with ES256 strategy):

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/authentication_methods'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "authentication_methods",
           "attributes": {
             "name": "Segment integration",
             "key": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEDRq3Sua6NyUU0WusNISEcchCLBL\nShY0rPpRLfU+Y96OcMiSWaKazYmQDKq4zyIVLlnGiHjv4lwEfhe3Psr39A==\n-----END PUBLIC KEY-----\n",
             "kind": "single_use",
             "algorithm": "ES256"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "e53a56a3-0f4e-4bd6-8bab-dad967b320b3",
      "type": "authentication_methods",
      "attributes": {
        "created_at": "2021-04-10T18:40:01.000000+00:00",
        "updated_at": "2021-04-10T18:40:01.000000+00:00",
        "name": "Segment integration",
        "kind": "single_use",
        "algorithm": "ES256",
        "key": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEDRq3Sua6NyUU0WusNISEcchCLBL\nShY0rPpRLfU+Y96OcMiSWaKazYmQDKq4zyIVLlnGiHjv4lwEfhe3Psr39A==\n-----END PUBLIC KEY-----\n",
        "employee_id": "75a59189-d0d6-4668-8c8b-83903cf22d08",
        "company_id": "031ece0d-d2c2-4b5a-86ac-e2eb24560de5"
      },
      "relationships": {}
    },
    "meta": {}
  }

How to create a single_use authentication method (with RS256 strategy):

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/authentication_methods'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "authentication_methods",
           "attributes": {
             "name": "Segment integration",
             "key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtRuZD4X3MhIz1ntbxpkp\njVFUTdH7mspUNXmE0bcQ3bJrgWYZmtPm64+lpo7KWqQIL28dhtNAjImJmzcr04ve\nRAxxyQT0f0uwe3zUBEqaxKim1aCJV60c71cPKJVfhXElnjhMkBW6ftIEgf7J4bwe\n7kPCK/NfdiOuFlMjfaY+5WmaA1lAZ/SSetwglSaHPPQKaix3LW4ocHtHUd7OBKNC\nIU/DO3baUDAkymF7ZCnMaf3F9Le9sGSpgUA8Fof69rH1EdagQFmIkftflj/IlJiC\nPDEoc1x7b4opEuGp287S+DsRRgr6vzVZi4CPQcJJsG+07jZQN5K3wboBlx8LW2jT\nfQIDAQAB\n-----END PUBLIC KEY-----\n",
             "kind": "single_use",
             "algorithm": "RS256"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "f8a49c93-c272-4014-82f7-aaee9e656a32",
      "type": "authentication_methods",
      "attributes": {
        "created_at": "2014-10-08T04:38:01.000000+00:00",
        "updated_at": "2014-10-08T04:38:01.000000+00:00",
        "name": "Segment integration",
        "kind": "single_use",
        "algorithm": "RS256",
        "key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtRuZD4X3MhIz1ntbxpkp\njVFUTdH7mspUNXmE0bcQ3bJrgWYZmtPm64+lpo7KWqQIL28dhtNAjImJmzcr04ve\nRAxxyQT0f0uwe3zUBEqaxKim1aCJV60c71cPKJVfhXElnjhMkBW6ftIEgf7J4bwe\n7kPCK/NfdiOuFlMjfaY+5WmaA1lAZ/SSetwglSaHPPQKaix3LW4ocHtHUd7OBKNC\nIU/DO3baUDAkymF7ZCnMaf3F9Le9sGSpgUA8Fof69rH1EdagQFmIkftflj/IlJiC\nPDEoc1x7b4opEuGp287S+DsRRgr6vzVZi4CPQcJJsG+07jZQN5K3wboBlx8LW2jT\nfQIDAQAB\n-----END PUBLIC KEY-----\n",
        "employee_id": "bc3373ee-ee17-4d83-8c01-3b200bf8bdb3",
        "company_id": "faf47d6b-8d0b-4ac5-8892-c0590faa0054"
      },
      "relationships": {}
    },
    "meta": {}
  }

How to create a single_use authentication method (with HS256 strategy):

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/authentication_methods'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "authentication_methods",
           "attributes": {
             "name": "Segment integration",
             "kind": "single_use",
             "algorithm": "HS256"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "29c57921-3618-445f-89ac-84463b0ae952",
      "type": "authentication_methods",
      "attributes": {
        "created_at": "2028-10-03T00:29:01.000000+00:00",
        "updated_at": "2028-10-03T00:29:01.000000+00:00",
        "name": "Segment integration",
        "kind": "single_use",
        "algorithm": "HS256",
        "key": "cb991b0f11304f313a1487b2cb22a067eb4b03da8499bd2f833df79d83045110",
        "employee_id": "777ef44e-2bce-40e3-85dc-63792f9f0c22",
        "company_id": "61df6c42-088c-4fa3-8860-b75b9c114770"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/authentication_methods

Request params

This request accepts the following parameters:

Name Description
extra_fields[] array
List of comma separated fields to include in addition to the default fields. ?extra_fields[authentication_methods]=key
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[authentication_methods]=created_at,name,kind
include string
List of comma seperated relationships to sideload. ?include=employee,company

Request body

This request accepts the following body:

Name Description
data[attributes][algorithm] enum
Algorithm used for signing.
One of: ES256, RS256, HS256.
data[attributes][key] string
Key that is being used for authentication strategy. Because this key is supposed to be kept secret (depending on kind), its value is only returned when explicitly requested.
data[attributes][kind] enum
Kind of strategy used for authentication.
One of: token, single_use, oauth.
data[attributes][name] string
Name of the key (for identification by user).

Includes

This request accepts the following includes:

employee

company

Delete an authentication method

How to delete an authentication method:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/authentication_methods/ef2b6529-43ac-4e66-8ab9-bd2950729b50'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "ef2b6529-43ac-4e66-8ab9-bd2950729b50",
      "type": "authentication_methods",
      "attributes": {
        "created_at": "2021-11-06T06:35:01.000000+00:00",
        "updated_at": "2021-11-06T06:35:01.000000+00:00",
        "name": "Segment integration",
        "kind": "single_use",
        "algorithm": "ES256",
        "key": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEDRq3Sua6NyUU0WusNISEcchCLBL\nShY0rPpRLfU+Y96OcMiSWaKazYmQDKq4zyIVLlnGiHjv4lwEfhe3Psr39A==\n-----END PUBLIC KEY-----\n",
        "employee_id": "792a5596-9c55-46ab-8317-6c0651512e04",
        "company_id": "5da72e2c-3b67-4d80-88c1-6e96acba5c58"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

DELETE /api/boomerang/authentication_methods/{id}

Request params

This request accepts the following parameters:

Name Description
extra_fields[] array
List of comma separated fields to include in addition to the default fields. ?extra_fields[authentication_methods]=key
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[authentication_methods]=created_at,name,kind

Includes

This request does not accept any includes

Barcodes

You can assign barcodes to products (or their variations), individually tracked stock items, and customers (for use on a customer card, for example).

An QR code is always generated for each order. This QR code is included in emails for speedy pickup and printed on packing slips for easier logistics.

Supported formats

Booqable supports the following barcode formats:

Note that when using URLs as numbers, it's advised to base64 encode the number before filtering.

Relationships

Name Description
owner Customer, Product, Order, Stock item required
The resource pointed to by this barcode.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
barcode_type enum
Barcode format. See resource description above for pros/cons of each format.
One of: code39, code93, code128, ean8, ean13, qr_code.
created_at datetime readonly
When the resource was created.
id uuid readonly
Primary key.
image_url string readonly
A link to an image of the barcode.
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.
owner_id uuid
The resource pointed to by this barcode.
owner_type string
The resource type of the owner.
updated_at datetime readonly
When the resource was last updated.

List barcodes

How to fetch a list of barcodes:

  curl --get 'https://example.booqable.com/api/boomerang/barcodes'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "c3fbfdf6-d756-4d88-89c7-974df32dc31f",
        "type": "barcodes",
        "attributes": {
          "created_at": "2026-11-20T19:16:00.000000+00:00",
          "updated_at": "2026-11-20T19:16:00.000000+00:00",
          "number": "http://bqbl.it/c3fbfdf6-d756-4d88-89c7-974df32dc31f",
          "barcode_type": "qr_code",
          "image_url": "http://company-name-14.lvh.me:/barcodes/c3fbfdf6-d756-4d88-89c7-974df32dc31f/image",
          "owner_id": "2318a321-06f9-4303-8d23-b46cfb189aeb",
          "owner_type": "customers"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

How to find an owner by a barcode number:

  curl --get 'https://example.booqable.com/api/boomerang/barcodes'
       --header 'content-type: application/json'
       --data-urlencode 'filter[number]=http://bqbl.it/9882a0de-d425-4c34-8a53-f65dd35dd375'
       --data-urlencode 'include=owner'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "9882a0de-d425-4c34-8a53-f65dd35dd375",
        "type": "barcodes",
        "attributes": {
          "created_at": "2021-09-12T13:49:00.000000+00:00",
          "updated_at": "2021-09-12T13:49:00.000000+00:00",
          "number": "http://bqbl.it/9882a0de-d425-4c34-8a53-f65dd35dd375",
          "barcode_type": "qr_code",
          "image_url": "http://company-name-15.lvh.me:/barcodes/9882a0de-d425-4c34-8a53-f65dd35dd375/image",
          "owner_id": "48f38dad-4082-4377-8d28-c793e2d1c814",
          "owner_type": "customers"
        },
        "relationships": {
          "owner": {
            "data": {
              "type": "customers",
              "id": "48f38dad-4082-4377-8d28-c793e2d1c814"
            }
          }
        }
      }
    ],
    "included": [
      {
        "id": "48f38dad-4082-4377-8d28-c793e2d1c814",
        "type": "customers",
        "attributes": {
          "created_at": "2021-09-12T13:49:00.000000+00:00",
          "updated_at": "2021-09-12T13:49:00.000000+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 --get 'https://example.booqable.com/api/boomerang/barcodes'
       --header 'content-type: application/json'
       --data-urlencode 'filter[number]=aHR0cDovL2JxYmwuaXQvNzkyY2JmNWYtMWYwOS00ZjFjLWFhZTUtODExOTMwY2I0MGIw'
       --data-urlencode 'include=owner'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "78a5e268-fca0-450a-855f-49f29ef29ef3",
        "type": "barcodes",
        "attributes": {
          "created_at": "2023-09-26T19:48:00.000000+00:00",
          "updated_at": "2023-09-26T19:48:00.000000+00:00",
          "number": "http://bqbl.it/78a5e268-fca0-450a-855f-49f29ef29ef3",
          "barcode_type": "qr_code",
          "image_url": "http://company-name-16.lvh.me:/barcodes/78a5e268-fca0-450a-855f-49f29ef29ef3/image",
          "owner_id": "ab6232e0-b056-4bf8-8bc7-99c41f2782de",
          "owner_type": "customers"
        },
        "relationships": {
          "owner": {
            "data": {
              "type": "customers",
              "id": "ab6232e0-b056-4bf8-8bc7-99c41f2782de"
            }
          }
        }
      }
    ],
    "included": [
      {
        "id": "ab6232e0-b056-4bf8-8bc7-99c41f2782de",
        "type": "customers",
        "attributes": {
          "created_at": "2023-09-26T19:48:00.000000+00:00",
          "updated_at": "2023-09-26T19:48:00.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[barcodes]=created_at,updated_at,number
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=owner
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
barcode_type string_enum
eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
number string
eq
owner_id uuid
eq, not_eq
owner_type string
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request accepts the following includes:

owner => photo

product => photo

Fetch a barcode

How to fetch a barcode:

  curl --get 'https://example.booqable.com/api/boomerang/barcodes/60d46666-056c-4072-8fd0-cae57d7a90ff'
       --header 'content-type: application/json'
       --data-urlencode 'include=owner'

A 200 status response looks like this:

  {
    "data": {
      "id": "60d46666-056c-4072-8fd0-cae57d7a90ff",
      "type": "barcodes",
      "attributes": {
        "created_at": "2023-11-26T10:01:03.000000+00:00",
        "updated_at": "2023-11-26T10:01:03.000000+00:00",
        "number": "http://bqbl.it/60d46666-056c-4072-8fd0-cae57d7a90ff",
        "barcode_type": "qr_code",
        "image_url": "http://company-name-17.lvh.me:/barcodes/60d46666-056c-4072-8fd0-cae57d7a90ff/image",
        "owner_id": "9a08fa5a-eddb-4502-8e1e-60dbd303cb58",
        "owner_type": "customers"
      },
      "relationships": {
        "owner": {
          "data": {
            "type": "customers",
            "id": "9a08fa5a-eddb-4502-8e1e-60dbd303cb58"
          }
        }
      }
    },
    "included": [
      {
        "id": "9a08fa5a-eddb-4502-8e1e-60dbd303cb58",
        "type": "customers",
        "attributes": {
          "created_at": "2023-11-26T10:01:03.000000+00:00",
          "updated_at": "2023-11-26T10:01:03.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[barcodes]=created_at,updated_at,number
include string
List of comma seperated relationships to sideload. ?include=owner

Includes

This request accepts the following includes:

owner => photo

product => photo

Create 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": "9d177e60-f890-4d0a-8dc6-44d61d8cca22",
             "owner_type": "customers"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "954b9fd3-271d-4ab4-8a7e-87e89b15c0a0",
      "type": "barcodes",
      "attributes": {
        "created_at": "2019-09-24T03:44:00.000000+00:00",
        "updated_at": "2019-09-24T03:44:00.000000+00:00",
        "number": "http://bqbl.it/954b9fd3-271d-4ab4-8a7e-87e89b15c0a0",
        "barcode_type": "qr_code",
        "image_url": "http://company-name-18.lvh.me:/barcodes/954b9fd3-271d-4ab4-8a7e-87e89b15c0a0/image",
        "owner_id": "9d177e60-f890-4d0a-8dc6-44d61d8cca22",
        "owner_type": "customers"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/barcodes

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[barcodes]=created_at,updated_at,number
include string
List of comma seperated relationships to sideload. ?include=owner

Request body

This request accepts the following body:

Name Description
data[attributes][barcode_type] enum
Barcode format. See resource description above for pros/cons of each format.
One of: code39, code93, code128, ean8, ean13, qr_code.
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][owner_id] uuid
The resource pointed to by this barcode.
data[attributes][owner_type] string
The resource type of the owner.

Includes

This request accepts the following includes:

owner => photo

product => photo

Update a barcode

How to update a barcode:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/barcodes/d4f58d8f-2318-44f4-8097-9dbe2a9ddaf2'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "d4f58d8f-2318-44f4-8097-9dbe2a9ddaf2",
           "type": "barcodes",
           "attributes": {
             "number": "https://myfancysite.com"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "d4f58d8f-2318-44f4-8097-9dbe2a9ddaf2",
      "type": "barcodes",
      "attributes": {
        "created_at": "2021-10-11T03:09:01.000000+00:00",
        "updated_at": "2021-10-11T03:09:01.000000+00:00",
        "number": "https://myfancysite.com",
        "barcode_type": "qr_code",
        "image_url": "http://company-name-19.lvh.me:/barcodes/d4f58d8f-2318-44f4-8097-9dbe2a9ddaf2/image",
        "owner_id": "a8f4104c-a6da-44d0-8505-a590b71bb780",
        "owner_type": "customers"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/barcodes/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[barcodes]=created_at,updated_at,number
include string
List of comma seperated relationships to sideload. ?include=owner

Request body

This request accepts the following body:

Name Description
data[attributes][barcode_type] enum
Barcode format. See resource description above for pros/cons of each format.
One of: code39, code93, code128, ean8, ean13, qr_code.
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][owner_id] uuid
The resource pointed to by this barcode.
data[attributes][owner_type] string
The resource type of the owner.

Includes

This request accepts the following includes:

owner => photo

product => photo

Destroy a barcode

How to delete a barcode:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/barcodes/ac988a7e-ebdc-45af-8638-9783aeb4594e'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "ac988a7e-ebdc-45af-8638-9783aeb4594e",
      "type": "barcodes",
      "attributes": {
        "created_at": "2023-03-27T06:20:00.000000+00:00",
        "updated_at": "2023-03-27T06:20:00.000000+00:00",
        "number": "http://bqbl.it/ac988a7e-ebdc-45af-8638-9783aeb4594e",
        "barcode_type": "qr_code",
        "image_url": "http://company-name-20.lvh.me:/barcodes/ac988a7e-ebdc-45af-8638-9783aeb4594e/image",
        "owner_id": "20fbc832-70a9-45dd-84fd-848ee269b502",
        "owner_type": "customers"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

DELETE /api/boomerang/barcodes/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[barcodes]=created_at,updated_at,number
include string
List of comma seperated relationships to sideload. ?include=owner

Includes

This request accepts the following includes:

owner => photo

product => photo

Bundles

Bundles allow for a single product to be made up of multiple other products. This makes it possible to offer customers a set of products that logically go together as a single package, for a single price, and with a combined availability.

Bundles are composed from BundleItems, which describe which products are included, how many of them, and the discount for each product.

There are two types of bundles:

Relationships

Name Description
bundle_items Bundle items hasmany
The bundle items that make up this bundle.
inventory_levels Inventory levels hasmany
Availability of this bundle. Because bundles do not exist on a physical level (they are a collection of products), the returned availability will be the maximum number of bundles that can be made from the available products (bundle availability is restricted by the least available product).
photo Photo optional
Main photo.
tax_category Tax category optional
Tax category for tax calculations. When present, this tax category overrides the tax category of the individual products.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
archived boolean readonly
Whether the bundle is archived.
archived_at datetime readonly nullable
When the bundle was archived.
bundle_items_attributes array writeonly
Writing to this attribute allows to create or update bundle items at the same time as the bundle itself.
created_at datetime readonly
When the resource was created.
description string nullable
Description used in the online store.
discountable boolean
Whether discounts should be applied to items in this bundle.
excerpt string nullable
Excerpt used in the online store.
extra_information string nullable
Extra information about the bundle, shown on orders and documents.
id uuid readonly
Primary key.
name string
Name of the bundle.
photo_base64 string writeonly
Base64 encoded photo, use this field to store a main photo.
photo_id uuid readonly nullable
Main photo.
photo_url string readonly
Main photo url.
product_type enum readonly
Always bundle. This attribute exists because bundles are a kind of Item.
remote_photo_url string writeonly
Url to an image on the web.
seo_description string nullable
SEO meta description tag.
seo_title string nullable
SEO title tag.
show_in_store boolean
Whether to show this item in the online.
slug string
Slug of the bundle.
sorting_weight integer
Defines sort order in the online store, the lower the weight - the higher it shows up in lists.
tag_list array
List of tags.
tax_category_id uuid nullable
Tax category for tax calculations. When present, this tax category overrides the tax category of the individual products.
taxable boolean
Whether this bundle is taxable.
type string readonly
Always bundles. This attribute exists because bundles are a kind of Item.
updated_at datetime readonly
When the resource was last updated.

List bundles

How to fetch a list of bundles:

  curl --get 'https://example.booqable.com/api/boomerang/bundles'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "18ffd1b4-8468-4bad-82c1-1e7f370f600f",
        "type": "bundles",
        "attributes": {
          "created_at": "2020-11-21T17:08:01.000000+00:00",
          "updated_at": "2020-11-21T17:08:01.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[bundles]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=photo,inventory_levels
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
created_at datetime
eq, not_eq, gt, gte, lt, lte
description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
discountable boolean
eq
excerpt 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
id uuid
eq, not_eq
name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
photo_id uuid
eq, not_eq
product_type string_enum
eq
q string
eq
seo_description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
seo_title string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
show_in_store boolean
eq
slug string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
sorting_weight integer
eq, not_eq, gt, gte, lt, lte
tag_list string
eq
tax_category_id uuid
eq, not_eq
taxable boolean
eq
type string
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

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

Includes

This request accepts the following includes:

photo

inventory_levels

Search 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": "ea409533-a730-4d13-8149-036b51248925"
      },
      {
        "id": "16552c0c-85c9-4d79-81d8-862b15da8a16"
      },
      {
        "id": "714cbc42-5133-4ee2-8945-1fb6391bfbc8"
      }
    ]
  }

HTTP Request

POST api/boomerang/bundles/search

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[bundles]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=photo,inventory_levels
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
created_at datetime
eq, not_eq, gt, gte, lt, lte
description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
discountable boolean
eq
excerpt 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
id uuid
eq, not_eq
name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
photo_id uuid
eq, not_eq
product_type string_enum
eq
q string
eq
seo_description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
seo_title string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
show_in_store boolean
eq
slug string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
sorting_weight integer
eq, not_eq, gt, gte, lt, lte
tag_list string
eq
tax_category_id uuid
eq, not_eq
taxable boolean
eq
type string
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

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

Includes

This request accepts the following includes:

photo

inventory_levels

Fetch a bundle

How to fetch a bundle:

  curl --get 'https://example.booqable.com/api/boomerang/bundles/7a7aeed9-35dd-40fe-8ece-5551e24ce953'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "7a7aeed9-35dd-40fe-8ece-5551e24ce953",
      "type": "bundles",
      "attributes": {
        "created_at": "2027-01-01T09:13:00.000000+00:00",
        "updated_at": "2027-01-01T09:13:00.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[bundles]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=photo,bundle_items,tax_category

Includes

This request accepts the following includes:

photo

bundle_items => product_group => photo

products => photo

product => photo

tax_category

Create 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": "1a247a34-c748-422e-8f6e-1a6d3992c656",
                 "product_id": "ca3c0fbf-03ac-4a05-8a65-d5bab132b59d"
               },
               {
                 "quantity": 2,
                 "discount_percentage": 15,
                 "product_group_id": "bf793cc3-ff25-497e-8a92-6cf9a8d99fa0",
                 "product_id": "07b0cf35-6809-4bec-8350-2dbe5a39a565"
               }
             ]
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "2f4b77bd-2e6d-4454-8933-babc61ed151f",
      "type": "bundles",
      "attributes": {
        "created_at": "2020-05-21T17:38:00.000000+00:00",
        "updated_at": "2020-05-21T17:38:00.000000+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": "df0b9888-284d-4211-8aa3-7c4bd3922ad5"
            },
            {
              "type": "bundle_items",
              "id": "f6e42e06-fab0-4f46-8f8e-ea8a9422304b"
            },
            {
              "type": "bundle_items",
              "id": "ae082f3d-ff30-456b-8adb-5b4919c8417a"
            },
            {
              "type": "bundle_items",
              "id": "0a030633-4d84-4191-8e44-c52eb68d811a"
            }
          ]
        }
      }
    },
    "included": [
      {
        "id": "df0b9888-284d-4211-8aa3-7c4bd3922ad5",
        "type": "bundle_items",
        "attributes": {
          "created_at": "2020-05-21T17:38:00.000000+00:00",
          "updated_at": "2020-05-21T17:38:00.000000+00:00",
          "quantity": 2,
          "discount_percentage": 10.0,
          "position": 1,
          "bundle_id": "2f4b77bd-2e6d-4454-8933-babc61ed151f",
          "product_group_id": "1a247a34-c748-422e-8f6e-1a6d3992c656",
          "product_id": "ca3c0fbf-03ac-4a05-8a65-d5bab132b59d"
        },
        "relationships": {}
      },
      {
        "id": "f6e42e06-fab0-4f46-8f8e-ea8a9422304b",
        "type": "bundle_items",
        "attributes": {
          "created_at": "2020-05-21T17:38:00.000000+00:00",
          "updated_at": "2020-05-21T17:38:00.000000+00:00",
          "quantity": 2,
          "discount_percentage": 15.0,
          "position": 2,
          "bundle_id": "2f4b77bd-2e6d-4454-8933-babc61ed151f",
          "product_group_id": "bf793cc3-ff25-497e-8a92-6cf9a8d99fa0",
          "product_id": "07b0cf35-6809-4bec-8350-2dbe5a39a565"
        },
        "relationships": {}
      },
      {
        "id": "ae082f3d-ff30-456b-8adb-5b4919c8417a",
        "type": "bundle_items",
        "attributes": {
          "created_at": "2020-05-21T17:38:00.000000+00:00",
          "updated_at": "2020-05-21T17:38:00.000000+00:00",
          "quantity": 2,
          "discount_percentage": 10.0,
          "position": 3,
          "bundle_id": "2f4b77bd-2e6d-4454-8933-babc61ed151f",
          "product_group_id": "1a247a34-c748-422e-8f6e-1a6d3992c656",
          "product_id": "ca3c0fbf-03ac-4a05-8a65-d5bab132b59d"
        },
        "relationships": {}
      },
      {
        "id": "0a030633-4d84-4191-8e44-c52eb68d811a",
        "type": "bundle_items",
        "attributes": {
          "created_at": "2020-05-21T17:38:00.000000+00:00",
          "updated_at": "2020-05-21T17:38:00.000000+00:00",
          "quantity": 2,
          "discount_percentage": 15.0,
          "position": 4,
          "bundle_id": "2f4b77bd-2e6d-4454-8933-babc61ed151f",
          "product_group_id": "bf793cc3-ff25-497e-8a92-6cf9a8d99fa0",
          "product_id": "07b0cf35-6809-4bec-8350-2dbe5a39a565"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

POST /api/boomerang/bundles

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[bundles]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=photo,bundle_items,tax_category

Request body

This request accepts the following body:

Name Description
data[attributes][bundle_items_attributes][] array
Writing to this attribute allows to create or update bundle items at the same time as the bundle itself.
data[attributes][discountable] boolean
Whether discounts should be applied to items in this bundle.
data[attributes][excerpt] string
Excerpt used in the online store.
data[attributes][extra_information] string
Extra information about the bundle, shown on orders and documents.
data[attributes][name] string
Name of the bundle.
data[attributes][photo_base64] string
Base64 encoded photo, use this field to store a main photo.
data[attributes][remote_photo_url] string
Url to an image on the web.
data[attributes][seo_description] string
SEO meta description tag.
data[attributes][seo_title] string
SEO title tag.
data[attributes][show_in_store] boolean
Whether to show this item in the online.
data[attributes][slug] string
Slug of the bundle.
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][tag_list][] array
List of tags.
data[attributes][tax_category_id] uuid
Tax category for tax calculations. When present, this tax category overrides the tax category of the individual products.
data[attributes][taxable] boolean
Whether this bundle is taxable.

Includes

This request accepts the following includes:

photo

bundle_items => product_group => photo

product => photo

tax_category

Update a bundle

How to update a bundle with bundle items:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/bundles/ed81707b-f578-4a6e-82e8-062f3b5ae2d9'
       --header 'content-type: application/json'
       --data '{
         "include": "bundle_items",
         "data": {
           "id": "ed81707b-f578-4a6e-82e8-062f3b5ae2d9",
           "type": "bundles",
           "attributes": {
             "name": "iPad Pro Bundle",
             "bundle_items_attributes": [
               {
                 "id": "3357b030-9385-4491-843f-9bd93e88723a",
                 "_destroy": true
               },
               {
                 "quantity": 2,
                 "discount_percentage": 15,
                 "product_group_id": "a9609021-9ac0-45e8-8bfa-03c58a577154",
                 "product_id": "abff6839-af87-4377-857e-2b217552945d"
               }
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "ed81707b-f578-4a6e-82e8-062f3b5ae2d9",
      "type": "bundles",
      "attributes": {
        "created_at": "2023-01-20T01:56:00.000000+00:00",
        "updated_at": "2023-01-20T01:56:00.000000+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": "ddfe9f02-abf5-48bd-8fba-334decb8c339"
            },
            {
              "type": "bundle_items",
              "id": "d5abce78-6f6d-46ef-8e46-876a07eb7133"
            }
          ]
        }
      }
    },
    "included": [
      {
        "id": "ddfe9f02-abf5-48bd-8fba-334decb8c339",
        "type": "bundle_items",
        "attributes": {
          "created_at": "2023-01-20T01:56:00.000000+00:00",
          "updated_at": "2023-01-20T01:56:00.000000+00:00",
          "quantity": 2,
          "discount_percentage": 15.0,
          "position": 2,
          "bundle_id": "ed81707b-f578-4a6e-82e8-062f3b5ae2d9",
          "product_group_id": "a9609021-9ac0-45e8-8bfa-03c58a577154",
          "product_id": "abff6839-af87-4377-857e-2b217552945d"
        },
        "relationships": {}
      },
      {
        "id": "d5abce78-6f6d-46ef-8e46-876a07eb7133",
        "type": "bundle_items",
        "attributes": {
          "created_at": "2023-01-20T01:56:00.000000+00:00",
          "updated_at": "2023-01-20T01:56:00.000000+00:00",
          "quantity": 2,
          "discount_percentage": 15.0,
          "position": 3,
          "bundle_id": "ed81707b-f578-4a6e-82e8-062f3b5ae2d9",
          "product_group_id": "a9609021-9ac0-45e8-8bfa-03c58a577154",
          "product_id": "abff6839-af87-4377-857e-2b217552945d"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/bundles/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[bundles]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=photo,bundle_items,tax_category

Request body

This request accepts the following body:

Name Description
data[attributes][bundle_items_attributes][] array
Writing to this attribute allows to create or update bundle items at the same time as the bundle itself.
data[attributes][discountable] boolean
Whether discounts should be applied to items in this bundle.
data[attributes][excerpt] string
Excerpt used in the online store.
data[attributes][extra_information] string
Extra information about the bundle, shown on orders and documents.
data[attributes][name] string
Name of the bundle.
data[attributes][photo_base64] string
Base64 encoded photo, use this field to store a main photo.
data[attributes][remote_photo_url] string
Url to an image on the web.
data[attributes][seo_description] string
SEO meta description tag.
data[attributes][seo_title] string
SEO title tag.
data[attributes][show_in_store] boolean
Whether to show this item in the online.
data[attributes][slug] string
Slug of the bundle.
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][tag_list][] array
List of tags.
data[attributes][tax_category_id] uuid
Tax category for tax calculations. When present, this tax category overrides the tax category of the individual products.
data[attributes][taxable] boolean
Whether this bundle is taxable.

Includes

This request accepts the following includes:

photo

bundle_items => product_group => photo

product => photo

tax_category

Archive a bundle

How to delete a bundle:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/bundles/ec090d58-5e64-4db7-89ae-80f6bcdd3d22'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "ec090d58-5e64-4db7-89ae-80f6bcdd3d22",
      "type": "bundles",
      "attributes": {
        "created_at": "2023-08-27T09:39:03.000000+00:00",
        "updated_at": "2023-08-27T09:39:03.000000+00:00",
        "archived": true,
        "archived_at": "2023-08-27T09:39:03.000000+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 separated fields to include instead of the default fields. ?fields[bundles]=created_at,updated_at,archived

Includes

This request does not accept any includes

Bundle items

Bundle items define which products (variations) and product groups are included in a Bundle. When bundles are booked on an order, the quantity and discount percentage defined in a bundle item will be applied.

There are two types of bundle items:

Relationships

Name Description
bundle Bundle required
The Bundle this BundleItem is part of.
product Product optional
When non-null, then this is the prespecified Product that will be booked. When null, then the user has to choose a product variation from the product_group. This relation is required when product_group does not have variations.
product_group Product group required
When the product relation is non-null, then this is the ProductGroup that the Product belongs to. When the product relation is null, then this is the ProductGroup that the user has to choose a product variation from.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
bundle_id uuid readonly-after-create
The Bundle this BundleItem is part of.
created_at datetime readonly
When the resource was created.
discount_percentage float
The discount percentage for this product when rented out as part of a bundle.
id uuid readonly
Primary key.
position integer
Position of this bundle item within the bundle. I.e sorting relative to other bundle items.
product_group_id uuid readonly-after-create
When the product relation is non-null, then this is the ProductGroup that the Product belongs to. When the product relation is null, then this is the ProductGroup that the user has to choose a product variation from.
product_id uuid nullable
When non-null, then this is the prespecified Product that will be booked. When null, then the user has to choose a product variation from the product_group. This relation is required when product_group does not have variations.
quantity integer
The quantity of the product included in the bundle.
updated_at datetime readonly
When the resource was last updated.

List bundle items

How to fetch a list of bundle items:

  curl --get 'https://example.booqable.com/api/boomerang/bundle_items'
       --header 'content-type: application/json'
       --data-urlencode 'filter[bundle_id]=b484afb9-abf3-4598-8fce-44d5d5c62784'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "3e60cc8c-7215-4b14-8a74-8fe96f550d33",
        "type": "bundle_items",
        "attributes": {
          "created_at": "2019-11-14T16:12:00.000000+00:00",
          "updated_at": "2019-11-14T16:12:00.000000+00:00",
          "quantity": 2,
          "discount_percentage": 15.0,
          "position": 1,
          "bundle_id": "b484afb9-abf3-4598-8fce-44d5d5c62784",
          "product_group_id": "935f7965-5c06-44eb-8472-f9aa3f1e036e",
          "product_id": "567ad7e5-6130-401e-84a8-d966a6ae6717"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/bundle_items

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[bundle_items]=created_at,updated_at,quantity
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=bundle,product,product_group
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
bundle_id uuid
eq, not_eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
discount_percentage float
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
position integer
eq, not_eq, gt, gte, lt, lte
product_group_id uuid
eq, not_eq
product_id uuid
eq, not_eq
quantity integer
eq, not_eq, gt, gte, lt, lte
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request accepts the following includes:

bundle

product => photo

product_group => photo

Fetch a bundle item

How to fetch a bundle item:

  curl --get 'https://example.booqable.com/api/boomerang/bundle_items/613a8167-828e-4728-8f62-810a41cd2ba5'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "613a8167-828e-4728-8f62-810a41cd2ba5",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2015-08-13T03:51:01.000000+00:00",
        "updated_at": "2015-08-13T03:51:01.000000+00:00",
        "quantity": 2,
        "discount_percentage": 15.0,
        "position": 1,
        "bundle_id": "2201586a-dcc4-4803-8d2c-2e6d02541f2b",
        "product_group_id": "08475ef9-150e-4113-8035-9a10812b06e9",
        "product_id": "56cf4f31-b9ac-4968-8899-b81f09e246a6"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/bundle_items/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[bundle_items]=created_at,updated_at,quantity
include string
List of comma seperated relationships to sideload. ?include=bundle,product,product_group

Includes

This request accepts the following includes:

bundle

product => photo

product_group => photo

Create 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": "aadf38b5-6d5e-4c54-8d7b-7cce2b00801a",
             "product_group_id": "9bc50456-e92e-4162-8610-8f8ca7323b5b",
             "product_id": "6fb4ee32-8b29-439a-856d-9847696afb13",
             "quantity": 2,
             "discount_percentage": 15
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "3b9d771b-6d67-42d8-83b3-289dedbb7a1e",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2018-09-16T12:53:01.000000+00:00",
        "updated_at": "2018-09-16T12:53:01.000000+00:00",
        "quantity": 2,
        "discount_percentage": 15.0,
        "position": 2,
        "bundle_id": "aadf38b5-6d5e-4c54-8d7b-7cce2b00801a",
        "product_group_id": "9bc50456-e92e-4162-8610-8f8ca7323b5b",
        "product_id": "6fb4ee32-8b29-439a-856d-9847696afb13"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/bundle_items

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[bundle_items]=created_at,updated_at,quantity
include string
List of comma seperated relationships to sideload. ?include=bundle,product,product_group

Request body

This request accepts the following body:

Name Description
data[attributes][bundle_id] uuid
The Bundle this BundleItem is part of.
data[attributes][discount_percentage] float
The discount percentage for this product when rented out as part of a bundle.
data[attributes][position] integer
Position of this bundle item within the bundle. I.e sorting relative to other bundle items.
data[attributes][product_group_id] uuid
When the product relation is non-null, then this is the ProductGroup that the Product belongs to. When the product relation is null, then this is the ProductGroup that the user has to choose a product variation from.
data[attributes][product_id] uuid
When non-null, then this is the prespecified Product that will be booked. When null, then the user has to choose a product variation from the product_group. This relation is required when product_group does not have variations.
data[attributes][quantity] integer
The quantity of the product included in the bundle.

Includes

This request accepts the following includes:

bundle

product => photo

product_group => photo

Update a bundle item

How to update a bundle item:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/bundle_items/b19d7917-4360-464c-8add-3d8003786467'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "b19d7917-4360-464c-8add-3d8003786467",
           "type": "bundle_items",
           "attributes": {
             "quantity": 3,
             "discount_percentage": 20
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "b19d7917-4360-464c-8add-3d8003786467",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2015-01-21T01:26:00.000000+00:00",
        "updated_at": "2015-01-21T01:26:00.000000+00:00",
        "quantity": 3,
        "discount_percentage": 20.0,
        "position": 1,
        "bundle_id": "f53691b2-481e-4f06-8b42-70a8260e0bea",
        "product_group_id": "997ec012-e358-4a2c-8bb9-97674479ed4f",
        "product_id": "73f4eef3-b748-4cd0-8f75-0e013f461872"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/bundle_items/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[bundle_items]=created_at,updated_at,quantity
include string
List of comma seperated relationships to sideload. ?include=bundle,product,product_group

Request body

This request accepts the following body:

Name Description
data[attributes][bundle_id] uuid
The Bundle this BundleItem is part of.
data[attributes][discount_percentage] float
The discount percentage for this product when rented out as part of a bundle.
data[attributes][position] integer
Position of this bundle item within the bundle. I.e sorting relative to other bundle items.
data[attributes][product_group_id] uuid
When the product relation is non-null, then this is the ProductGroup that the Product belongs to. When the product relation is null, then this is the ProductGroup that the user has to choose a product variation from.
data[attributes][product_id] uuid
When non-null, then this is the prespecified Product that will be booked. When null, then the user has to choose a product variation from the product_group. This relation is required when product_group does not have variations.
data[attributes][quantity] integer
The quantity of the product included in the bundle.

Includes

This request accepts the following includes:

bundle

product => photo

product_group => photo

Delete a bundle item

How to delete a bundle item:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/bundle_items/791f0c17-84d2-4362-8ad5-b097d71cf9e6'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "791f0c17-84d2-4362-8ad5-b097d71cf9e6",
      "type": "bundle_items",
      "attributes": {
        "created_at": "2021-05-16T17:50:00.000000+00:00",
        "updated_at": "2021-05-16T17:50:00.000000+00:00",
        "quantity": 2,
        "discount_percentage": 15.0,
        "position": 1,
        "bundle_id": "04391a33-673f-4548-89e1-44e58bdfb28a",
        "product_group_id": "bb5d0ce6-7858-4bcf-8875-352bd5587852",
        "product_id": "98855843-4132-4178-8120-0393eaf5604f"
      },
      "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 separated fields to include instead of the default fields. ?fields[bundle_items]=created_at,updated_at,quantity

Includes

This request does not accept any includes

Clusters

A cluster is a group of locations that share their inventory (and availability). Stock can move between locations within the same cluster, meaning they can be picked up at one location and returned to another.

Relationships

Name Description
locations Locations hasmany
The locations that make up this cluster.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
created_at datetime readonly
When the resource was created.
id uuid readonly
Primary key.
location_ids array readonly-after-create
The locations that belong to this cluster.
name string
Name of the cluster.
updated_at datetime readonly
When the resource was last updated.

List clusters

How to fetch clusters:

  curl --get 'https://example.booqable.com/api/boomerang/clusters'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "c85988b4-e5f9-4b7b-8e84-59dc91306d07",
        "type": "clusters",
        "attributes": {
          "created_at": "2017-04-19T16:54:00.000000+00:00",
          "updated_at": "2017-04-19T16:54:00.000000+00:00",
          "name": "Main",
          "location_ids": []
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/clusters

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[clusters]=created_at,updated_at,name
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=locations
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
location_id uuid
eq, not_eq
name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request accepts the following includes:

locations

Fetch a cluster

How to fetch a single cluster:

  curl --get 'https://example.booqable.com/api/boomerang/clusters/242d27bb-1ff5-41ca-80d5-dd4a2c675525'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "242d27bb-1ff5-41ca-80d5-dd4a2c675525",
      "type": "clusters",
      "attributes": {
        "created_at": "2014-08-27T15:06:00.000000+00:00",
        "updated_at": "2014-08-27T15:06:00.000000+00:00",
        "name": "Main",
        "location_ids": []
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/clusters/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[clusters]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=locations

Includes

This request accepts the following includes:

locations

Create a cluster

How to create a cluster:

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/clusters'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "clusters",
           "attributes": {
             "name": "Amsterdam"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "a4eb298e-c8b8-4b40-85cf-ec9dbbf68a92",
      "type": "clusters",
      "attributes": {
        "created_at": "2024-06-20T05:57:00.000000+00:00",
        "updated_at": "2024-06-20T05:57:00.000000+00:00",
        "name": "Amsterdam",
        "location_ids": []
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/clusters

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[clusters]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=locations

Request body

This request accepts the following body:

Name Description
data[attributes][location_ids][] array
The locations that belong to this cluster.
data[attributes][name] string
Name of the cluster.

Includes

This request accepts the following includes:

locations

Update a cluster

How to update a cluster:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/clusters/df280d1c-34d7-4b2d-89d8-289bf254f317'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "df280d1c-34d7-4b2d-89d8-289bf254f317",
           "type": "clusters",
           "attributes": {
             "name": "Rotterdam"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "df280d1c-34d7-4b2d-89d8-289bf254f317",
      "type": "clusters",
      "attributes": {
        "created_at": "2020-06-22T20:42:09.000000+00:00",
        "updated_at": "2020-06-22T20:42:09.000000+00:00",
        "name": "Rotterdam",
        "location_ids": []
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/clusters/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[clusters]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=locations

Request body

This request accepts the following body:

Name Description
data[attributes][location_ids][] array
The locations that belong to this cluster.
data[attributes][name] string
Name of the cluster.

Includes

This request accepts the following includes:

locations

Delete a cluster

To delete a cluster make sure no active locations are associated with it anymore.

How to delete a cluster:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/clusters/79f093e1-f668-4a70-8e91-6f10c351314a'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "79f093e1-f668-4a70-8e91-6f10c351314a",
      "type": "clusters",
      "attributes": {
        "created_at": "2019-06-18T06:27:00.000000+00:00",
        "updated_at": "2019-06-18T06:27:00.000000+00:00",
        "name": "Main",
        "location_ids": []
      },
      "relationships": {}
    },
    "meta": {}
  }

A failure due to a cluster still being associated with locations:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/clusters/475d542a-ad19-4eea-87be-bdc3a2726baf'
       --header 'content-type: application/json'

A 422 status response looks like this:

  {
    "errors": [
      {
        "code": "cluster_has_locations",
        "status": "422",
        "title": "Cluster has locations",
        "detail": "This cluster has 1 or more active locations",
        "meta": {
          "location_ids": [
            "cfa08864-2479-40cd-81ac-e6426c3c303a"
          ]
        }
      }
    ]
  }

HTTP Request

DELETE /api/boomerang/clusters/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[clusters]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=locations

Includes

This request accepts the following includes:

locations

Collections

Collections are used to create a hierarchy of products.

To change the ordering of items within a collection, use Sortings.

Relationships

Name Description
collection_items Collection items hasmany
All items that make up this collection. Each collection item adds either a product group or a bundle to this collection.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
all_children array readonly extra
All child collections.
all_parents array readonly extra
All parent collections.
collection_type enum readonly-after-create
Dynamic collections are automatically updated. Static collections are defined by the user.
One of: static, dynamic.
created_at datetime readonly
When the resource was created.
depth integer readonly
How deep this collection sits in the hierarchy. Depth 1 are the top-level collection, depth 2 are the children, and depth 3 the grandchildren. Nesting is limited to 3 levels.
description string
A description of this collection.
hierarchical_name array[string] readonly extra
Names of all parents, with the name of this collection as last.
id uuid readonly
Primary key.
image_base64 string writeonly
Base64 encoded photo, use this field to add a photo.
image_large_url string readonly
URL of the large image for this collection.
image_url string readonly
URL of the image for this collection.
item_count integer
Number of collection items in this collection. Does (not?) include nested collections?.
name string
Name of this collection.
parent_id uuid
The ID of the parent collection.
position integer readonly
Relative position of this collection among its siblings within the same parent collection.
remote_image_url string writeonly
Url to an image on the web, use this field to add a photo.
seo_description string
SEO description.
seo_title string
SEO title.
show_in_store boolean
Whether to show this collection in the online store.
slug string
Slug used in online store URLs.
system boolean
When true, this collection is generated and maintained automatically by Booqable. System collections cannot be updated or deleted.
updated_at datetime readonly
When the resource was last updated.

List collections

How to fetch collections:

  curl --get 'https://example.booqable.com/api/boomerang/collections'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "e8b928ec-172a-4655-80f9-eea1a1be9c89",
        "type": "collections",
        "attributes": {
          "created_at": "2015-11-17T02:13:02.000000+00:00",
          "updated_at": "2015-11-17T02:13:02.000000+00:00",
          "name": "All Seasons",
          "slug": "all-seasons",
          "description": null,
          "seo_title": null,
          "seo_description": null,
          "collection_type": "manual",
          "system": false,
          "item_count": 0,
          "show_in_store": true,
          "parent_id": null,
          "depth": 1,
          "position": null,
          "image_url": null,
          "image_large_url": null
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/collections

Request params

This request accepts the following parameters:

Name Description
extra_fields[] array
List of comma separated fields to include in addition to the default fields. ?extra_fields[collections]=all_parents,all_children,hierarchical_name
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[collections]=created_at,updated_at,name
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
collection_type string_enum
eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
depth integer
eq, not_eq, gt, gte, lt, lte
description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
hierarchical_q string
eq
id uuid
eq, not_eq
name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
parent_id uuid
eq, not_eq
position integer
eq, not_eq, gt, gte, lt, lte
q string
eq
seo_description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
seo_title string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
show_in_store boolean
eq
slug string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
system boolean
eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request does not accept any includes

Fetch a collection

How to fetch a single collection:

  curl --get 'https://example.booqable.com/api/boomerang/collections/e747596e-eb84-4e15-8b4e-9b160d64633c'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "e747596e-eb84-4e15-8b4e-9b160d64633c",
      "type": "collections",
      "attributes": {
        "created_at": "2021-12-02T10:21:01.000000+00:00",
        "updated_at": "2021-12-02T10:21:01.000000+00:00",
        "name": "All Seasons",
        "slug": "all-seasons",
        "description": null,
        "seo_title": null,
        "seo_description": null,
        "collection_type": "manual",
        "system": false,
        "item_count": 0,
        "show_in_store": true,
        "parent_id": null,
        "depth": 1,
        "position": null,
        "image_url": null,
        "image_large_url": null
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/collections/{id}

Request params

This request accepts the following parameters:

Name Description
extra_fields[] array
List of comma separated fields to include in addition to the default fields. ?extra_fields[collections]=all_parents,all_children,hierarchical_name
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[collections]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=collection_items

Includes

This request accepts the following includes:

collection_items => item => photo

Create a collection

How to create a collection:

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/collections'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "collections",
           "attributes": {
             "name": "Spring Collection"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "067fbd40-bc13-4aec-8426-a75cc1a273f8",
      "type": "collections",
      "attributes": {
        "created_at": "2019-04-23T15:23:58.000000+00:00",
        "updated_at": "2019-04-23T15:23:58.000000+00:00",
        "name": "Spring Collection",
        "slug": "spring-collection",
        "description": null,
        "seo_title": null,
        "seo_description": null,
        "collection_type": null,
        "system": false,
        "item_count": 0,
        "show_in_store": true,
        "parent_id": null,
        "depth": 1,
        "position": null,
        "image_url": null,
        "image_large_url": null
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/collections

Request params

This request accepts the following parameters:

Name Description
extra_fields[] array
List of comma separated fields to include in addition to the default fields. ?extra_fields[collections]=all_parents,all_children,hierarchical_name
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[collections]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=collection_items

Request body

This request accepts the following body:

Name Description
data[attributes][collection_type] enum
Dynamic collections are automatically updated. Static collections are defined by the user.
One of: static, dynamic.
data[attributes][image_base64] string
Base64 encoded photo, use this field to add a photo.
data[attributes][item_count] integer
Number of collection items in this collection. Does (not?) include nested collections?.
data[attributes][name] string
Name of this collection.
data[attributes][parent_id] uuid
The ID of the parent collection.
data[attributes][remote_image_url] string
Url to an image on the web, use this field to add a photo.
data[attributes][seo_description] string
SEO description.
data[attributes][seo_title] string
SEO title.
data[attributes][show_in_store] boolean
Whether to show this collection in the online store.
data[attributes][slug] string
Slug used in online store URLs.
data[attributes][system] boolean
When true, this collection is generated and maintained automatically by Booqable. System collections cannot be updated or deleted.

Includes

This request accepts the following includes:

collection_items => item => photo

Update a collection

How to update a collection:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/collections/6ee95651-79a3-47df-875d-6bceb66cb4e6'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "6ee95651-79a3-47df-875d-6bceb66cb4e6",
           "type": "collections",
           "attributes": {
             "name": "Fall Collection"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "6ee95651-79a3-47df-875d-6bceb66cb4e6",
      "type": "collections",
      "attributes": {
        "created_at": "2026-04-06T17:47:00.000000+00:00",
        "updated_at": "2026-04-06T17:47:00.000000+00:00",
        "name": "Fall Collection",
        "slug": "all-seasons",
        "description": null,
        "seo_title": null,
        "seo_description": null,
        "collection_type": "manual",
        "system": false,
        "item_count": 0,
        "show_in_store": true,
        "parent_id": null,
        "depth": 1,
        "position": null,
        "image_url": null,
        "image_large_url": null
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/collections/{id}

Request params

This request accepts the following parameters:

Name Description
extra_fields[] array
List of comma separated fields to include in addition to the default fields. ?extra_fields[collections]=all_parents,all_children,hierarchical_name
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[collections]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=collection_items

Request body

This request accepts the following body:

Name Description
data[attributes][collection_type] enum
Dynamic collections are automatically updated. Static collections are defined by the user.
One of: static, dynamic.
data[attributes][image_base64] string
Base64 encoded photo, use this field to add a photo.
data[attributes][item_count] integer
Number of collection items in this collection. Does (not?) include nested collections?.
data[attributes][name] string
Name of this collection.
data[attributes][parent_id] uuid
The ID of the parent collection.
data[attributes][remote_image_url] string
Url to an image on the web, use this field to add a photo.
data[attributes][seo_description] string
SEO description.
data[attributes][seo_title] string
SEO title.
data[attributes][show_in_store] boolean
Whether to show this collection in the online store.
data[attributes][slug] string
Slug used in online store URLs.
data[attributes][system] boolean
When true, this collection is generated and maintained automatically by Booqable. System collections cannot be updated or deleted.

Includes

This request accepts the following includes:

collection_items => item => photo

Delete a collection

To delete a collection make sure there are no nested collections anymore.

How to delete a collection:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/collections/df45847d-b793-411a-82a7-2344685a75df'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "df45847d-b793-411a-82a7-2344685a75df",
      "type": "collections",
      "attributes": {
        "created_at": "2022-02-26T11:23:14.000000+00:00",
        "updated_at": "2022-02-26T11:23:14.000000+00:00",
        "name": "All Seasons",
        "slug": "all-seasons",
        "description": null,
        "seo_title": null,
        "seo_description": null,
        "collection_type": "manual",
        "system": false,
        "item_count": 0,
        "show_in_store": true,
        "parent_id": null,
        "depth": 1,
        "position": null,
        "image_url": null,
        "image_large_url": null
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

DELETE /api/boomerang/collections/{id}

Request params

This request accepts the following parameters:

Name Description
extra_fields[] array
List of comma separated fields to include in addition to the default fields. ?extra_fields[collections]=all_parents,all_children,hierarchical_name
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[collections]=created_at,updated_at,name

Includes

This request does not accept any includes

Collection items

An item in a Collection.

CollectionItems cannot be changed directly, but their position can be updated through the Sortings resource.

Relationships

Name Description
collection Collection required
The Collection this CollectionItem is part of.
item Item required
The item. Can be a ProductGroup or a Bundle.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
collection_id uuid readonly-after-create
The Collection this CollectionItem is part of.
created_at datetime readonly
When the resource was created.
id uuid readonly
Primary key.
implicit boolean readonly
A value of true indicates that this item was not added explicitly, but instead is included in one of the child Collections.
item_id uuid readonly-after-create
The item. Can be a ProductGroup or a Bundle.
position integer readonly
Position of this item within the Collection. I.e sorting relative to other CollectionItems.
source_collections array readonly extra
The child Collection(s) which explicitly include the ProductGroup/Bundle, and are the source(s) for this CollectionItem.

List collection items

How to fetch collection items:

  curl --get 'https://example.booqable.com/api/boomerang/collection_items'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "c1cd76e1-4623-455e-8573-566ce1ce6c28",
        "type": "collection_items",
        "attributes": {
          "created_at": "2023-01-20T16:48:01.000000+00:00",
          "updated_at": "2023-01-20T16:48:01.000000+00:00",
          "item_id": "33763613-da95-4e0a-89fd-1394814769da",
          "collection_id": "80277708-d325-42a0-87a1-7e45bb3167ec",
          "position": null,
          "implicit": false
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/collection_items

Request params

This request accepts the following parameters:

Name Description
extra_fields[] array
List of comma separated fields to include in addition to the default fields. ?extra_fields[collection_items]=source_collections
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[collection_items]=created_at,item_id,collection_id
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=item,collection
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
collection_id uuid
eq, not_eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
exclude_system_collections boolean
eq
id uuid
eq, not_eq
implicit boolean
eq
item_id uuid
eq, not_eq
position integer
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request accepts the following includes:

item => photo

collection

Create a collection item

How to create a collection item:

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/collection_items'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "collection_items",
           "attributes": {
             "item_id": "facd8ef7-5f11-4dae-8318-f3a59f73560e",
             "collection_id": "d9c4b730-729f-4e5d-8809-1be451f56dac"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "2f9668f0-65ed-4b5c-865d-f8e91d0b51cd",
      "type": "collection_items",
      "attributes": {
        "created_at": "2025-05-23T01:55:00.000000+00:00",
        "updated_at": "2025-05-23T01:55:00.000000+00:00",
        "item_id": "facd8ef7-5f11-4dae-8318-f3a59f73560e",
        "collection_id": "d9c4b730-729f-4e5d-8809-1be451f56dac",
        "position": null,
        "implicit": false
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/collection_items

Request params

This request accepts the following parameters:

Name Description
extra_fields[] array
List of comma separated fields to include in addition to the default fields. ?extra_fields[collection_items]=source_collections
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[collection_items]=created_at,item_id,collection_id

Request body

This request accepts the following body:

Name Description
data[attributes][collection_id] uuid
The Collection this CollectionItem is part of.
data[attributes][item_id] uuid
The item. Can be a ProductGroup or a Bundle.

Includes

This request does not accept any includes

Delete a collection item

How to delete a collection item:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/collection_items/ec034cc0-89e0-42f0-8a00-b2a59de8c98a'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "ec034cc0-89e0-42f0-8a00-b2a59de8c98a",
      "type": "collection_items",
      "attributes": {
        "created_at": "2018-01-04T10:28:00.000000+00:00",
        "updated_at": "2018-01-04T10:28:00.000000+00:00",
        "item_id": "cdb92bdf-3a07-413f-8f82-69cb2d3ea2b1",
        "collection_id": "fc597631-ca5b-4fcb-83eb-2b59c0f54073",
        "position": null,
        "implicit": false
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

DELETE /api/boomerang/collection_items/{id}

Request params

This request accepts the following parameters:

Name Description
extra_fields[] array
List of comma separated fields to include in addition to the default fields. ?extra_fields[collection_items]=source_collections
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[collection_items]=created_at,item_id,collection_id

Includes

This request does not accept any includes

Collection trees

Allows making multiple changes to the tree of collections at once.

Fields

Name Description
collections array writeonly
Array of hashes, which each describe an update to make.
id uuid readonly
Primary key.

Update the tree

How to update the tree:

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/collection_trees'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "collection_trees",
           "attributes": {
             "collections": [
               {
                 "id": "7ee0b635-bd10-4ade-835f-08e7a341e36d",
                 "parent_id": "786ce8ea-70d2-46b4-8a1c-f59a62784714",
                 "position": 3
               },
               {
                 "id": "be1d0d57-55e2-47ed-8bd9-7aef1ccdc47d",
                 "parent_id": "f773a180-793f-4c5e-8640-a794e8b7a3b9",
                 "position": 4
               }
             ]
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "4583bb5e-28c4-4e74-8610-06c05f98a464",
      "type": "collection_trees"
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/collection_trees

Request body

This request accepts the following body:

Name Description
data[attributes][collections][] array
Array of hashes, which each describe an update to make.

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.

Fields

Name Description
address string readonly
The full address.
address_line_1 string
First address line.
address_line_2 string
Second address line.
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.
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_city string
City (used for invoices received from Booqable).
billing_address_country string
Country (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_region string
Region (used for invoices received from Booqable).
billing_address_zipcode string
Zipcode (used for invoices received from Booqable).
billing_company string
Company name (used for invoices received from Booqable).
billing_email string
Used to send billing emails to.
city string
City.
continent string readonly
Continent the company is situated.
country string
Country.
created_at datetime readonly
When the resource was created.
currency string
Currency of the company.
custom_domain string
Custom domain to use for hosted store and checkout.
custom_domain_validation hash
Validation details for the custom domain.
default_timezone string
Company's default timezone.
development boolean readonly
Whether this is a development account.
email string
Used in customer communication, on documents and as the reply-to address for emails that are being sent.
favicon_base64 string writeonly
To upload a favicon send it as a base64 encoded string.
favicon_url string readonly
Company favicon url.
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.
id uuid readonly
Primary key.
in_europe boolean readonly
Whether company is situated in europe.
installed_online_store boolean readonly
If the online store is installed, this boolean will return true.
logo_base64 string writeonly
To update a logo send it as base64 encoded string.
logo_url string readonly
Url of the uploaded logo.
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.
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.
market string
The market the company operates in.
medium string readonly
UTM medium present during signup.
name string
Name of the company.
pending_subscription boolean readonly
Whether the company has a pending subscription.
phone string
Phone number.
region string
Region.
remove_favicon boolean writeonly
Remove current favicon.
remove_logo boolean writeonly
Remove current logo.
revenue_last_year string readonly
Revenue last year given during signup.
shop_theme_id uuid
ID of installed shop theme.
slug string readonly
Company's slug, the part of the domainname before booqable.com.
source string readonly
UTM source present during signup.
subscription hash readonly extra
Details about the subscription.
team_size string readonly
Team size given during signup.
tenant_token string readonly
Token.
third_party_id string
ID used for third party tools.
updated_at datetime readonly
When the resource was last updated.
use_billing_address boolean
Whether to use billing address on invoices received from Booqable.
vat_number string
Company's vat number, used in customer communication and to define tax exempts.
website string
Website.
year_business_start string readonly
Year when company started, given during signup.
zipcode string
Zipcode.

Fetch a company

How to fetch a company:

  curl --get 'https://example.booqable.com/api/boomerang/companies/current'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "9391cc27-0209-4fb5-8077-0e7af94f571d",
      "type": "companies",
      "attributes": {
        "created_at": "2025-12-03T02:00:00.000000+00:00",
        "updated_at": "2025-12-03T02:00:00.000000+00:00",
        "name": "iRent",
        "slug": "irent",
        "email": "[email protected]",
        "billing_email": null,
        "phone": null,
        "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,
        "in_europe": null,
        "continent": null,
        "custom_domain": null,
        "custom_domain_validation": null,
        "development": false,
        "shop_theme_id": null,
        "installed_online_store": false,
        "source": null,
        "medium": null,
        "tenant_token": "e08844f444c33fcafbe78fef211e194c",
        "pending_subscription": false,
        "team_size": null,
        "revenue_last_year": 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,
        "third_party_id": "9391cc27-0209-4fb5-8077-0e7af94f571d"
      }
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/companies/current

Request params

This request accepts the following parameters:

Name Description
extra_fields[] array
List of comma separated fields to include in addition to the default fields. ?extra_fields[companies]=subscription
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[companies]=created_at,updated_at,name

Includes

This request does not accept any includes

Fetch 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 --get 'https://example.booqable.com/api/boomerang/companies/current'
       --header 'content-type: application/json'
       --data-urlencode 'extra_fields[companies]=subscription'
       --data-urlencode 'fields[companies]=subscription'

A 200 status response looks like this:

  {
    "data": {
      "id": "b962f1eb-9fbc-42f9-81ac-a12d0b5a2174",
      "type": "companies",
      "attributes": {
        "subscription": {
          "trial_ends_at": "2019-05-03T10:16:00.000000+00:00",
          "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
extra_fields[] array
List of comma separated fields to include in addition to the default fields. ?extra_fields[companies]=subscription
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[companies]=created_at,updated_at,name

Includes

This request does not accept any includes

Update 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": "39b6d9bd-03cc-4869-8a7a-9e3ca8f59712",
           "type": "companies",
           "attributes": {
             "name": "iRent LLC"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "39b6d9bd-03cc-4869-8a7a-9e3ca8f59712",
      "type": "companies",
      "attributes": {
        "created_at": "2020-02-19T10:28:01.000000+00:00",
        "updated_at": "2020-02-19T10:28:01.000000+00:00",
        "name": "iRent LLC",
        "slug": "irent",
        "email": "[email protected]",
        "billing_email": null,
        "phone": null,
        "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,
        "in_europe": null,
        "continent": null,
        "custom_domain": null,
        "custom_domain_validation": null,
        "development": false,
        "shop_theme_id": null,
        "installed_online_store": false,
        "source": null,
        "medium": null,
        "tenant_token": "7a1067c6345a05d4627e8ec7bdeadbe6",
        "pending_subscription": false,
        "team_size": null,
        "revenue_last_year": 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,
        "third_party_id": "39b6d9bd-03cc-4869-8a7a-9e3ca8f59712"
      }
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/companies/current

Request params

This request accepts the following parameters:

Name Description
extra_fields[] array
List of comma separated fields to include in addition to the default fields. ?extra_fields[companies]=subscription
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[companies]=created_at,updated_at,name

Request body

This request accepts the following body:

Name Description
data[attributes][address_line_1] string
First address line.
data[attributes][address_line_2] string
Second address line.
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.
data[attributes][billing_address_city] string
City (used for invoices received from Booqable).
data[attributes][billing_address_country] string
Country (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_region] string
Region (used for invoices received from Booqable).
data[attributes][billing_address_zipcode] string
Zipcode (used for invoices received from Booqable).
data[attributes][billing_company] string
Company name (used for invoices received from Booqable).
data[attributes][billing_email] string
Used to send billing emails to.
data[attributes][city] string
City.
data[attributes][country] string
Country.
data[attributes][currency] string
Currency of the company.
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][default_timezone] string
Company's default timezone.
data[attributes][email] string
Used in customer communication, on documents and as the reply-to address for emails that are being sent.
data[attributes][favicon_base64] string
To upload a favicon send it as a base64 encoded string.
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][logo_base64] string
To update a logo send it as base64 encoded string.
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][market] string
The market the company operates in.
data[attributes][name] string
Name of the company.
data[attributes][phone] string
Phone number.
data[attributes][region] string
Region.
data[attributes][remove_favicon] boolean
Remove current favicon.
data[attributes][remove_logo] boolean
Remove current logo.
data[attributes][shop_theme_id] uuid
ID of installed shop theme.
data[attributes][third_party_id] string
ID used for third party tools.
data[attributes][use_billing_address] boolean
Whether to use billing address on invoices received from Booqable.
data[attributes][vat_number] string
Company's vat number, used in customer communication and to define tax exempts.
data[attributes][website] string
Website.
data[attributes][zipcode] string
Zipcode.

Includes

This request does not accept any includes

Countries

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

Relationships

Name Description
provinces Provinces hasmany
The provinces/states of this country (or any other administrative subdivision).

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
alpha2 string readonly
ISO 3166-1 alpha-2 code.
city_autofill string readonly
The value to use for the city when autofilling.
created_at datetime readonly
When the resource was created.
form_layout string readonly
The layout of the address form.
id uuid readonly
Primary key.
name string readonly
Name of the country.
province_required boolean readonly
Whether a province is required for addresses in this country.
province_type string readonly
The province type of this country.
show_layout string readonly
The layout of the address when shown.
updated_at datetime readonly
When the resource was last updated.
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_required boolean readonly
Whether a zipcode is required for addresses in this country.
zipcode_type string readonly
The zipcode type of this country.

List countries

How to fetch a list of countries:

  curl --get 'https://example.booqable.com/api/boomerang/countries'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "adafbcae-49c4-4209-8932-8b822acb8924",
        "type": "countries",
        "attributes": {
          "created_at": "2028-11-04T19:33:00.000000+00:00",
          "updated_at": "2028-11-04T19:33:00.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[countries]=created_at,updated_at,name
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=provinces
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
alpha2 string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
updated_at datetime
eq, not_eq, gt, gte, lt, lte

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 in the back office.

Fields

Name Description
active boolean
Whether coupon can be redeemed at the moment.
archived boolean readonly
Whether coupon is archived.
archived_at datetime readonly nullable
When the coupon was archived.
coupon_type string
How the discount is calculated.
created_at datetime readonly
When the resource was created.
id uuid readonly
Primary key.
identifier string
The code that customers need to type in.
updated_at datetime readonly
When the resource was last updated.
value integer
A percentage for type percentage or a value in cents for cents.

List coupons

How to fetch a list of coupons:

  curl --get 'https://example.booqable.com/api/boomerang/coupons'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "631bea2b-3cb8-4bbd-819d-7cb0257b110e",
        "type": "coupons",
        "attributes": {
          "created_at": "2021-07-21T18:25:00.000000+00:00",
          "updated_at": "2021-07-21T18:25:00.000000+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 separated fields to include instead of the default fields. ?fields[coupons]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
active boolean
eq
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
coupon_type string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
identifier string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
updated_at datetime
eq, not_eq, gt, gte, lt, lte
value integer
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request does not accept any includes

Fetch a coupon

How to fetch a coupon:

  curl --get 'https://example.booqable.com/api/boomerang/coupons/2a057098-ccb5-4179-800a-0d295431eaa3'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "2a057098-ccb5-4179-800a-0d295431eaa3",
      "type": "coupons",
      "attributes": {
        "created_at": "2026-09-19T23:57:00.000000+00:00",
        "updated_at": "2026-09-19T23:57:00.000000+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 separated fields to include instead of the default fields. ?fields[coupons]=created_at,updated_at,archived

Includes

This request does not accept any includes

Create 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": "e2ba40bf-54f7-422e-844e-5d36bacd5bfa",
      "type": "coupons",
      "attributes": {
        "created_at": "2020-12-12T20:49:00.000000+00:00",
        "updated_at": "2020-12-12T20:49:00.000000+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 separated fields to include instead of the default fields. ?fields[coupons]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][active] boolean
Whether coupon can be redeemed at the moment.
data[attributes][coupon_type] string
How the discount is calculated.
data[attributes][identifier] string
The code that customers need to type in.
data[attributes][value] integer
A percentage for type percentage or a value in cents for cents.

Includes

This request does not accept any includes

Update 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/90aa7e25-800f-4f23-84c2-1f077eaea4dd'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "90aa7e25-800f-4f23-84c2-1f077eaea4dd",
           "type": "coupons",
           "attributes": {
             "identifier": "SUMMER30OFF",
             "coupon_type": "percentage",
             "value": 30
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "f3f44405-c4fe-424e-8fe4-bfdfe6a7f761",
      "type": "coupons",
      "attributes": {
        "created_at": "2021-03-12T23:40:01.000000+00:00",
        "updated_at": "2021-03-12T23:40:01.000000+00:00",
        "archived": false,
        "archived_at": null,
        "identifier": "SUMMER30OFF",
        "coupon_type": "percentage",
        "value": 30,
        "active": false
      }
    },
    "meta": {}
  }

How to deactivate a coupon:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/coupons/8c0f8005-b948-4ddc-855b-6825e4159246'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "8c0f8005-b948-4ddc-855b-6825e4159246",
           "type": "coupons",
           "attributes": {
             "active": false
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "aa069e77-af42-4e2c-862a-53a56308bcc0",
      "type": "coupons",
      "attributes": {
        "created_at": "2022-08-10T18:19:00.000000+00:00",
        "updated_at": "2022-08-10T18:19:00.000000+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 separated fields to include instead of the default fields. ?fields[coupons]=created_at,updated_at,archived

Request body

This request accepts the following body:

Name Description
data[attributes][active] boolean
Whether coupon can be redeemed at the moment.
data[attributes][coupon_type] string
How the discount is calculated.
data[attributes][identifier] string
The code that customers need to type in.
data[attributes][value] integer
A percentage for type percentage or a value in cents for cents.

Includes

This request does not accept any includes

Archive a coupon

How to archive a coupon:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/coupons/48f7032a-1017-4616-82e3-be69134a1685'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "48f7032a-1017-4616-82e3-be69134a1685",
      "type": "coupons",
      "attributes": {
        "created_at": "2015-09-09T21:54:00.000000+00:00",
        "updated_at": "2015-09-09T21:54:00.000000+00:00",
        "archived": true,
        "archived_at": "2015-09-09T21:54:00.000000+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 separated fields to include instead of the default fields. ?fields[coupons]=created_at,updated_at,archived

Includes

This request does not accept any includes

Customers

Customers are an essential part of your business.

Stored customer information like addresses, customer tax profiles, discounts, and customized security deposits are applied to an order when created or when assigned a new customer.

Relationships

Name Description
barcode Barcode optional
The barcode pointing to this customer.
merge_suggestion_customer Customer required
Holds the customer this customer is a possible duplicate of.
notes Notes hasmany
Notes added about (and invisible for) customers.
properties Properties hasmany
Custom structured data about this customer, based on DefaultProperties. Properties of customers can be updated in bulk by writing to the properties_attributes attribute.
tax_region Tax region optional
Tax region assigned to new orders for this customer.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
archived boolean readonly
Whether customer is archived.
archived_at datetime readonly nullable
When the customer was archived.
created_at datetime readonly
When the resource was created.
deposit_type string
The deposit added to new orders of this customer by default.
deposit_value float
The value to use for deposit_type.
discount_percentage float
Default discount applied to each new order for this customer.
email string nullable
E-mail address used for communication.
email_marketing_consent_updated_at datetime readonly
When the email marketing consent was last updated.
email_marketing_consented boolean
Whether the customer has consented to receive email marketing.
id uuid readonly
Primary key.
legal_type string
Either person or commercial.
merge_suggestion_customer_id uuid
Holds the customer this customer is a possible duplicate of.
name string
Person or Company name.
number integer readonly
The assigned number.
properties hash readonly
A hash containing all basic property values. This is a simplified representation; sideload the properties relation if you need more detailed information of propertoes.
properties_attributes array writeonly
Create or update multiple properties to be associated with this customer.
tag_list array[string]
Case insensitive tag list.
tax_region_id uuid nullable
Tax region assigned to new orders for this customer.
updated_at datetime readonly
When the resource was last updated.

List customers

How to fetch a list of customers:

  curl --get 'https://example.booqable.com/api/boomerang/customers'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "b047cd19-e6ec-4914-8ddb-960e2ed984fa",
        "type": "customers",
        "attributes": {
          "created_at": "2018-06-02T01:12:12.000000+00:00",
          "updated_at": "2018-06-02T01:12:12.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[customers]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=barcode,properties,tax_region
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
conditions hash
eq
created_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
deposit_value float
eq, not_eq, gt, gte, lt, lte
discount_percentage float
eq, not_eq, gt, gte, lt, lte
email string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
email_marketing_consented boolean
eq
id uuid
eq, not_eq, gt
legal_type string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
merge_suggestion_customer_id uuid
eq, not_eq
name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
number integer
eq, not_eq, gt, gte, lt, lte
q string
eq
tag_list string
eq
tax_region_id uuid
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

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

Includes

This request accepts the following includes:

barcode

properties

tax_region

Search 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": "fc31d64f-c136-4d37-8a09-e821bf52af93"
      },
      {
        "id": "987d8eb5-6236-4d00-8f7b-308f06d36519"
      }
    ]
  }

HTTP Request

POST api/boomerang/customers/search

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[customers]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=barcode,properties,tax_region
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
conditions hash
eq
created_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
deposit_value float
eq, not_eq, gt, gte, lt, lte
discount_percentage float
eq, not_eq, gt, gte, lt, lte
email string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
email_marketing_consented boolean
eq
id uuid
eq, not_eq, gt
legal_type string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
merge_suggestion_customer_id uuid
eq, not_eq
name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
number integer
eq, not_eq, gt, gte, lt, lte
q string
eq
tag_list string
eq
tax_region_id uuid
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

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

Includes

This request accepts the following includes:

barcode

properties

tax_region

Fetch a customer

How to fetch a customers:

  curl --get 'https://example.booqable.com/api/boomerang/customers/2270a849-1797-436e-8b18-ef3fd6058a01'
       --header 'content-type: application/json'
       --data-urlencode 'include=barcode,properties'

A 200 status response looks like this:

  {
    "data": {
      "id": "2270a849-1797-436e-8b18-ef3fd6058a01",
      "type": "customers",
      "attributes": {
        "created_at": "2028-05-22T08:53:00.000000+00:00",
        "updated_at": "2028-05-22T08:53:00.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[customers]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=barcode,properties,tax_region

Includes

This request accepts the following includes:

barcode

properties

tax_region

Create 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": "81f21c77-e757-43d7-842f-41c5c184945e",
      "type": "customers",
      "attributes": {
        "created_at": "2015-09-14T16:31:01.000000+00:00",
        "updated_at": "2015-09-14T16:31:01.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[customers]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=barcode,properties,tax_region

Request body

This request accepts the following body:

Name Description
data[attributes][deposit_type] string
The deposit added to new orders of this customer by default.
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][email] string
E-mail address used for communication.
data[attributes][email_marketing_consented] boolean
Whether the customer has consented to receive email marketing.
data[attributes][legal_type] string
Either person or commercial.
data[attributes][merge_suggestion_customer_id] uuid
Holds the customer this customer is a possible duplicate of.
data[attributes][name] string
Person or Company name.
data[attributes][properties_attributes][] array
Create or update multiple properties to be associated with this customer.
data[attributes][tag_list] array[string]
Case insensitive tag list.
data[attributes][tax_region_id] uuid
Tax region assigned to new orders for this customer.

Includes

This request accepts the following includes:

barcode

properties

tax_region

Update a customer

How to update a customer:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/customers/7eaf3c75-3143-4090-8ccf-32b899f324c9'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "7eaf3c75-3143-4090-8ccf-32b899f324c9",
           "type": "customers",
           "attributes": {
             "name": "Jane Doe"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "7eaf3c75-3143-4090-8ccf-32b899f324c9",
      "type": "customers",
      "attributes": {
        "created_at": "2014-02-18T23:31:00.000000+00:00",
        "updated_at": "2014-02-18T23:31:00.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[customers]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=barcode,properties,tax_region

Request body

This request accepts the following body:

Name Description
data[attributes][deposit_type] string
The deposit added to new orders of this customer by default.
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][email] string
E-mail address used for communication.
data[attributes][email_marketing_consented] boolean
Whether the customer has consented to receive email marketing.
data[attributes][legal_type] string
Either person or commercial.
data[attributes][merge_suggestion_customer_id] uuid
Holds the customer this customer is a possible duplicate of.
data[attributes][name] string
Person or Company name.
data[attributes][properties_attributes][] array
Create or update multiple properties to be associated with this customer.
data[attributes][tag_list] array[string]
Case insensitive tag list.
data[attributes][tax_region_id] uuid
Tax region assigned to new orders for this customer.

Includes

This request accepts the following includes:

barcode

properties

tax_region

Archive a customer

How to archive a customer:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/customers/7a496d55-729c-43e0-8a6b-8d505e0f3c70'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "7a496d55-729c-43e0-8a6b-8d505e0f3c70",
      "type": "customers",
      "attributes": {
        "created_at": "2020-05-21T12:16:00.000000+00:00",
        "updated_at": "2020-05-21T12:16:00.000000+00:00",
        "archived": true,
        "archived_at": "2020-05-21T12:16:00.000000+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 separated fields to include instead of the default fields. ?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. 0

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 configuration from a default property when they are connected.

When creating properties they are connected with their default when one of the following fields match: - name - identifier - default_property_id

Fields

Name Description
created_at datetime readonly
When the resource was created.
editable boolean readonly
Whether this property is editable.
id uuid readonly
Primary key.
identifier string
Key that will be used in exports, responses and custom field variables in templates.
name string
Name of the property (used as label and to compute identifier if left blank).
owner_type string readonly-after-create
The type of resource this default property is intended for and derived properties can be added to.
position integer
Which position the property has.
property_type enum
Determines how the data is rendered and the kind of input shown to the user.
One of: address, date_field, email, phone, select, text_area, text_field.
select_options array
For type select. The select options as array..
show_on array[string]
Array of items to show this custom field on. Zero or more from contract, invoice, packing, quote.
updated_at datetime readonly
When the resource was last updated.
validation_required boolean
Whether this property has to be validated.

List default properties

How to fetch a list of default properties:

  curl --get 'https://example.booqable.com/api/boomerang/default_properties'
       --header 'content-type: application/json'
       --data-urlencode 'include=owner'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "5d959acd-b782-4ee2-858b-d53452746abe",
        "type": "default_properties",
        "attributes": {
          "created_at": "2016-08-06T16:53:03.000000+00:00",
          "updated_at": "2016-08-06T16:53:03.000000+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 separated fields to include instead of the default fields. ?fields[default_properties]=created_at,updated_at,name
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
created_at datetime
eq, not_eq, gt, gte, lt, lte
editable boolean
eq
id uuid
eq, not_eq
identifier 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
owner_type string
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte
validation_required boolean
eq

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request does not accept any includes

Fetch a default property

How to fetch a default property:

  curl --get 'https://example.booqable.com/api/boomerang/default_properties/e579fd95-e66a-48b3-8954-a1303f0d4543'
       --header 'content-type: application/json'
       --data-urlencode 'include=owner'

A 200 status response looks like this:

  {
    "data": {
      "id": "e579fd95-e66a-48b3-8954-a1303f0d4543",
      "type": "default_properties",
      "attributes": {
        "created_at": "2016-06-28T12:50:01.000000+00:00",
        "updated_at": "2016-06-28T12:50:01.000000+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 separated fields to include instead of the default fields. ?fields[default_properties]=created_at,updated_at,name

Includes

This request does not accept any includes

Create 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": "0be37be8-1023-49f4-838a-f1f4a10954ef",
      "type": "default_properties",
      "attributes": {
        "created_at": "2019-06-17T18:28:00.000000+00:00",
        "updated_at": "2019-06-17T18:28:00.000000+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 separated fields to include instead of the default fields. ?fields[default_properties]=created_at,updated_at,name

Request body

This request accepts the following body:

Name Description
data[attributes][identifier] string
Key that will be used in exports, responses and custom field variables in templates.
data[attributes][name] string
Name of the property (used as label and to compute identifier if left blank).
data[attributes][owner_type] string
The type of resource this default property is intended for and derived properties can be added to.
data[attributes][position] integer
Which position the property has.
data[attributes][property_type] enum
Determines how the data is rendered and the kind of input shown to the user.
One of: address, date_field, email, phone, select, text_area, text_field.
data[attributes][select_options][] array
For type select. The select options as array..
data[attributes][show_on] array[string]
Array of items to show this custom field on. Zero or more from contract, invoice, packing, quote.
data[attributes][validation_required] boolean
Whether this property has to be validated.

Includes

This request does not accept any includes

Update a default property

How to update a default property:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/default_properties/1d9d3f48-7bac-4b62-8f42-8018003cc95b'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "1d9d3f48-7bac-4b62-8f42-8018003cc95b",
           "type": "default_properties",
           "attributes": {
             "property_type": "text_field"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "1d9d3f48-7bac-4b62-8f42-8018003cc95b",
      "type": "default_properties",
      "attributes": {
        "created_at": "2014-07-12T02:01:00.000000+00:00",
        "updated_at": "2014-07-12T02:01:00.000000+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 separated fields to include instead of the default fields. ?fields[default_properties]=created_at,updated_at,name

Request body

This request accepts the following body:

Name Description
data[attributes][identifier] string
Key that will be used in exports, responses and custom field variables in templates.
data[attributes][name] string
Name of the property (used as label and to compute identifier if left blank).
data[attributes][owner_type] string
The type of resource this default property is intended for and derived properties can be added to.
data[attributes][position] integer
Which position the property has.
data[attributes][property_type] enum
Determines how the data is rendered and the kind of input shown to the user.
One of: address, date_field, email, phone, select, text_area, text_field.
data[attributes][select_options][] array
For type select. The select options as array..
data[attributes][show_on] array[string]
Array of items to show this custom field on. Zero or more from contract, invoice, packing, quote.
data[attributes][validation_required] boolean
Whether this property has to be validated.

Includes

This request does not accept any includes

Delete a default property

How to delete a default property:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/default_properties/8d8ff086-4c54-40aa-84dd-28fc56d8b3dd'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "8d8ff086-4c54-40aa-84dd-28fc56d8b3dd",
      "type": "default_properties",
      "attributes": {
        "created_at": "2025-03-13T08:57:00.000000+00:00",
        "updated_at": "2025-03-13T08:57:00.000000+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 separated fields to include instead of the default fields. ?fields[default_properties]=created_at,updated_at,name

Includes

This request does not accept any includes

Delivery distance calculations

It calculates the distance (the route length) between the given locations and the delivery address.

Fields

Name Description
distance float readonly
The distance between the location and the delivery address.
distance_unit enum readonly
The unit of the distance.
One of: metric, imperial.
id uuid readonly
Primary key.
location_id uuid readonly
The location ID.

Calculate delivery distances

How to fetch a list of delivery distance calculations:

  curl --get 'https://example.booqable.com/api/boomerang/delivery_distance_calculations'
       --header 'content-type: application/json'
       --data-urlencode 'filter[delivery_address_property_id]=2e70e73b-04ee-4e00-835e-13ad1d52e6fc'
       --data-urlencode 'filter[location_ids][]=df2395bd-72f3-4078-8c07-4c1f636a1a03'
       --data-urlencode 'filter[location_ids][]=acea1410-5c2a-412d-8910-e48a9224a44d'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "f8d4975d-f633-4703-8e3d-8c7c36951675",
        "type": "delivery_distance_calculations",
        "attributes": {
          "distance": 10.0,
          "distance_unit": "km",
          "location_id": "df2395bd-72f3-4078-8c07-4c1f636a1a03"
        }
      },
      {
        "id": "8dc19268-75fd-4a1c-88e5-4a0bf08fb148",
        "type": "delivery_distance_calculations",
        "attributes": {
          "distance": 20.0,
          "distance_unit": "km",
          "location_id": "acea1410-5c2a-412d-8910-e48a9224a44d"
        }
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/delivery_distance_calculations

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[delivery_distance_calculations]=distance,distance_unit,location_id
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
delivery_address_property_id uuid
eq
location_ids array
eq

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request does not accept any includes

Deposit holds

A deposit hold is the resource responsible for managing the held deposit on an order.

Relationships

Name Description
deposit_line Line required
The Line that was created or updated to hold the deppsit.
order Order required
The order a new deposit needs to be added to.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
amount_in_cents integer writeonly
Amount to hold. If the order already has a hold, the amount will added to the previous one. The hold is clamped to order.deposit_in_cents.
deposit_line_id uuid readonly
The Line that was created or updated to hold the deppsit.
id uuid readonly
Primary key.
order_id uuid
The order a new deposit needs to be added to.
reason string writeonly
Reason for the hold. If the order already has a hold, the reason will overwrite the previous one.

Create

Hold a deposit:

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/deposit_holds'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "deposit_holds",
           "attributes": {
             "order_id": "f20704d5-8868-46c8-8d43-4eb95a96ec2e",
             "amount_in_cents": 5000,
             "reason": "damages"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "d785af99-53ec-4230-819f-c65f4fb7da9d",
      "type": "deposit_holds",
      "attributes": {
        "order_id": "f20704d5-8868-46c8-8d43-4eb95a96ec2e",
        "deposit_line_id": "e98315a1-7fbe-48ac-810a-c0823f8a663a"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/deposit_holds

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[deposit_holds]=order_id,deposit_line_id
include string
List of comma seperated relationships to sideload. ?include=deposit_line,order

Request body

This request accepts the following body:

Name Description
data[attributes][amount_in_cents] integer
Amount to hold. If the order already has a hold, the amount will added to the previous one. The hold is clamped to order.deposit_in_cents.
data[attributes][order_id] uuid
The order a new deposit needs to be added to.
data[attributes][reason] string
Reason for the hold. If the order already has a hold, the reason will overwrite the previous one.

Includes

This request accepts the following includes:

deposit_line => tax_category

tax_values

order => tax_values

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.

Relationships

Name Description
coupon Coupon optional
The associated coupon.
customer Customer optional
The associated customer.
lines Lines hasmany
The lines of this document.
order Order required
The order this document is for.
tax_region Tax region optional
The associated tax region.
tax_values Tax values hasmany
The calculated taxes, one value for each applicable tax rate.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
address string
Customer Address. If left blank, automatically populated with the customer address of the associated order.
archived boolean readonly
Whether document is archived.
archived_at datetime readonly nullable
When the document was archived.
body string
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.
confirmed boolean
Whether document is confirmed, applies to quote and contract.
coupon_discount_in_cents integer readonly
Coupon discount (incl. or excl. taxes based on tax_strategy.
coupon_id uuid nullable
The associated coupon.
created_at datetime readonly
When the resource was created.
customer_id uuid nullable
The associated customer.
date date
Date the document was finalized.
deposit_held_in_cents integer readonly
Amount of deposit held.
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_to_refund_in_cents integer readonly
Amount of deposit (still) to be refunded.
deposit_type enum nullable
Kind of deposit added.
One of: none, percentage_total, percentage, fixed.
deposit_value float
The value to use for deposit_type.
discount_in_cents integer readonly
Discount (incl. or excl. taxes based on tax_strategy.
discount_percentage float
The discount percentage applied to this order.
document_type enum readonly-after-create
Type of document.
One of: invoice, contract, quote.
due_date date
The latest date by which the invoice must be fully paid.
finalized boolean
Whether document is finalized (quote and contract are always finalized).
footer string
The footer of a document. Populated with setting {document_type}.footer, but can also be overridden for a specific document.
grand_total_in_cents integer readonly
Total excl. taxes (excl. deposit).
grand_total_with_tax_in_cents integer readonly
Amount incl. taxes (excl. deposit).
id uuid readonly
Primary key.
name string
Customer name. If left blank, automatically populated with the customer name of the associated order.
number integer
The document number, must be unique per type. Automatically generated if left blank.
order_id uuid readonly-after-create
The order this document is for.
paid_in_cents integer readonly
How much was paid.
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.
price_in_cents integer readonly
Subtotal excl. taxes (excl. deposit).
reference string
A project number or other reference.
revised boolean
Whether document is revised (applies only to invoice).
sent boolean
Whether document is sent (with Booqable).
signature_url string readonly
Url where the signature is stored.
status enum
Status (possible values depend on document type).
One of: confirmed, unconfirmed, revised, partially_paid, payment_due, paid, process_deposit, overpaid.
tag_list array
Case insensitive tag list.
tax_in_cents integer readonly
Total tax.
tax_region_id uuid nullable
The associated tax region.
to_be_paid_in_cents integer readonly
Amount that (still) has to be paid.
total_discount_in_cents integer readonly
Total discount (incl. or excl. taxes based on tax_strategy.
updated_at datetime readonly
When the resource was last updated.

List documents

How to fetch a list of documents:

  curl --get 'https://example.booqable.com/api/boomerang/documents'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "a216b9f8-4f61-4eda-8672-3c6e94c9fbe2",
        "type": "documents",
        "attributes": {
          "created_at": "2027-05-20T13:53:01.000000+00:00",
          "updated_at": "2027-05-20T13:53:01.000000+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,
          "body": null,
          "footer": "",
          "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": "e10da0d6-7881-4991-851f-ef302c712dea",
          "customer_id": "6b39f922-ebba-4e73-841c-563dd37107d7",
          "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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[documents]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=customer,order
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
address string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
conditions hash
eq
confirmed boolean
eq
coupon_discount_in_cents integer
eq, not_eq, gt, gte, lt, lte
coupon_id uuid
eq, not_eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
customer_id uuid
eq, not_eq
date date
eq, not_eq, gt, gte, lt, lte
date_or_created_at datetime
eq, not_eq, gt, gte, lt, lte, between
deposit_held_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_to_refund_in_cents integer
eq, not_eq, gt, gte, lt, lte
deposit_type string_enum
eq
discount_in_cents integer
eq, not_eq, gt, gte, lt, lte
discount_percentage float
eq, not_eq, gt, gte, lt, lte
document_type string_enum
eq, not_eq
due_date date
eq, not_eq, gt, gte, lt, lte
finalized boolean
eq
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
id uuid
eq, not_eq, gt
name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
number integer
eq, not_eq, gt, gte, lt, lte
order_id uuid
eq, not_eq
paid_in_cents 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
price_in_cents integer
eq, not_eq, gt, gte, lt, lte
q string
eq
revised boolean
eq
sent boolean
eq
status string_enum
eq
tag_list string
eq
tax_in_cents integer
eq, not_eq, gt, gte, lt, lte
tax_region_id uuid
eq, not_eq
to_be_paid_in_cents integer
eq, not_eq, gt, gte, lt, lte
total_discount_in_cents integer
eq, not_eq, gt, gte, lt, lte
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
coupon_discount_in_cents array
sum, maximum, minimum, average
currency array
count
deposit_held_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_to_refund_in_cents array
sum, maximum, minimum, average
deposit_type array
count
discount_in_cents array
sum, maximum, minimum, average
discount_percentage array
maximum, minimum, average
grand_total_in_cents array
sum, maximum, minimum, average
grand_total_with_tax_in_cents array
sum, maximum, minimum, average
paid_in_cents array
sum, maximum, minimum, average
price_in_cents array
sum, maximum, minimum, average
status array
count
tag_list array
count
tax_in_cents array
sum, maximum, minimum, average
tax_strategy array
count
to_be_paid_in_cents array
sum, maximum, minimum, average
total array
count
total_discount_in_cents array
sum, maximum, minimum, average

Includes

This request accepts the following includes:

customer

order

Search 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": "2028-11-16T15:29:00.000000+00:00"
                     }
                   },
                   {
                     "date": {
                       "lte": "2028-11-22T15:29:00.000000+00:00"
                     }
                   }
                 ]
               }
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "c9fa6121-84c0-4a28-893a-cceb9d2be169"
      },
      {
        "id": "3608f8e0-6ba6-4d67-81e0-800ee85ea024"
      }
    ]
  }

HTTP Request

POST api/boomerang/documents/search

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[documents]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=customer,order
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
address string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
conditions hash
eq
confirmed boolean
eq
coupon_discount_in_cents integer
eq, not_eq, gt, gte, lt, lte
coupon_id uuid
eq, not_eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
customer_id uuid
eq, not_eq
date date
eq, not_eq, gt, gte, lt, lte
date_or_created_at datetime
eq, not_eq, gt, gte, lt, lte, between
deposit_held_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_to_refund_in_cents integer
eq, not_eq, gt, gte, lt, lte
deposit_type string_enum
eq
discount_in_cents integer
eq, not_eq, gt, gte, lt, lte
discount_percentage float
eq, not_eq, gt, gte, lt, lte
document_type string_enum
eq, not_eq
due_date date
eq, not_eq, gt, gte, lt, lte
finalized boolean
eq
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
id uuid
eq, not_eq, gt
name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
number integer
eq, not_eq, gt, gte, lt, lte
order_id uuid
eq, not_eq
paid_in_cents 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
price_in_cents integer
eq, not_eq, gt, gte, lt, lte
q string
eq
revised boolean
eq
sent boolean
eq
status string_enum
eq
tag_list string
eq
tax_in_cents integer
eq, not_eq, gt, gte, lt, lte
tax_region_id uuid
eq, not_eq
to_be_paid_in_cents integer
eq, not_eq, gt, gte, lt, lte
total_discount_in_cents integer
eq, not_eq, gt, gte, lt, lte
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
coupon_discount_in_cents array
sum, maximum, minimum, average
currency array
count
deposit_held_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_to_refund_in_cents array
sum, maximum, minimum, average
deposit_type array
count
discount_in_cents array
sum, maximum, minimum, average
discount_percentage array
maximum, minimum, average
grand_total_in_cents array
sum, maximum, minimum, average
grand_total_with_tax_in_cents array
sum, maximum, minimum, average
paid_in_cents array
sum, maximum, minimum, average
price_in_cents array
sum, maximum, minimum, average
status array
count
tag_list array
count
tax_in_cents array
sum, maximum, minimum, average
tax_strategy array
count
to_be_paid_in_cents array
sum, maximum, minimum, average
total array
count
total_discount_in_cents array
sum, maximum, minimum, average

Includes

This request accepts the following includes:

customer

order

Fetch a document

How to fetch a documents:

  curl --get 'https://example.booqable.com/api/boomerang/documents/9c32036d-e60c-47b1-8ff2-7e28343dac1b'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "9c32036d-e60c-47b1-8ff2-7e28343dac1b",
      "type": "documents",
      "attributes": {
        "created_at": "2021-05-18T10:30:00.000000+00:00",
        "updated_at": "2021-05-18T10:30:00.000000+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,
        "body": null,
        "footer": "",
        "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": "9c1a27c9-93ab-45fc-810c-ad69b9ab9617",
        "customer_id": "35578b5e-ed35-40b4-8e46-6d218d036c42",
        "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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[documents]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=customer,order,tax_region

Includes

This request accepts the following includes:

customer

order

tax_region

lines => item => photo

tax_values

coupon

Create 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": "c7d596a9-f29d-4dd8-8f81-dac3bef16c03"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "33d005c3-65d8-4a49-80fa-5bc116112f39",
      "type": "documents",
      "attributes": {
        "created_at": "2022-10-18T11:28:01.000000+00:00",
        "updated_at": "2022-10-18T11:28:01.000000+00:00",
        "archived": false,
        "archived_at": null,
        "document_type": "contract",
        "number": 1,
        "prefix": null,
        "prefix_with_number": "1",
        "date": "2025-01-13",
        "due_date": null,
        "name": "John Doe",
        "address": "",
        "body": "",
        "footer": "",
        "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": "c7d596a9-f29d-4dd8-8f81-dac3bef16c03",
        "customer_id": "2f4f9473-239b-4b05-8bb3-e9f933d42d64",
        "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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[documents]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=customer,order,tax_region

Request body

This request accepts the following body:

Name Description
data[attributes][address] string
Customer Address. If left blank, automatically populated with the customer address of the associated order.
data[attributes][body] string
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.
data[attributes][confirmed] boolean
Whether document is confirmed, applies to quote and contract.
data[attributes][coupon_id] uuid
The associated coupon.
data[attributes][customer_id] uuid
The associated customer.
data[attributes][date] date
Date the document was finalized.
data[attributes][deposit_type] enum
Kind of deposit added.
One of: none, percentage_total, percentage, fixed.
data[attributes][deposit_value] float
The value to use for deposit_type.
data[attributes][discount_percentage] float
The discount percentage applied to this order.
data[attributes][document_type] enum
Type of document.
One of: invoice, contract, quote.
data[attributes][due_date] date
The latest date by which the invoice must be fully paid.
data[attributes][finalized] boolean
Whether document is finalized (quote and contract are always finalized).
data[attributes][footer] string
The footer of a document. Populated with setting {document_type}.footer, but can also be overridden for a specific document.
data[attributes][name] string
Customer name. If left blank, automatically populated with the customer name of the associated order.
data[attributes][number] integer
The document number, must be unique per type. Automatically generated if left blank.
data[attributes][order_id] uuid
The order this document is for.
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][reference] string
A project number or other reference.
data[attributes][revised] boolean
Whether document is revised (applies only to invoice).
data[attributes][sent] boolean
Whether document is sent (with Booqable).
data[attributes][status] enum
Status (possible values depend on document type).
One of: confirmed, unconfirmed, revised, partially_paid, payment_due, paid, process_deposit, overpaid.
data[attributes][tag_list][] array
Case insensitive tag list.
data[attributes][tax_region_id] uuid
The associated tax region.

Includes

This request accepts the following includes:

customer

order

tax_region

lines => item => photo

tax_values

coupon

Update a document

How to update a document:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/documents/6b8e0c59-4b01-42e6-8477-bbfa4cea11f3'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "6b8e0c59-4b01-42e6-8477-bbfa4cea11f3",
           "type": "documents",
           "attributes": {
             "name": "Jane Doe"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "6b8e0c59-4b01-42e6-8477-bbfa4cea11f3",
      "type": "documents",
      "attributes": {
        "created_at": "2016-09-18T03:33:01.000000+00:00",
        "updated_at": "2016-09-18T03:33:01.000000+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,
        "body": null,
        "footer": "",
        "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": "6952ae61-0c41-4a20-8379-52f56e41884c",
        "customer_id": "da876af0-82ef-4a18-8e51-86680fba81bc",
        "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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[documents]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=customer,order,tax_region

Request body

This request accepts the following body:

Name Description
data[attributes][address] string
Customer Address. If left blank, automatically populated with the customer address of the associated order.
data[attributes][body] string
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.
data[attributes][confirmed] boolean
Whether document is confirmed, applies to quote and contract.
data[attributes][coupon_id] uuid
The associated coupon.
data[attributes][customer_id] uuid
The associated customer.
data[attributes][date] date
Date the document was finalized.
data[attributes][deposit_type] enum
Kind of deposit added.
One of: none, percentage_total, percentage, fixed.
data[attributes][deposit_value] float
The value to use for deposit_type.
data[attributes][discount_percentage] float
The discount percentage applied to this order.
data[attributes][document_type] enum
Type of document.
One of: invoice, contract, quote.
data[attributes][due_date] date
The latest date by which the invoice must be fully paid.
data[attributes][finalized] boolean
Whether document is finalized (quote and contract are always finalized).
data[attributes][footer] string
The footer of a document. Populated with setting {document_type}.footer, but can also be overridden for a specific document.
data[attributes][name] string
Customer name. If left blank, automatically populated with the customer name of the associated order.
data[attributes][number] integer
The document number, must be unique per type. Automatically generated if left blank.
data[attributes][order_id] uuid
The order this document is for.
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][reference] string
A project number or other reference.
data[attributes][revised] boolean
Whether document is revised (applies only to invoice).
data[attributes][sent] boolean
Whether document is sent (with Booqable).
data[attributes][status] enum
Status (possible values depend on document type).
One of: confirmed, unconfirmed, revised, partially_paid, payment_due, paid, process_deposit, overpaid.
data[attributes][tag_list][] array
Case insensitive tag list.
data[attributes][tax_region_id] uuid
The associated tax region.

Includes

This request accepts the following includes:

customer

order

tax_region

lines => item => photo

tax_values

coupon

Archive 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/e00df330-8241-466f-8706-d2db3d03494d'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "e00df330-8241-466f-8706-d2db3d03494d",
      "type": "documents",
      "attributes": {
        "created_at": "2018-05-06T00:22:02.000000+00:00",
        "updated_at": "2018-05-06T00:22:02.000000+00:00",
        "archived": true,
        "archived_at": "2018-05-06T00:22:02.000000+00:00",
        "document_type": "invoice",
        "number": null,
        "prefix": null,
        "prefix_with_number": null,
        "date": null,
        "due_date": null,
        "name": "John Doe",
        "address": null,
        "body": null,
        "footer": "",
        "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": "9253db70-5ed8-44a6-8d0b-f1af78e021fe",
        "customer_id": "3af62bd7-4635-4714-8680-79d8e23ec549",
        "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 separated fields to include instead of the default fields. ?fields[documents]=created_at,updated_at,archived

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.

Relationships

Name Description
customer Customer required
Customer this email is associated with. Attributes from this order are available when rendering the template.
email_template Email template required
The template used to generate this email.
employee Employee required
Employee who sent the email.
order Order required
The order this email is associated with. Attributes from this order are available when rendering the template.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
body string
Email body.
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.
customer_id uuid readonly-after-create
Customer this email is associated with. Attributes from this order are available when rendering the template.
document_ids array
Documents to send as attachments to the email.
email_template_id uuid readonly-after-create
The template used to generate this email.
employee_id uuid readonly
Employee who sent the email.
has_error boolean readonly
Whether any errors occur when sending this email.
id uuid readonly
Primary key.
order_id uuid readonly-after-create
The order this email is associated with. Attributes from this order are available when rendering the template.
recipients string
Comma seperated list of recipient email addresses, all addresses must be valid for the email to send.
sent boolean readonly
Whether the email was sent successfully.
subject string
Email subject.
updated_at datetime readonly
The last time the email was updated. Typically this is updated after a delivery attempt has failed.

List emails

How to fetch a list of emails:

  curl --get 'https://example.booqable.com/api/boomerang/emails'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "b882543c-57cc-4fcf-8a1e-dc471e664ac4",
        "type": "emails",
        "attributes": {
          "created_at": "2016-11-24T02:24:00.000000+00:00",
          "updated_at": "2016-11-24T02:24:00.000000+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": "878c23b8-3fa0-44b1-856f-7fd95560fabc",
          "email_template_id": null,
          "employee_id": null
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

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

  curl --get 'https://example.booqable.com/api/boomerang/emails'
       --header 'content-type: application/json'
       --data-urlencode 'filter[order_id]=f97ca4a9-7d59-46d9-8df1-6cc7dae11393'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "a1b5a25c-bd16-4249-8052-72ebda9c133d",
        "type": "emails",
        "attributes": {
          "created_at": "2024-08-21T09:09:01.000000+00:00",
          "updated_at": "2024-08-21T09:09:01.000000+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": "f97ca4a9-7d59-46d9-8df1-6cc7dae11393",
          "customer_id": "659dbd01-2c4c-42b8-890e-afe1f60d29ec",
          "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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[emails]=created_at,updated_at,subject
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=customer,order
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
created_at datetime
eq, not_eq, gt, gte, lt, lte
customer_id uuid
eq, not_eq
email_template_id uuid
eq, not_eq
employee_id uuid
eq, not_eq
has_error boolean
eq
id uuid
eq, not_eq
order_id uuid
eq, not_eq
sent boolean
eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
has_error array
count
total array
count

Includes

This request accepts the following includes:

customer

order

Create 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": "4b2e6043-c307-4b1c-8f2d-872b85d20fc4",
             "order_id": "c504d320-966c-4b0d-88fb-9490bc6483e5",
             "customer_id": "c353e670-ad55-43ad-803b-3e12456726de",
             "document_ids": [
               "b308505b-b1cb-485c-8d0e-7d937d2f38a5"
             ]
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "b0779013-b390-48c6-8286-123716b0a3e1",
      "type": "emails",
      "attributes": {
        "created_at": "2025-09-16T16:16:01.000000+00:00",
        "updated_at": "2025-09-16T16:16:01.000000+00:00",
        "subject": "Order confirmation",
        "body": "Hi {{customer.name}}",
        "recipients": "[email protected],[email protected]",
        "has_error": false,
        "sent": false,
        "document_ids": [
          "b308505b-b1cb-485c-8d0e-7d937d2f38a5"
        ],
        "order_id": "c504d320-966c-4b0d-88fb-9490bc6483e5",
        "customer_id": "c353e670-ad55-43ad-803b-3e12456726de",
        "email_template_id": "4b2e6043-c307-4b1c-8f2d-872b85d20fc4",
        "employee_id": "1a34d41c-d99a-49de-8090-cb632e9ef172"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/emails

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[emails]=created_at,updated_at,subject
include string
List of comma seperated relationships to sideload. ?include=customer,order,email_template

Request body

This request accepts the following body:

Name Description
data[attributes][body] string
Email body.
data[attributes][customer_id] uuid
Customer this email is associated with. Attributes from this order are available when rendering the template.
data[attributes][document_ids][] array
Documents to send as attachments to the email.
data[attributes][email_template_id] uuid
The template used to generate this email.
data[attributes][order_id] uuid
The order this email is associated with. Attributes from this order are available when rendering the template.
data[attributes][recipients] string
Comma seperated list of recipient email addresses, all addresses must be valid for the email to send.
data[attributes][subject] string
Email subject.

Includes

This request accepts the following includes:

customer

order

email_template

Email templates

Email templates allow for creating pre-filled emails with dynamic data. Booqable comes with a couple of default 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

Fields

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

List email templates

How to fetch a list of email templates:

  curl --get 'https://example.booqable.com/api/boomerang/email_templates'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "e0a7c360-45c6-4a04-81c5-8886d3aeb275",
        "type": "email_templates",
        "attributes": {
          "created_at": "2018-07-14T00:07:00.000000+00:00",
          "updated_at": "2018-07-14T00:07:00.000000+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 separated fields to include instead of the default fields. ?fields[email_templates]=created_at,updated_at,name
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
automated boolean
eq
context string_enum
eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
default boolean
eq
id uuid
eq, not_eq
identifier 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
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request does not accept any includes

Fetch an email template

How to fetch an email template:

  curl --get 'https://example.booqable.com/api/boomerang/email_templates/95b3a72d-9c05-4c26-8679-d2ecd5ff2739'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "95b3a72d-9c05-4c26-8679-d2ecd5ff2739",
      "type": "email_templates",
      "attributes": {
        "created_at": "2023-09-05T22:46:01.000000+00:00",
        "updated_at": "2023-09-05T22:46:01.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[email_templates]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=emails

Includes

This request accepts the following includes:

emails

Create 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": "fdb97b9d-4542-44dc-856e-510228b6d83a",
      "type": "email_templates",
      "attributes": {
        "created_at": "2019-09-07T19:36:01.000000+00:00",
        "updated_at": "2019-09-07T19:36:01.000000+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 separated fields to include instead of the default fields. ?fields[email_templates]=created_at,updated_at,name

Request body

This request accepts the following body:

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

Includes

This request does not accept any includes

Update an email template

How to update an email template:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/email_templates/8cc919ef-bada-48fa-8d22-1ee523f0e88f'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "8cc919ef-bada-48fa-8d22-1ee523f0e88f",
           "type": "email_templates",
           "attributes": {
             "name": "Order confirmation"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "8cc919ef-bada-48fa-8d22-1ee523f0e88f",
      "type": "email_templates",
      "attributes": {
        "created_at": "2027-11-19T06:26:00.000000+00:00",
        "updated_at": "2027-11-19T06:26:00.000000+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/f4304c84-6349-470c-875b-7bc8ac0dd626'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "f4304c84-6349-470c-875b-7bc8ac0dd626",
           "type": "email_templates",
           "attributes": {
             "name": "Order confirmation"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "f4304c84-6349-470c-875b-7bc8ac0dd626",
      "type": "email_templates",
      "attributes": {
        "created_at": "2017-06-27T23:42:00.000000+00:00",
        "updated_at": "2017-06-27T23:42:00.000000+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 separated fields to include instead of the default fields. ?fields[email_templates]=created_at,updated_at,name

Request body

This request accepts the following body:

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

Includes

This request does not accept any includes

Delete an email template

How to delete a email template:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/email_templates/1353d9c3-b214-4b45-8153-505e3ab4d573'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "1353d9c3-b214-4b45-8153-505e3ab4d573",
      "type": "email_templates",
      "attributes": {
        "created_at": "2019-10-07T17:21:00.000000+00:00",
        "updated_at": "2019-10-07T17:21:00.000000+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 separated fields to include instead of the default fields. ?fields[email_templates]=created_at,updated_at,name

Includes

This request does not accept any includes

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.

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.

Fields

Name Description
active boolean
Whether this employee is active (counts towards billing).
allowed_session_id string
Allowed session id.
avatar_base64 string writeonly
Base64 encoded avatar.
avatar_url string readonly
Url to avatar.
confirmed boolean readonly
Whether this employee confirmed it's email address.
created_at datetime readonly
When the resource was created.
current_password string writeonly
Current password, needed to update password or email address.
deactivated_at datetime writeonly
Employee deactivation date.
email string
Employee's e-mail address.
firstname string
First name of the employee.
has_two_factor_autentication boolean readonly
Whether two factor authentication is enabled.
id uuid readonly
Primary key.
large_avatar_url string readonly
Url to avatar (Large).
lastname string
Last name of the employee.
locale string
Locale of the employee, used as application locale.
name string readonly
Full name of the employee.
owner boolean readonly
Whether this employee is the account owner.
password string writeonly
Set a new password.
password_confirmation string writeonly
Confirm new password.
permissions array
Zero or more from: 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 the roles & permissions feature is not included in the current pricing plan or if the employee is the account owner.
remove_avatar boolean writeonly
Remove current avatar.
third_party_id string
ID used for third party tools.
time_to_confirm integer readonly
Time in days left to confirm.
unconfirmed_email string readonly
Unconfirmed e-mail address if present.
updated_at datetime readonly
When the resource was last updated.
viewed_whats_new_at datetime
Date when this employee viewed product updates for the last time.

List employees

How to fetch a list of employees:

  curl --get 'https://example.booqable.com/api/boomerang/employees'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "9e27ff9f-0909-42c7-81b2-3bb9f34ad507",
        "type": "employees",
        "attributes": {
          "created_at": "2021-09-07T07:00:00.000000+00:00",
          "updated_at": "2023-07-01T03:50:00.000000+00:00",
          "name": "John Doe",
          "firstname": "John",
          "lastname": "Doe",
          "locale": null,
          "email": "[email protected]",
          "unconfirmed_email": null,
          "viewed_whats_new_at": "2023-06-07T12:19:00.000000+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,
          "allowed_session_id": null,
          "avatar_url": "https://gravatar.com/avatar/f3eb64211cf620aa291957f1f66d5f39.png?d=404",
          "large_avatar_url": "https://gravatar.com/avatar/f3eb64211cf620aa291957f1f66d5f39.png?d=mm&size=200",
          "third_party_id": "9e27ff9f-0909-42c7-81b2-3bb9f34ad507-1679574840"
        }
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/employees

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[employees]=created_at,updated_at,name
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
active boolean
eq
confirmed boolean
eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
deactivated_at datetime
eq, not_eq, gt, gte, lt, lte
email string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
id uuid
eq, not_eq
locale string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
owner boolean
eq
third_party_id string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request does not accept any includes

Fetch an employee

How to fetch a employee:

  curl --get 'https://example.booqable.com/api/boomerang/employees/4c367dac-4839-49f3-89e4-ff584a1f30e0'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "4c367dac-4839-49f3-89e4-ff584a1f30e0",
      "type": "employees",
      "attributes": {
        "created_at": "2015-05-14T01:40:00.000000+00:00",
        "updated_at": "2017-01-20T23:07:00.000000+00:00",
        "name": "John Doe",
        "firstname": "John",
        "lastname": "Doe",
        "locale": null,
        "email": "[email protected]",
        "unconfirmed_email": null,
        "viewed_whats_new_at": "2017-02-10T06:59:00.000000+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,
        "allowed_session_id": null,
        "avatar_url": "https://gravatar.com/avatar/b9e4d02e55a6d091223dfb568620be4b.png?d=404",
        "large_avatar_url": "https://gravatar.com/avatar/b9e4d02e55a6d091223dfb568620be4b.png?d=mm&size=200",
        "third_party_id": "4c367dac-4839-49f3-89e4-ff584a1f30e0-1679574840"
      }
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/employees/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[employees]=created_at,updated_at,name

Includes

This request does not accept any includes

Update an employee

How to update an employee:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/employees/cebcf411-1b2a-402f-8d77-43c67daf282f'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "cebcf411-1b2a-402f-8d77-43c67daf282f",
           "type": "employees",
           "attributes": {
             "firstname": "Jane"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "cebcf411-1b2a-402f-8d77-43c67daf282f",
      "type": "employees",
      "attributes": {
        "created_at": "2016-10-03T04:30:00.000000+00:00",
        "updated_at": "2021-09-25T16:20:00.000000+00:00",
        "name": "Jane Doe",
        "firstname": "Jane",
        "lastname": "Doe",
        "locale": null,
        "email": "[email protected]",
        "unconfirmed_email": null,
        "viewed_whats_new_at": "2021-07-24T23:16:00.000000+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,
        "allowed_session_id": null,
        "avatar_url": "https://gravatar.com/avatar/716558eb15f1e4801c770410e3eed8fe.png?d=404",
        "large_avatar_url": "https://gravatar.com/avatar/716558eb15f1e4801c770410e3eed8fe.png?d=mm&size=200",
        "third_party_id": "cebcf411-1b2a-402f-8d77-43c67daf282f-1579642440"
      }
    },
    "meta": {}
  }

How to de-activate an employee:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/employees/b40a7c1c-5190-4d54-8cea-405d36944a87'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "b40a7c1c-5190-4d54-8cea-405d36944a87",
           "type": "employees",
           "attributes": {
             "active": false
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "b40a7c1c-5190-4d54-8cea-405d36944a87",
      "type": "employees",
      "attributes": {
        "created_at": "2014-10-16T17:49:01.000000+00:00",
        "updated_at": "2019-10-09T05:39:01.000000+00:00",
        "name": "John Doe",
        "firstname": "John",
        "lastname": "Doe",
        "locale": null,
        "email": "[email protected]",
        "unconfirmed_email": null,
        "viewed_whats_new_at": "2019-08-07T12:35:01.000000+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,
        "allowed_session_id": null,
        "avatar_url": "https://gravatar.com/avatar/8a0e879db54c50c14de0c4203a4e7a93.png?d=404",
        "large_avatar_url": "https://gravatar.com/avatar/8a0e879db54c50c14de0c4203a4e7a93.png?d=mm&size=200",
        "third_party_id": "b40a7c1c-5190-4d54-8cea-405d36944a87-1579642440"
      }
    },
    "meta": {}
  }

How to set permissions:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/employees/94b3f0ff-ef32-49be-8f5f-7aa6916cc901'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "94b3f0ff-ef32-49be-8f5f-7aa6916cc901",
           "type": "employees",
           "attributes": {
             "permissions": [
               "reports",
               "settings"
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "94b3f0ff-ef32-49be-8f5f-7aa6916cc901",
      "type": "employees",
      "attributes": {
        "created_at": "2027-04-16T02:37:01.000000+00:00",
        "updated_at": "2032-04-07T14:27:01.000000+00:00",
        "name": "John Doe",
        "firstname": "John",
        "lastname": "Doe",
        "locale": null,
        "email": "[email protected]",
        "unconfirmed_email": null,
        "viewed_whats_new_at": "2032-02-04T21:23:01.000000+00:00",
        "active": true,
        "owner": false,
        "confirmed": true,
        "time_to_confirm": 0,
        "permissions": [
          "reports",
          "settings"
        ],
        "has_two_factor_autentication": false,
        "allowed_session_id": null,
        "avatar_url": "https://gravatar.com/avatar/ae75ea2be6c7d7aa987d98145aa7618c.png?d=404",
        "large_avatar_url": "https://gravatar.com/avatar/ae75ea2be6c7d7aa987d98145aa7618c.png?d=mm&size=200",
        "third_party_id": "94b3f0ff-ef32-49be-8f5f-7aa6916cc901-1579642440"
      }
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/employees/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[employees]=created_at,updated_at,name

Request body

This request accepts the following body:

Name Description
data[attributes][active] boolean
Whether this employee is active (counts towards billing).
data[attributes][allowed_session_id] string
Allowed session id.
data[attributes][avatar_base64] string
Base64 encoded avatar.
data[attributes][current_password] string
Current password, needed to update password or email address.
data[attributes][deactivated_at] datetime
Employee deactivation date.
data[attributes][email] string
Employee's e-mail address.
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][password] string
Set a new password.
data[attributes][password_confirmation] string
Confirm new password.
data[attributes][permissions][] array
Zero or more from: 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 the roles & permissions feature is not included in the current pricing plan or if the employee is the account owner.
data[attributes][remove_avatar] boolean
Remove current avatar.
data[attributes][third_party_id] string
ID used for third party tools.
data[attributes][viewed_whats_new_at] datetime
Date when this employee viewed product updates for the last time.

Includes

This request does not accept any includes

Employee invitations

Employees give access to a Booqable account. You can invite employees by sending an invitation. For more info about employees see Employees.

Relationships

Name Description
employee Employee optional
The employee that is invited.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
email string writeonly
Employee's e-mail address.
employee_id uuid nullable
The employee that is invited.
firstname string writeonly
First name of the employee.
id uuid
Specify employee ID to re-send invitation.
lastname string writeonly
Last name of the employee.
permissions array[string] writeonly
Zero or more from: reports, products, settings, security_settings, account, exports, cancel_orders, revert_orders, delete_invoices, make_invoice_revisions, override_rental_period.

Send invitations

How to create an invitation:

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

A 201 status response looks like this:

  {
    "data": {
      "id": "bb80bf32-f049-4ea9-8090-006821195ab4",
      "type": "employee_invitations",
      "attributes": {
        "employee_id": "1ccdaa36-f317-4feb-8a06-003668fc0c59"
      },
      "relationships": {
        "employee": {
          "data": {
            "type": "employees",
            "id": "1ccdaa36-f317-4feb-8a06-003668fc0c59"
          }
        }
      }
    },
    "included": [
      {
        "id": "1ccdaa36-f317-4feb-8a06-003668fc0c59",
        "type": "employees",
        "attributes": {
          "created_at": "2020-01-26T19:11:05.000000+00:00",
          "updated_at": "2020-01-26T19:11:05.000000+00:00",
          "name": "John Doe",
          "firstname": "John",
          "lastname": "Doe",
          "locale": null,
          "email": "[email protected]",
          "unconfirmed_email": null,
          "viewed_whats_new_at": "2020-01-26T19:11:05.000000+00:00",
          "active": true,
          "owner": false,
          "confirmed": false,
          "time_to_confirm": 0,
          "permissions": [],
          "has_two_factor_autentication": false,
          "allowed_session_id": null,
          "avatar_url": "https://gravatar.com/avatar/31ff5e6c9b0f2e3b5d27340dd84e003a.png?d=404",
          "large_avatar_url": "https://gravatar.com/avatar/31ff5e6c9b0f2e3b5d27340dd84e003a.png?d=mm&size=200",
          "third_party_id": "1ccdaa36-f317-4feb-8a06-003668fc0c59-1736760248"
        }
      }
    ],
    "meta": {}
  }

To re-send an invitation we supply the ID the employee for which the invitation was sent. Note that you can also update other fields.:

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/employee_invitations'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "employee_invitations",
           "attributes": {
             "id": "a5f55cdd-7e5a-46ea-84db-1c8352c8fa06",
             "email": "[email protected]"
           }
         },
         "include": "employee"
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "a5f55cdd-7e5a-46ea-84db-1c8352c8fa06",
      "type": "employee_invitations",
      "attributes": {
        "employee_id": "a5f55cdd-7e5a-46ea-84db-1c8352c8fa06"
      },
      "relationships": {
        "employee": {
          "data": {
            "type": "employees",
            "id": "a5f55cdd-7e5a-46ea-84db-1c8352c8fa06"
          }
        }
      }
    },
    "included": [
      {
        "id": "a5f55cdd-7e5a-46ea-84db-1c8352c8fa06",
        "type": "employees",
        "attributes": {
          "created_at": "2020-05-11T21:58:00.000000+00:00",
          "updated_at": "2020-05-11T21:58:00.000000+00:00",
          "name": "John Doe",
          "firstname": "John",
          "lastname": "Doe",
          "locale": null,
          "email": "[email protected]",
          "unconfirmed_email": null,
          "viewed_whats_new_at": "2020-05-11T21:58:00.000000+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,
          "allowed_session_id": null,
          "avatar_url": "https://gravatar.com/avatar/98d4e49bbf9d94d0b9c6155e3e6ad46c.png?d=404",
          "large_avatar_url": "https://gravatar.com/avatar/98d4e49bbf9d94d0b9c6155e3e6ad46c.png?d=mm&size=200",
          "third_party_id": "a5f55cdd-7e5a-46ea-84db-1c8352c8fa06-1736760249"
        }
      }
    ],
    "meta": {}
  }

HTTP Request

POST /api/boomerang/employee_invitations

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[employee_invitations]=employee_id
include string
List of comma seperated relationships to sideload. ?include=employee

Request body

This request accepts the following body:

Name Description
data[attributes][email] string
Employee's e-mail address.
data[attributes][employee_id] uuid
The employee that is invited.
data[attributes][firstname] string
First name of the employee.
data[attributes][id] uuid
Specify employee ID to re-send invitation.
data[attributes][lastname] string
Last name of the employee.
data[attributes][permissions] array[string]
Zero or more from: reports, products, settings, security_settings, account, exports, cancel_orders, revert_orders, delete_invoices, make_invoice_revisions, override_rental_period.

Includes

This request accepts the following includes:

employee

Inventory breakdowns

Fetch quantitive information about product inventory compared to the current time, broken down by:

Useful for

Relationships

Name Description
location Location required
The location to which this breakdown record applies.
product Product required
The product whose availability this breakdown record describes.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
from datetime
When the amount of items will be available (only for status expected).
id uuid readonly
Primary key.
inventory_breakdown_type string
One of regular, temporary.
location_id uuid readonly
The location to which this breakdown record applies.
product_id uuid readonly
The product whose availability this breakdown record describes.
started integer
The amount if items that are started for product and location. Only rendered when applicable.
status string
One of expected, in_stock, expired.
stock_count integer
The total amount of stock for product and location.
till datetime
When the amount of items will become unavailable (only for type temporary and/or status expired).

List inventory breakdowns

How to fetch a breakdown of all items in stock:

  curl --get 'https://example.booqable.com/api/boomerang/inventory_breakdowns'
       --header 'content-type: application/json'
       --data-urlencode 'filter[product_group_id]=fc4bfed6-545d-4ffe-8b66-81e8dbde9d4e'
       --data-urlencode 'filter[status]=in_stock'
       --data-urlencode 'stats[inventory_breakdown_type][]=sum'
       --data-urlencode 'stats[started][]=sum'
       --data-urlencode 'stats[status][]=sum'
       --data-urlencode 'stats[stock_count][]=sum'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "4d112455-70ef-47ab-8e13-317982d7a785",
        "type": "inventory_breakdowns",
        "attributes": {
          "stock_count": 100,
          "started": 50,
          "status": "in_stock",
          "inventory_breakdown_type": "regular",
          "location_id": "93539676-0eec-4298-8221-d37c766028c4",
          "product_id": "856d3a4c-8f1c-4392-8837-b1033d097162"
        },
        "relationships": {}
      },
      {
        "id": "cfc74ef9-ca0f-4337-8020-dc4ecddbde48",
        "type": "inventory_breakdowns",
        "attributes": {
          "till": "2020-08-15T02:26:01.000000+00:00",
          "stock_count": 5,
          "started": 0,
          "status": "in_stock",
          "inventory_breakdown_type": "temporary",
          "location_id": "93539676-0eec-4298-8221-d37c766028c4",
          "product_id": "856d3a4c-8f1c-4392-8837-b1033d097162"
        },
        "relationships": {}
      }
    ],
    "meta": {
      "stats": {
        "inventory_breakdown_type": {
          "sum": {
            "regular": 100,
            "temporary": 5
          }
        },
        "started": {
          "sum": 50
        },
        "status": {
          "sum": {
            "in_stock": 105,
            "expected": 17,
            "expired": 22
          }
        },
        "stock_count": {
          "sum": 105
        }
      }
    }
  }

How to fetch a breakdown of all expected items:

  curl --get 'https://example.booqable.com/api/boomerang/inventory_breakdowns'
       --header 'content-type: application/json'
       --data-urlencode 'filter[product_group_id]=3142a9c7-40c2-4dff-8a3d-61aef93400cf'
       --data-urlencode 'filter[status]=expected'
       --data-urlencode 'stats[inventory_breakdown_type][]=sum'
       --data-urlencode 'stats[started][]=sum'
       --data-urlencode 'stats[status][]=sum'
       --data-urlencode 'stats[stock_count][]=sum'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "d6f88a18-89e5-409d-84ae-8e3e2af10659",
        "type": "inventory_breakdowns",
        "attributes": {
          "from": "2017-11-18T03:35:00.000000+00:00",
          "stock_count": 12,
          "status": "expected",
          "inventory_breakdown_type": "regular",
          "location_id": "53f12674-6a2f-4878-804c-eb4dd3aa204f",
          "product_id": "11b3f75f-518c-4e76-8979-2efbc4019818"
        },
        "relationships": {}
      },
      {
        "id": "7f3caf33-119d-43b7-8bd5-8c7bd5de639a",
        "type": "inventory_breakdowns",
        "attributes": {
          "from": "2017-11-18T03:35:00.000000+00:00",
          "till": "2017-12-19T03:35:00.000000+00:00",
          "stock_count": 5,
          "status": "expected",
          "inventory_breakdown_type": "temporary",
          "location_id": "53f12674-6a2f-4878-804c-eb4dd3aa204f",
          "product_id": "11b3f75f-518c-4e76-8979-2efbc4019818"
        },
        "relationships": {}
      }
    ],
    "meta": {
      "stats": {
        "inventory_breakdown_type": {
          "sum": {
            "regular": 12,
            "temporary": 5
          }
        },
        "started": {
          "sum": 0
        },
        "status": {
          "sum": {
            "in_stock": 105,
            "expected": 17,
            "expired": 22
          }
        },
        "stock_count": {
          "sum": 17
        }
      }
    }
  }

How to fetch a breakdown of all expired items:

  curl --get 'https://example.booqable.com/api/boomerang/inventory_breakdowns'
       --header 'content-type: application/json'
       --data-urlencode 'filter[product_group_id]=8d1d8d66-b01e-4300-83da-7418f5acaaea'
       --data-urlencode 'filter[status]=expired'
       --data-urlencode 'stats[inventory_breakdown_type][]=sum'
       --data-urlencode 'stats[started][]=sum'
       --data-urlencode 'stats[status][]=sum'
       --data-urlencode 'stats[stock_count][]=sum'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "b5e5064e-831e-4883-8a71-2e612ddbb495",
        "type": "inventory_breakdowns",
        "attributes": {
          "till": "2022-08-20T18:59:00.000000+00:00",
          "stock_count": 22,
          "status": "expired",
          "inventory_breakdown_type": "temporary",
          "location_id": "8a5cbdf6-c713-419f-868e-14208fd6df91",
          "product_id": "243a8fd8-a17c-4b5e-878c-3e0646778c26"
        },
        "relationships": {}
      }
    ],
    "meta": {
      "stats": {
        "inventory_breakdown_type": {
          "sum": {
            "regular": 0,
            "temporary": 22
          }
        },
        "started": {
          "sum": 0
        },
        "status": {
          "sum": {
            "in_stock": 105,
            "expected": 17,
            "expired": 22
          }
        },
        "stock_count": {
          "sum": 22
        }
      }
    }
  }

HTTP Request

GET /api/boomerang/inventory_breakdowns

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[inventory_breakdowns]=from,till,stock_count
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=location,product
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
inventory_breakdown_type string
eq
location_id uuid
eq
product_group_id uuid
eq
product_id uuid
eq
status string required
eq

Meta

Results can be aggregated on:

Name Description
inventory_breakdown_type array
sum
started array
sum
status array
sum
stock_count array
sum, count
total array
count

Includes

This request accepts the following includes:

location

product => photo

Inventory levels

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

Relationships

Name Description
item Item required
The item to return data for, this can be a single ID or an array of multiple IDs.
location Location required
The location to filter on.
order Order required
The order to filter on.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
cluster_available integer readonly
The available 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).
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_stock_count integer readonly
The stock count for the cluster the given location is part of.
id uuid readonly
Primary key.
item_id uuid readonly
The item to return data for, this can be a single ID or an array of multiple IDs.
location_available integer readonly
The available quantity for the given location.
location_id uuid readonly
The location to filter on.
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).
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_stock_count integer readonly
The quantity of stock present for the given the location.
order_id uuid readonly
The order to filter on.

Fetch inventory levels for a product

How to fetch inventory levels for a product:

  curl --get 'https://example.booqable.com/api/boomerang/inventory_levels'
       --header 'content-type: application/json'
       --data-urlencode 'filter[from]=2022-01-01 09:00:00'
       --data-urlencode 'filter[item_id]=d4ef30b8-8959-4262-8dcd-d90c23a4ee8a'
       --data-urlencode 'filter[till]=2022-01-02 09:00:00'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "72684141-dea4-42b5-8c69-080d056a0e8c",
        "type": "inventory_levels",
        "attributes": {
          "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,
          "item_id": "d4ef30b8-8959-4262-8dcd-d90c23a4ee8a",
          "location_id": "95c73381-5770-48e8-8a43-af7513a32ed9",
          "order_id": null
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/inventory_levels

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[inventory_levels]=location_available,location_stock_count,location_plannable
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=item,location
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
from datetime required
eq
item_id uuid
eq
location_id uuid
eq
order_id uuid
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

Fetch inventory levels for a product for a specific location

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

  curl --get 'https://example.booqable.com/api/boomerang/inventory_levels'
       --header 'content-type: application/json'
       --data-urlencode 'filter[from]=2022-01-01 09:00:00'
       --data-urlencode 'filter[item_id]=f13f0c48-b1bd-48ef-81be-94aba9cee2fc'
       --data-urlencode 'filter[location_id]=fcf25ba2-1c63-4cf3-842b-be17908108c4'
       --data-urlencode 'filter[till]=2022-01-02 09:00:00'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "7f66e4b6-37f8-4f22-8c62-e35634c5ebb5",
        "type": "inventory_levels",
        "attributes": {
          "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,
          "item_id": "f13f0c48-b1bd-48ef-81be-94aba9cee2fc",
          "location_id": "fcf25ba2-1c63-4cf3-842b-be17908108c4",
          "order_id": null
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/inventory_levels

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[inventory_levels]=location_available,location_stock_count,location_plannable
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=item,location
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
from datetime required
eq
item_id uuid
eq
location_id uuid
eq
order_id uuid
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.

Relationships

Name Description
document Document required
The invoice that needs to be finalized.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
document_id uuid
The invoice that needs to be finalized.
id uuid readonly
Primary key.

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": "ef4f4bbd-55b2-4355-8436-74a4dde8fe55"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "797e55bb-b625-41fd-876a-c97b5ed135b0",
      "type": "invoice_finalizations",
      "attributes": {
        "document_id": "ef4f4bbd-55b2-4355-8436-74a4dde8fe55"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/invoice_finalizations

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[invoice_finalizations]=document_id
include string
List of comma seperated relationships to sideload. ?include=document

Request body

This request accepts the following body:

Name Description
data[attributes][document_id] uuid
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).

Relationships

Name Description
order Order required
The order for which the last invoice needs to be revised.
revised_invoice Document required
The finalized invoice that was revised.
revision_invoice Document required
The replacement invoice that was generated.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
id uuid readonly
Primary key.
order_id uuid
The order for which the last invoice needs to be revised.
revised_invoice_id uuid readonly
The finalized invoice that was revised.
revision_invoice_id uuid readonly
The replacement invoice that was generated.

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": "7b026e88-c408-4d9b-8ff7-4dc889f66f8b"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "75c7effe-1ae6-409a-8cb4-4003f6e2f901",
      "type": "invoice_revisions",
      "attributes": {
        "order_id": "7b026e88-c408-4d9b-8ff7-4dc889f66f8b",
        "revised_invoice_id": "5c7bff8c-1cec-4027-8049-2d29ac25ee0e",
        "revision_invoice_id": "fcb6ea7b-1d93-482b-828e-ae3ab98226c0"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/invoice_revisions

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[invoice_revisions]=order_id,revised_invoice_id,revision_invoice_id
include string
List of comma seperated relationships to sideload. ?include=order,revised_invoice,revision_invoice

Request body

This request accepts the following body:

Name Description
data[attributes][order_id] uuid
The order for which the last invoice needs to be revised.

Includes

This request accepts the following includes:

order

revised_invoice

revision_invoice

Item prices

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

You can calculate a price in a couple ways:

Relationships

Name Description
item Item required
Required, the item or items to calculate price for.
price_ruleset Price ruleset required
The advanced pricing rules the apply.
price_structure Price structure required
Optional price structure to use, if the item has a price structure associated with it that will be used by default.
price_tile Price tile required
The price tile that was selected from the price strucure.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
charge_label string readonly
Label for the charge period.
charge_length integer
Length of charge period in seconds.
from datetime
Start of charge period.
id uuid readonly
Primary key.
item_id uuid
Required, the item or items to calculate price for.
original_charge_label string readonly
Label of charge period before charge rules are applied.
original_charge_length integer readonly
Length of charge period before charge rules are applied.
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_ruleset_id uuid
The advanced pricing rules the apply.
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_tile_id uuid readonly
The price tile that was selected from the price strucure.
till datetime
End of charge period.

Calculate the price of products and/or bundles

Calculating price for a period:

  curl --get 'https://example.booqable.com/api/boomerang/item_prices'
       --header 'content-type: application/json'
       --data-urlencode 'filter[from]=2030-01-01 12:00:00 UTC'
       --data-urlencode 'filter[item_id][]=6a8292cc-4002-4f8e-8da2-1e182dbacc08'
       --data-urlencode 'filter[item_id][]=6ac6ad52-9587-4088-8fd8-af88a9295a8e'
       --data-urlencode 'filter[till]=2030-01-14 12:00:00 UTC'
       --data-urlencode 'include=item'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "7d3ef505-b175-4f03-8151-9d77c4e8d823",
        "type": "item_prices",
        "attributes": {
          "item_id": "6a8292cc-4002-4f8e-8da2-1e182dbacc08",
          "from": "2028-03-25T10:11:00.000000+00:00",
          "till": "2028-04-07T10:11: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": 31200,
          "price_each_in_cents": 31200,
          "price_rule_values": null,
          "price_structure_id": null,
          "price_ruleset_id": null,
          "price_tile_id": null
        },
        "relationships": {
          "item": {
            "data": {
              "type": "products",
              "id": "6a8292cc-4002-4f8e-8da2-1e182dbacc08"
            }
          }
        }
      },
      {
        "id": "1200d3ab-3efd-419e-8837-dbefde64a5c8",
        "type": "item_prices",
        "attributes": {
          "item_id": "6ac6ad52-9587-4088-8fd8-af88a9295a8e",
          "from": "2028-03-25T10:11:00.000000+00:00",
          "till": "2028-04-07T10:11: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": 74100,
          "price_each_in_cents": 74100,
          "price_rule_values": null,
          "price_structure_id": null,
          "price_ruleset_id": null,
          "price_tile_id": null
        },
        "relationships": {
          "item": {
            "data": {
              "type": "products",
              "id": "6ac6ad52-9587-4088-8fd8-af88a9295a8e"
            }
          }
        }
      }
    ],
    "included": [
      {
        "id": "6a8292cc-4002-4f8e-8da2-1e182dbacc08",
        "type": "products",
        "attributes": {
          "created_at": "2023-04-07T07:35:00.000000+00:00",
          "updated_at": "2023-04-07T07:35:00.000000+00:00",
          "archived": false,
          "archived_at": null,
          "type": "products",
          "name": "Product 1000004",
          "group_name": "Product 1000004",
          "slug": "product-1000004",
          "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": 100,
          "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,
          "allow_shortage": false,
          "shortage_limit": 0,
          "variation_values": [],
          "product_group_id": "248e9f40-8ade-4dd1-8bbc-2049129c3146"
        },
        "relationships": {}
      },
      {
        "id": "6ac6ad52-9587-4088-8fd8-af88a9295a8e",
        "type": "products",
        "attributes": {
          "created_at": "2023-04-07T07:35:00.000000+00:00",
          "updated_at": "2023-04-07T07:35:00.000000+00:00",
          "archived": false,
          "archived_at": null,
          "type": "products",
          "name": "Product 1000005",
          "group_name": "Product 1000005",
          "slug": "product-1000005",
          "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": 5700,
          "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_values": [],
          "product_group_id": "88d23396-b095-4122-82f6-992f846605af"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

Calculating price charge length:

  curl --get 'https://example.booqable.com/api/boomerang/item_prices'
       --header 'content-type: application/json'
       --data-urlencode 'filter[charge_length]=36000'
       --data-urlencode 'filter[item_id]=f513ca7d-c6b0-432c-84fa-1b60f29a4cfa'
       --data-urlencode 'include=item'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "f010a8cf-b5d9-4ff8-853c-307a79289325",
        "type": "item_prices",
        "attributes": {
          "item_id": "f513ca7d-c6b0-432c-84fa-1b60f29a4cfa",
          "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": 1000,
          "price_rule_values": null,
          "price_structure_id": null,
          "price_ruleset_id": null,
          "price_tile_id": null
        },
        "relationships": {
          "item": {
            "data": {
              "type": "products",
              "id": "f513ca7d-c6b0-432c-84fa-1b60f29a4cfa"
            }
          }
        }
      }
    ],
    "included": [
      {
        "id": "f513ca7d-c6b0-432c-84fa-1b60f29a4cfa",
        "type": "products",
        "attributes": {
          "created_at": "2023-06-13T08:19:05.000000+00:00",
          "updated_at": "2023-06-13T08:19:05.000000+00:00",
          "archived": false,
          "archived_at": null,
          "type": "products",
          "name": "Product 1000006",
          "group_name": "Product 1000006",
          "slug": "product-1000006",
          "sku": "PRODUCT 1000008",
          "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": 100,
          "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,
          "allow_shortage": false,
          "shortage_limit": 0,
          "variation_values": [],
          "product_group_id": "c9235b08-a9f1-43e5-8ae8-cf204f682b53"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/item_prices

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[item_prices]=item_id,from,till
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=price_tile,price_structure,item
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
charge_length integer
eq
from datetime
eq
item_id uuid
eq
original_charge_length integer
eq
price_ruleset_id uuid
eq
price_structure_id uuid
eq
till datetime
eq

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request accepts the following includes:

price_tile

price_structure

item

Items

The Item resource makes it possible to fetch (and search!) the following resources in a single request:

The description of the relationships and attributes of these resources can be found in their respective sections

List items

How to fetch a list of items:

  curl --get 'https://example.booqable.com/api/boomerang/items'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "d7759df8-1381-4df4-832c-9ddde2efce9a",
        "type": "bundles",
        "attributes": {
          "created_at": "2027-05-05T08:14:00.000000+00:00",
          "updated_at": "2027-05-05T08:14:00.000000+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": "c721f29a-0574-4af4-8fb2-ab4715f97998",
        "type": "product_groups",
        "attributes": {
          "created_at": "2027-05-05T08:14:00.000000+00:00",
          "updated_at": "2027-05-05T08:14:00.000000+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": "58186c7a-50b1-4584-881d-3054f4f5790d",
          "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": "89e8b2cd-7a7e-47b2-8571-1379ad6e21f1",
        "type": "products",
        "attributes": {
          "created_at": "2027-05-05T08:14:00.000000+00:00",
          "updated_at": "2027-05-05T08:14:00.000000+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": "58186c7a-50b1-4584-881d-3054f4f5790d",
          "price_ruleset_id": null,
          "price_structure_id": null,
          "allow_shortage": true,
          "shortage_limit": 3,
          "variation_values": [],
          "product_group_id": "c721f29a-0574-4af4-8fb2-ab4715f97998"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/items

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[items]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=bundle_items,inventory_levels,photo
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
base_price_in_cents integer
eq, not_eq, gt, gte, lt, lte
collection_id uuid
eq, not_eq
conditions hash
eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
deposit_in_cents integer
eq, not_eq, gt, gte, lt, lte
description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
discountable boolean
eq
excerpt 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
group_name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
has_variations boolean
eq
id uuid
eq, not_eq, gt
lag_time integer
eq, not_eq, gt, gte, lt, lte
lead_time 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
photo_id uuid
eq, not_eq
price_period string_enum
eq
price_ruleset_id uuid
eq, not_eq
price_structure_id uuid
eq, not_eq
price_type string_enum
eq
product_group_id uuid
eq
product_type string_enum
eq
q string
eq
seo_description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
seo_title string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
show_in_store boolean
eq
sku 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
sorting_weight integer
eq, not_eq, gt, gte, lt, lte
tag_list string
eq
tax_category_id uuid
eq, not_eq
taxable boolean
eq
trackable boolean
eq
tracking_type string_enum
eq
type string
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte
variation boolean
eq

Meta

Results can be aggregated on:

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

Includes

This request accepts the following includes:

bundle_items

inventory_levels

photo

Search 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": "569def8b-7636-476f-8a1f-be15feb8defb"
      },
      {
        "id": "90acfcac-e08a-40a8-8189-769b49dd2197"
      },
      {
        "id": "000f9d47-49fe-4495-8d4c-39a2187d00f2"
      },
      {
        "id": "b71ea42f-340e-4143-81c1-ca6a463d21ac"
      },
      {
        "id": "f5b4b96e-515c-42f6-8214-95013aa9cdc4"
      }
    ]
  }

HTTP Request

POST api/boomerang/items/search

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[items]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=bundle_items,inventory_levels,photo
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
base_price_in_cents integer
eq, not_eq, gt, gte, lt, lte
collection_id uuid
eq, not_eq
conditions hash
eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
deposit_in_cents integer
eq, not_eq, gt, gte, lt, lte
description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
discountable boolean
eq
excerpt 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
group_name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
has_variations boolean
eq
id uuid
eq, not_eq, gt
lag_time integer
eq, not_eq, gt, gte, lt, lte
lead_time 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
photo_id uuid
eq, not_eq
price_period string_enum
eq
price_ruleset_id uuid
eq, not_eq
price_structure_id uuid
eq, not_eq
price_type string_enum
eq
product_group_id uuid
eq
product_type string_enum
eq
q string
eq
seo_description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
seo_title string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
show_in_store boolean
eq
sku 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
sorting_weight integer
eq, not_eq, gt, gte, lt, lte
tag_list string
eq
tax_category_id uuid
eq, not_eq
taxable boolean
eq
trackable boolean
eq
tracking_type string_enum
eq
type string
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte
variation boolean
eq

Meta

Results can be aggregated on:

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

Includes

This request accepts the following includes:

bundle_items

inventory_levels

photo

Fetch an item

How to fetch an item:

  curl --get 'https://example.booqable.com/api/boomerang/items/15cd96a9-f5ba-4fb6-8ca3-16b2581f1385'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "15cd96a9-f5ba-4fb6-8ca3-16b2581f1385",
      "type": "product_groups",
      "attributes": {
        "created_at": "2015-07-22T22:42:00.000000+00:00",
        "updated_at": "2015-07-22T22:42:00.000000+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": "2a2acff0-f752-4c88-85d7-23015f91caff",
        "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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[items]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=bundle_items,inventory_levels,photo

Includes

This request accepts the following includes:

bundle_items

inventory_levels

photo

Lines

Lines make up the individual elements of an order, document, or cart. They contain information about pricing, planning, or markup.

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.

Kinds of Lines

  1. Planning lines Lines that have an associated Planning. 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.

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

Types of Lines

Bundles

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.

Sorting Lines

# example of lines when using bundles
(position=1) Product A
(position=2) Product B
(position=3) Bundle
  (position=1) Product C
  (position=2) Product D

When using Bundles, the line.position attribute is not unique. Special care needs to be taken to sort all lines correctly.

When booking a bundle:

To correctly sort all lines so they appear as they do within Booqable:

Relationships

Name Description
item Item optional
The Product or Bundle that was booked, when this Line has an associated Planning.
nested_lines Lines hasmany
When item is a Bundle, then there is a nested_line that corresponds for each BundleItem.
order Order required
The Order this Line belongs to.
owner Order required
The resource this Line belongs to. Either the Order directly, or a Document.
parent_line Line optional
When present, then this Line is part of a Bundle, and corresponds to a BundleItem. Inverse of nested_lines relation.
planning Planning optional
The Planning for which this Lines was created. that contains the logistical information related to this Line.
price_structure Price structure optional
The PriceStructure used to calculate the price.
price_tile Price tile optional
The PriceTile that was selected to calculate the price.
tax_category Tax category optional
TaxCategory applied to this Line.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
archived boolean readonly
Whether line is archived.
archived_at datetime readonly nullable
When the line was archived.
charge_label string nullable
Charge label.
charge_length integer nullable
The charge length in seconds. It can be different than the time planned. Setting charge_length to null will trigger recalculation of the price based on order period and price rules.
To recalculate prices for the entire order, use OrderPriceRecalculation.
confirm_shortage boolean writeonly
Whether to confirm a shortage when updating quantity on a line.
created_at datetime readonly
When the resource was created.
discountable boolean
Whether line is discountable.
display_price_in_cents integer readonly
Price of this line to display based on the tax setting of the company (inclusive vs. exclusive).
extra_information string nullable
Extra information about the line.
id uuid readonly
Primary key.
item_id uuid readonly nullable
The Product or Bundle that was booked, when this Line has an associated Planning.
line_type enum readonly-after-create
Type of line.
One of: section, deposit_charge, proration, charge, legacy_migration, delivery_rate.
order_id uuid readonly
The Order this Line belongs to.
original_charge_label string nullable
The original charge label of the product (without price rule adjustments).
original_charge_length integer readonly
The original charge length of the product (without price rule adjustments).
original_price_each_in_cents integer readonly
The original price of the product (without price rule adjustments).
owner_id uuid readonly-after-create
The resource this Line belongs to. Either the Order directly, or a Document.
owner_type string readonly-after-create
The resource type of the owner.
parent_line_id uuid readonly nullable
When present, then this Line is part of a Bundle, and corresponds to a BundleItem. Inverse of nested_lines relation.
planning_id uuid readonly nullable
The Planning for which this Lines was created. that contains the logistical information related to this Line.
position integer nullable
The ordering of lines on an order or document. See this section to understand how to sort when using bundles.
price_each_in_cents integer
Price of each line.
price_in_cents integer readonly
Price of each line x quantity.
price_rule_values hash readonly nullable
Breakdown of applied price rules.
price_structure_id uuid nullable
The PriceStructure used to calculate the price.
price_tile_id uuid nullable
The PriceTile that was selected to calculate the price.
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.
relevant boolean readonly
When false this line should not be shown to users. It is only needed for calculation of prorations.
tax_category_id uuid nullable
TaxCategory applied to this Line.
taxable boolean
Whether line is taxable.
title string nullable
Title of the line.
updated_at datetime readonly
When the resource was last updated.

List lines

How to fetch a list of lines:

  curl --get 'https://example.booqable.com/api/boomerang/lines'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "ae4a88a4-9a7a-4caf-811c-27f85ebe167f",
        "type": "lines",
        "attributes": {
          "created_at": "2023-08-08T15:06:00.000000+00:00",
          "updated_at": "2023-08-08T15:06:00.000000+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": "1978-10-26T05:42:00.000000+00:00",
              "till": "1978-11-24T05:42:00.000000+00:00",
              "adjustments": [
                {
                  "name": "Pickup day"
                },
                {
                  "name": "Return day"
                }
              ]
            },
            "price": [
              {
                "name": "High-Season",
                "charge_length": 1339200,
                "multiplier": "0.2",
                "price_in_cents": 7750,
                "adjustments": [
                  {
                    "from": "1978-11-08T17:42:00.000000+00:00",
                    "till": "1978-11-24T05:42:00.000000+00:00",
                    "charge_length": 1339200,
                    "charge_label": "372 hours",
                    "price_in_cents": 7750
                  }
                ],
                "stacked": false
              }
            ]
          },
          "discountable": true,
          "taxable": true,
          "line_type": "charge",
          "relevant": true,
          "order_id": "db61e960-dc39-40c0-8967-af01657ec0d0",
          "item_id": "dfb7e7c5-6c92-44de-8fd3-beb9fe5dee6e",
          "tax_category_id": "4c97f8cd-9bbf-4048-819a-f50d8b7bff7b",
          "price_structure_id": null,
          "price_tile_id": null,
          "planning_id": "9cf6e39a-f13f-46c3-89db-f1fd269f1bfd",
          "parent_line_id": null,
          "owner_id": "db61e960-dc39-40c0-8967-af01657ec0d0",
          "owner_type": "orders"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/lines

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[lines]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=order,owner,tax_category
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
created_at datetime
eq, not_eq, gt, gte, lt, lte
discountable boolean
eq
id uuid
eq, not_eq
item_id uuid
eq, not_eq
line_type string_enum
eq
order_id uuid
eq
owner_id uuid
eq, not_eq
owner_type string
eq, not_eq
parent_line_id uuid
eq, not_eq
planning_id uuid
eq, not_eq
price_structure_id uuid
eq, not_eq
price_tile_id uuid
eq, not_eq
quantity integer
eq, not_eq, gt, gte, lt, lte
relevant boolean
eq
tax_category_id uuid
eq, not_eq
taxable boolean
eq
title string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
updated_at datetime
eq, not_eq, gt, gte, lt, lte

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

Fetch a line

How to fetch a line:

  curl --get 'https://example.booqable.com/api/boomerang/lines/b4c827b6-c766-42d8-831c-87f9a610b8fa'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "b4c827b6-c766-42d8-831c-87f9a610b8fa",
      "type": "lines",
      "attributes": {
        "created_at": "2022-10-10T21:41:02.000000+00:00",
        "updated_at": "2022-10-10T21:41:02.000000+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": "1977-12-28T12:17:02.000000+00:00",
            "till": "1978-01-26T12:17:02.000000+00:00",
            "adjustments": [
              {
                "name": "Pickup day"
              },
              {
                "name": "Return day"
              }
            ]
          },
          "price": [
            {
              "name": "High-Season",
              "charge_length": 1339200,
              "multiplier": "0.2",
              "price_in_cents": 7750,
              "adjustments": [
                {
                  "from": "1978-01-11T00:17:02.000000+00:00",
                  "till": "1978-01-26T12:17:02.000000+00:00",
                  "charge_length": 1339200,
                  "charge_label": "372 hours",
                  "price_in_cents": 7750
                }
              ],
              "stacked": false
            }
          ]
        },
        "discountable": true,
        "taxable": true,
        "line_type": "charge",
        "relevant": true,
        "order_id": "a206e703-8fe7-4045-826a-36b938ea47d4",
        "item_id": "d4996c4d-efe0-4972-8124-37812a882d50",
        "tax_category_id": "28930517-53d0-4346-865d-0988b23e5ea6",
        "price_structure_id": null,
        "price_tile_id": null,
        "planning_id": "01296b4b-a633-4808-8993-91a287f01c9b",
        "parent_line_id": null,
        "owner_id": "a206e703-8fe7-4045-826a-36b938ea47d4",
        "owner_type": "orders"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/lines/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[lines]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=order,owner,tax_category

Includes

This request accepts the following includes:

order => tax_values

owner => tax_values

tax_category

parent_line

nested_lines => planning

planning => item => photo

Create 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": "e429675c-a2e8-46c3-88f4-316a4bdd2e5d",
             "owner_type": "orders",
             "price_each_in_cents": 1000
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "69903b58-4d14-4bcb-8490-66c5df3ee4df",
      "type": "lines",
      "attributes": {
        "created_at": "2017-01-15T11:15:00.000000+00:00",
        "updated_at": "2017-01-15T11:15:00.000000+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": "e429675c-a2e8-46c3-88f4-316a4bdd2e5d",
        "item_id": null,
        "tax_category_id": null,
        "price_structure_id": null,
        "price_tile_id": null,
        "planning_id": null,
        "parent_line_id": null,
        "owner_id": "e429675c-a2e8-46c3-88f4-316a4bdd2e5d",
        "owner_type": "orders"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/lines

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[lines]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=order,owner,tax_category

Request body

This request accepts the following body:

Name Description
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. Setting charge_length to null will trigger recalculation of the price based on order period and price rules.
To recalculate prices for the entire order, use OrderPriceRecalculation.
data[attributes][confirm_shortage] boolean
Whether to confirm a shortage when updating quantity on a line.
data[attributes][discountable] boolean
Whether line is discountable.
data[attributes][extra_information] string
Extra information about the line.
data[attributes][line_type] enum
Type of line.
One of: section, deposit_charge, proration, charge, legacy_migration, delivery_rate.
data[attributes][original_charge_label] string
The original charge label of the product (without price rule adjustments).
data[attributes][owner_id] uuid
The resource this Line belongs to. Either the Order directly, or a Document.
data[attributes][owner_type] string
The resource type of the owner.
data[attributes][position] integer
The ordering of lines on an order or document. See this section to understand how to sort when using bundles.
data[attributes][price_each_in_cents] integer
Price of each line.
data[attributes][price_structure_id] uuid
The PriceStructure used to calculate the price.
data[attributes][price_tile_id] uuid
The PriceTile that was selected to calculate the price.
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][tax_category_id] uuid
TaxCategory applied to this Line.
data[attributes][taxable] boolean
Whether line is taxable.
data[attributes][title] string
Title of the line.

Includes

This request accepts the following includes:

order => tax_values

owner => tax_values

tax_category

parent_line

nested_lines => planning

planning => item => photo

Update 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/fc2e8815-5ad2-4d0b-8a28-777a6b57d933'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "fc2e8815-5ad2-4d0b-8a28-777a6b57d933",
           "type": "lines",
           "attributes": {
             "price_each_in_cents": 1000
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "fc2e8815-5ad2-4d0b-8a28-777a6b57d933",
      "type": "lines",
      "attributes": {
        "created_at": "2027-03-06T23:03:01.000000+00:00",
        "updated_at": "2027-03-06T23:03:01.000000+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": "33b62e2b-8553-4919-8719-0de973ab048e",
        "item_id": "6079761a-dac1-4eb8-88a9-d5c43040d760",
        "tax_category_id": "87821aa9-fd93-4b69-8e67-01c17fd816d6",
        "price_structure_id": null,
        "price_tile_id": null,
        "planning_id": "cdd8227f-b71f-41ae-83a9-4e47d0c1a2b6",
        "parent_line_id": null,
        "owner_id": "33b62e2b-8553-4919-8719-0de973ab048e",
        "owner_type": "orders"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/lines/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[lines]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=order,owner,tax_category

Request body

This request accepts the following body:

Name Description
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. Setting charge_length to null will trigger recalculation of the price based on order period and price rules.
To recalculate prices for the entire order, use OrderPriceRecalculation.
data[attributes][confirm_shortage] boolean
Whether to confirm a shortage when updating quantity on a line.
data[attributes][discountable] boolean
Whether line is discountable.
data[attributes][extra_information] string
Extra information about the line.
data[attributes][line_type] enum
Type of line.
One of: section, deposit_charge, proration, charge, legacy_migration, delivery_rate.
data[attributes][original_charge_label] string
The original charge label of the product (without price rule adjustments).
data[attributes][owner_id] uuid
The resource this Line belongs to. Either the Order directly, or a Document.
data[attributes][owner_type] string
The resource type of the owner.
data[attributes][position] integer
The ordering of lines on an order or document. See this section to understand how to sort when using bundles.
data[attributes][price_each_in_cents] integer
Price of each line.
data[attributes][price_structure_id] uuid
The PriceStructure used to calculate the price.
data[attributes][price_tile_id] uuid
The PriceTile that was selected to calculate the price.
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][tax_category_id] uuid
TaxCategory applied to this Line.
data[attributes][taxable] boolean
Whether line is taxable.
data[attributes][title] string
Title of the line.

Includes

This request accepts the following includes:

order => tax_values

owner => tax_values

tax_category

parent_line

nested_lines => planning

planning => item => photo

Archive a line

How to delete a line:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/lines/4ad8090f-0878-4fb1-8e5e-2dea58fd8ef6'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "4ad8090f-0878-4fb1-8e5e-2dea58fd8ef6",
      "type": "lines",
      "attributes": {
        "created_at": "2018-12-01T08:17:02.000000+00:00",
        "updated_at": "2018-12-01T08:17:02.000000+00:00",
        "archived": true,
        "archived_at": "2018-12-01T08:17:02.000000+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": "1974-02-17T22:53:02.000000+00:00",
            "till": "1974-03-18T22:53:02.000000+00:00",
            "adjustments": [
              {
                "name": "Pickup day"
              },
              {
                "name": "Return day"
              }
            ]
          },
          "price": [
            {
              "name": "High-Season",
              "charge_length": 1339200,
              "multiplier": "0.2",
              "price_in_cents": 7750,
              "adjustments": [
                {
                  "from": "1974-03-03T10:53:02.000000+00:00",
                  "till": "1974-03-18T22:53:02.000000+00:00",
                  "charge_length": 1339200,
                  "charge_label": "372 hours",
                  "price_in_cents": 7750
                }
              ],
              "stacked": false
            }
          ]
        },
        "discountable": true,
        "taxable": true,
        "line_type": "charge",
        "relevant": true,
        "order_id": "78b392bd-6db0-4fb7-8eee-93b320eb554e",
        "item_id": "914563ce-67a8-43f6-8d3a-bcd5476a2575",
        "tax_category_id": "1f32b2e1-dd8e-4304-8d68-68f0077e18b7",
        "price_structure_id": null,
        "price_tile_id": null,
        "planning_id": "372352f3-b88b-4b67-80e6-e89b803c2fb4",
        "parent_line_id": null,
        "owner_id": "78b392bd-6db0-4fb7-8eee-93b320eb554e",
        "owner_type": "orders"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

DELETE /api/boomerang/lines/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[lines]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=order,owner,tax_category

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.

Relationships

Name Description
carriers Carriers hasmany
The carriers that can do delivery from this location.
clusters Clusters hasmany
The clusters this location is part of.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
address_line_1 string
First address line.
address_line_2 string
Second address line.
archived boolean readonly
Whether location is archived.
archived_at datetime readonly nullable
When the location was archived.
city string
Address city.
cluster_ids array
Clusters this location belongs to.
code string
Code used to identify the location.
confirm_has_orders boolean writeonly
A flag to confirm an address update when the location has orders.
country string
Address country.
created_at datetime readonly
When the resource was created.
fulfillment_capabilities array[string] readonly
The fulfillment process optios available from this location.
Zero or more from: delivery, pickup.
id uuid readonly
Primary key.
location_type enum
Determines if the location can be seen in the online webshop.
One of: rental, internal.
main_address hash
A hash with the address fields. Use it when fetching a location. See address property type for more information.
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.
name string
Name of the location.
pickup_enabled boolean
Whether the location supports pickup.
region string
Address region.
updated_at datetime readonly
When the resource was last updated.
zipcode string
Address zipcode.

List locations

How to fetch locations:

  curl --get 'https://example.booqable.com/api/boomerang/locations'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "f6399631-79bf-4a64-8deb-169a36a274ae",
        "type": "locations",
        "attributes": {
          "created_at": "2020-04-09T06:23:00.000000+00:00",
          "updated_at": "2020-04-09T06:23:00.000000+00:00",
          "archived": false,
          "archived_at": null,
          "name": "Warehouse",
          "code": "LOC1000024",
          "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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[locations]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=clusters,carriers
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
cluster_id uuid
eq, not_eq
code string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
location_type string_enum
eq
main_address hash
eq
name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request accepts the following includes:

clusters

carriers

Fetch a location

How to fetch a single location:

  curl --get 'https://example.booqable.com/api/boomerang/locations/954bf312-7f80-4c5a-8547-8626943b877c'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "954bf312-7f80-4c5a-8547-8626943b877c",
      "type": "locations",
      "attributes": {
        "created_at": "2023-01-14T17:38:02.000000+00:00",
        "updated_at": "2023-01-14T17:38:02.000000+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Warehouse",
        "code": "LOC1000025",
        "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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[locations]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=clusters,carriers

Includes

This request accepts the following includes:

clusters

carriers

Create 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": [
               "b6b7e9ad-3c95-41ca-897a-d2bd4270d323"
             ]
           }
         },
         "include": "clusters"
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "d47e53d6-ce3a-42c6-8ca9-98dd789e4cde",
      "type": "locations",
      "attributes": {
        "created_at": "2015-05-03T23:16:00.000000+00:00",
        "updated_at": "2015-05-03T23:16:00.000000+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": [
          "b6b7e9ad-3c95-41ca-897a-d2bd4270d323"
        ],
        "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": "b6b7e9ad-3c95-41ca-897a-d2bd4270d323"
            }
          ]
        }
      }
    },
    "included": [
      {
        "id": "b6b7e9ad-3c95-41ca-897a-d2bd4270d323",
        "type": "clusters",
        "attributes": {
          "created_at": "2015-05-03T23:16:00.000000+00:00",
          "updated_at": "2015-05-03T23:16:00.000000+00:00",
          "name": "North",
          "location_ids": [
            "d47e53d6-ce3a-42c6-8ca9-98dd789e4cde"
          ]
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

POST /api/boomerang/locations

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[locations]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=clusters,carriers

Request body

This request accepts the following body:

Name Description
data[attributes][address_line_1] string
First address line.
data[attributes][address_line_2] string
Second address line.
data[attributes][city] string
Address city.
data[attributes][cluster_ids][] array
Clusters this location belongs to.
data[attributes][code] string
Code used to identify the location.
data[attributes][confirm_has_orders] boolean
A flag to confirm an address update when the location has orders.
data[attributes][country] string
Address country.
data[attributes][location_type] enum
Determines if the location can be seen in the online webshop.
One of: rental, internal.
data[attributes][main_address] hash
A hash with the address fields. Use it when fetching a location. See address property type for more information.
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][name] string
Name of the location.
data[attributes][pickup_enabled] boolean
Whether the location supports pickup.
data[attributes][region] string
Address region.
data[attributes][zipcode] string
Address zipcode.

Includes

This request accepts the following includes:

clusters

carriers

Update 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/620301be-6eb5-4f1f-8fdd-7d1539cbcfc2'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "620301be-6eb5-4f1f-8fdd-7d1539cbcfc2",
           "type": "locations",
           "attributes": {
             "name": "Old warehouse",
             "cluster_ids": [
               "e9b03933-5297-4354-875b-0d0a14bc83fb",
               "23d4e910-0ff5-4c29-8d01-1aa63a1b974d"
             ]
           }
         },
         "include": "clusters"
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "620301be-6eb5-4f1f-8fdd-7d1539cbcfc2",
      "type": "locations",
      "attributes": {
        "created_at": "2019-10-04T21:59:02.000000+00:00",
        "updated_at": "2019-10-04T21:59:02.000000+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Old warehouse",
        "code": "LOC1000027",
        "location_type": "rental",
        "address_line_1": "Blokhuisplein 40",
        "address_line_2": "Department II",
        "zipcode": "8911LJ",
        "city": "Leeuwarden",
        "region": "Friesland",
        "country": "Netherlands",
        "cluster_ids": [
          "e9b03933-5297-4354-875b-0d0a14bc83fb",
          "23d4e910-0ff5-4c29-8d01-1aa63a1b974d"
        ],
        "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": "e9b03933-5297-4354-875b-0d0a14bc83fb"
            },
            {
              "type": "clusters",
              "id": "23d4e910-0ff5-4c29-8d01-1aa63a1b974d"
            }
          ]
        }
      }
    },
    "included": [
      {
        "id": "e9b03933-5297-4354-875b-0d0a14bc83fb",
        "type": "clusters",
        "attributes": {
          "created_at": "2019-10-04T21:59:02.000000+00:00",
          "updated_at": "2019-10-04T21:59:02.000000+00:00",
          "name": "North",
          "location_ids": [
            "620301be-6eb5-4f1f-8fdd-7d1539cbcfc2"
          ]
        },
        "relationships": {}
      },
      {
        "id": "23d4e910-0ff5-4c29-8d01-1aa63a1b974d",
        "type": "clusters",
        "attributes": {
          "created_at": "2019-10-04T21:59:02.000000+00:00",
          "updated_at": "2019-10-04T21:59:02.000000+00:00",
          "name": "Central",
          "location_ids": [
            "620301be-6eb5-4f1f-8fdd-7d1539cbcfc2"
          ]
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

Disassociating cluster resulting in shortage error:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/locations/f224137a-3275-466e-8502-c1e66ea8444c'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "f224137a-3275-466e-8502-c1e66ea8444c",
           "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": "f198dfab-a4ce-4068-84c3-b706d007c30d",
              "mutation": 0,
              "order_ids": [
                "42d674fe-c02a-4b91-834c-92069417c0ed"
              ],
              "location_id": "f224137a-3275-466e-8502-c1e66ea8444c",
              "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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[locations]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=clusters,carriers

Request body

This request accepts the following body:

Name Description
data[attributes][address_line_1] string
First address line.
data[attributes][address_line_2] string
Second address line.
data[attributes][city] string
Address city.
data[attributes][cluster_ids][] array
Clusters this location belongs to.
data[attributes][code] string
Code used to identify the location.
data[attributes][confirm_has_orders] boolean
A flag to confirm an address update when the location has orders.
data[attributes][country] string
Address country.
data[attributes][location_type] enum
Determines if the location can be seen in the online webshop.
One of: rental, internal.
data[attributes][main_address] hash
A hash with the address fields. Use it when fetching a location. See address property type for more information.
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][name] string
Name of the location.
data[attributes][pickup_enabled] boolean
Whether the location supports pickup.
data[attributes][region] string
Address region.
data[attributes][zipcode] string
Address zipcode.

Includes

This request accepts the following includes:

clusters

carriers

Archive 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/3f258b5c-005d-4808-81c2-954da48df0cb'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "3f258b5c-005d-4808-81c2-954da48df0cb",
      "type": "locations",
      "attributes": {
        "created_at": "2020-03-03T14:31:02.000000+00:00",
        "updated_at": "2020-03-03T14:31:02.000000+00:00",
        "archived": true,
        "archived_at": "2020-03-03T14:31:02.000000+00:00",
        "name": "Warehouse",
        "code": "LOC1000030",
        "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/0b51712b-bd56-43d4-8e58-08b818262a12'
       --header 'content-type: application/json'

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": [
            "0d8a3816-e267-4375-8cd1-cf1340de963d"
          ]
        }
      }
    ]
  }

Failure due to active stock at location:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/locations/d5edee8a-8801-48cd-8087-14b1d659a294'
       --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": [
            "3e62df61-af47-4c9b-8279-1dfb80db2936"
          ]
        }
      }
    ]
  }

HTTP Request

DELETE /api/boomerang/locations/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?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.

Relationships

Name Description
employee Employee required
The employee who created this note.
owner Customer, Product, Product group, Stock item, Bundle, Order, Document, User required
The resource this note is about.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
body string
The content of the note.
created_at datetime readonly
When the resource was created.
employee_id uuid readonly
The employee who created this note.
id uuid readonly
Primary key.
owner_id uuid
The resource this note is about.
owner_type string
The resource type of the owner.
updated_at datetime readonly
When the resource was last updated.

List notes

How to fetch a list of notes:

  curl --get 'https://example.booqable.com/api/boomerang/notes'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "308f95f9-2661-4894-8d17-b4cf8fd661d2",
        "type": "notes",
        "attributes": {
          "created_at": "2022-10-23T23:24:01.000000+00:00",
          "updated_at": "2022-10-23T23:24:01.000000+00:00",
          "body": "Agreed to give this customer a 20% discount on the next order",
          "owner_id": "6e9725e6-9cd5-4743-8021-afe1b305c3f2",
          "owner_type": "customers",
          "employee_id": "4ef2de9b-a05c-49a2-8d8d-3690843a43a8"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/notes

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[notes]=created_at,updated_at,body
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=employee,owner
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
created_at datetime
eq, not_eq, gt, gte, lt, lte
employee_id uuid
eq, not_eq
id uuid
eq, not_eq
owner_id uuid
eq, not_eq
owner_type string
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request accepts the following includes:

employee

owner

Fetch a note

How to fetch a note:

  curl --get 'https://example.booqable.com/api/boomerang/notes/629a61d1-1b50-41fd-867f-b7882b29d2f6'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "629a61d1-1b50-41fd-867f-b7882b29d2f6",
      "type": "notes",
      "attributes": {
        "created_at": "2028-07-04T15:39:01.000000+00:00",
        "updated_at": "2028-07-04T15:39:01.000000+00:00",
        "body": "Agreed to give this customer a 20% discount on the next order",
        "owner_id": "8e17846d-a01b-4743-8d9b-a1ef2884c506",
        "owner_type": "customers",
        "employee_id": "e1d2d7e1-879d-4864-8f80-b42ba923ab58"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/notes/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[notes]=created_at,updated_at,body
include string
List of comma seperated relationships to sideload. ?include=employee,owner

Includes

This request accepts the following includes:

employee

owner

Create 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": "1a7b6819-6c11-4eee-892a-9d87bee21d50",
             "owner_type": "customers"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "40684345-0cb8-4a59-8dea-51468dffb879",
      "type": "notes",
      "attributes": {
        "created_at": "2020-07-03T13:01:01.000000+00:00",
        "updated_at": "2020-07-03T13:01:01.000000+00:00",
        "body": "Agreed to give this customer a 20% discount on the next order",
        "owner_id": "1a7b6819-6c11-4eee-892a-9d87bee21d50",
        "owner_type": "customers",
        "employee_id": "1eb997c6-a419-482c-8414-606eef3b8f04"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/notes

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[notes]=created_at,updated_at,body
include string
List of comma seperated relationships to sideload. ?include=employee,owner

Request body

This request accepts the following body:

Name Description
data[attributes][body] string
The content of the note.
data[attributes][owner_id] uuid
The resource this note is about.
data[attributes][owner_type] string
The resource type of the owner.

Includes

This request accepts the following includes:

employee

owner

Delete a note

How to delete a note:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/notes/32ad49c4-5673-460c-84fd-a5852a0e4d35'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "32ad49c4-5673-460c-84fd-a5852a0e4d35",
      "type": "notes",
      "attributes": {
        "created_at": "2023-07-14T18:36:01.000000+00:00",
        "updated_at": "2023-07-14T18:36:01.000000+00:00",
        "body": "Agreed to give this customer a 20% discount on the next order",
        "owner_id": "654e2ccf-f66b-4cd2-85d2-c446291c11a9",
        "owner_type": "customers",
        "employee_id": "45351704-f8df-4523-8ff0-d5d2b77ecaa4"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

DELETE /api/boomerang/notes/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[notes]=created_at,updated_at,body
include string
List of comma seperated relationships to sideload. ?include=employee,owner

Includes

This request accepts the following includes:

employee

owner

Orders

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

Statuses

To transition an Order to the next status, create an OrderStatusTransition.

Relationships

Name Description
barcode Barcode optional
The QR code automatically generated for this Order.
coupon Coupon optional
The Coupon added to this Order.
customer Customer optional
The Customer this Order is for.
documents Documents hasmany
Documents (quotes, contracts, invoices) related to this order.
lines Lines hasmany
All the Lines of this Order. There is an automatically generated line for every Planning. In addition there can be manually added lines for custom charges, deposit holds and sections.
notes Notes hasmany
Notes about this Order.
order_delivery_rate Order delivery rate optional
Information about the cost of delivery for this Order.
plannings Plannings hasmany
The Plannings for this Order, containing the booked quantities and current status for all Products on this Order.
properties Properties hasmany
Custom but structured data added to this Order. Both Properties linked to DefaultProperties, and one-off Properties can be added to orders. Properties of Orders can be updated in bulk by writing to the properties_attributes attribute.
start_location Location required
The Location where the Customer will pick up the items.
stock_item_plannings Stock item plannings hasmany
The StockItems planned on this Order, and their current status.
stop_location Location required
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 region optional
TaxRegion applied to this Order.
tax_values Tax values hasmany
The taxes calculated for this order. There is one TaxValue for each applicable TaxRate.
transfers Transfers hasmany
Transfers that have been generated to solve shortages on this order.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
billing_address_property_id uuid
The property id of the billing address.
confirm_shortage boolean writeonly
Confirm shortage on update.
coupon_discount_in_cents integer readonly
Coupon discount (incl. or excl. taxes based on tax_strategy.
coupon_id uuid nullable
The Coupon added to this Order.
created_at datetime readonly
When the resource was created.
customer_id uuid nullable
The Customer this Order is for.
delivery_address_property_id uuid
The property id of the delivery address.
deposit_held_in_cents integer readonly
Amount of deposit held.
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_to_refund_in_cents integer readonly
Amount of deposit (still) to be refunded.
deposit_type enum nullable
How deposit is calculated.
One of: none, percentage_total, percentage, fixed.
deposit_value float
The value to use for deposit_type.
discount_in_cents integer readonly
Discount (incl. or excl. taxes based on tax_strategy).
discount_percentage float readonly
The discount percentage applied to this order. May update if order amount changes and type is fixed.
discount_type string
Type of discount.
discount_value float writeonly
The value to use for discount_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.
fulfillment_type enum
Indicates the process used to fulfill this order.
One of: pickup, delivery.
grand_total_in_cents integer readonly
Total excl. taxes (excl. deposit).
grand_total_with_tax_in_cents integer readonly
Amount incl. taxes (excl. deposit).
has_signed_contract boolean readonly
Whether the order has a signed contract.
id uuid readonly
Primary key.
location_shortage boolean readonly
Whether there is a shortage on the pickup location.
number integer readonly
The unique order number.
order_delivery_rate_attributes hash writeonly
Assign this attribute to create/update the order delivery rate as subresource of order in a single request.
override_period_restrictions boolean
Force free period selection when there are restrictions enabled for the order period picker.
paid_in_cents integer readonly
How much was paid.
payment_status enum readonly
Indicates next step to take wrt. payment for this order.
One of: paid, partially_paid, overpaid, payment_due, process_deposit.
price_in_cents integer readonly
Subtotal excl. taxes (excl. deposit).
properties hash readonly
A hash containing all property identidiers and values (include the properties relation if you need more detailed information). Properties of orders can be updated in bulk by writing to the properties_attributes attribute.
properties_attributes array writeonly
Assign this attribute to create/update properties as subresource of order in a single request.
shortage boolean readonly
Whether there is a shortage for this order.
start_location_id uuid
The Location where the Customer will pick up the items.
starts_at datetime nullable
When the items on the order become unavailable.
status enum readonly
Simplified status of the order. An order can be in a mixed state. The statuses attribute contains the full list of current statuses, and status_counts specifies how many items are in each state.
One of: new, concept, reserved, started, stopped, archived, canceled.
status_counts hash readonly
An object containing the status counts of planned products, like { "concept": 0, "reserved": 2, "started": 5, "stopped": 10 }.
statuses array readonly
Status(es) of planned products.
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.
stops_at datetime nullable
When the items on the order become available again.
tag_list array[string]
Case insensitive tag list.
tax_in_cents integer readonly
Total tax.
tax_region_id uuid nullable
TaxRegion applied to this Order.
to_be_paid_in_cents integer readonly
Amount that (still) has to be paid.
total_discount_in_cents integer readonly
Total discount (incl. or excl. taxes based on tax_strategy.
updated_at datetime readonly
When the resource was last updated.

List orders

How to fetch a list of orders:

  curl --get 'https://example.booqable.com/api/boomerang/orders'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "3475c076-354c-4870-8326-459b23381f95",
        "type": "orders",
        "attributes": {
          "created_at": "2015-02-09T00:29:01.000000+00:00",
          "updated_at": "2015-02-09T00:29:01.000000+00:00",
          "number": 1,
          "status": "reserved",
          "statuses": [
            "reserved"
          ],
          "status_counts": {
            "concept": 0,
            "new": 0,
            "reserved": 1,
            "started": 0,
            "stopped": 0
          },
          "starts_at": "1970-04-28T03:03:01.000000+00:00",
          "stops_at": "1970-05-28T03:03:01.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,
          "delivery_address_property_id": null,
          "fulfillment_type": "pickup",
          "customer_id": "5e7fb1d5-a69a-4dad-8f6c-0a321ec6da2c",
          "tax_region_id": null,
          "coupon_id": null,
          "start_location_id": "595f65d5-8218-4704-83ae-39aff6d1aeb4",
          "stop_location_id": "595f65d5-8218-4704-83ae-39aff6d1aeb4"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET api/boomerang/orders

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[orders]=created_at,updated_at,number
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=customer,coupon,start_location
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
any_shortage boolean
eq
billing_address_property_id uuid
eq, not_eq
conditions hash
eq
coupon_discount_in_cents integer
eq, not_eq, gt, gte, lt, lte
coupon_id uuid
eq, not_eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
customer_id uuid
eq, not_eq
delivery_address_property_id uuid
eq, not_eq
deposit_held_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_to_refund_in_cents integer
eq, not_eq, gt, gte, lt, lte
deposit_type string_enum
eq
discount_in_cents integer
eq, not_eq, gt, gte, lt, lte
discount_percentage float
eq, not_eq, gt, gte, lt, lte
discount_value float
eq, not_eq, gt, gte, lt, lte
fulfillment_type string
eq
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
has_signed_contract boolean
eq
id uuid
eq, not_eq, gt
item_id uuid
eq
location_shortage boolean
eq
number integer
eq, not_eq, gt, gte, lt, lte
paid_in_cents integer
eq, not_eq, gt, gte, lt, lte
payment_status string_enum
eq
price_in_cents integer
eq, not_eq, gt, gte, lt, lte
q string
eq
shortage boolean
eq
start_location_id uuid
eq, not_eq
start_or_stop_time datetime
eq, not_eq, gt, gte, lt, lte, between
starts_at datetime
eq, not_eq, gt, gte, lt, lte
status string_enum
eq
status_counts hash
eq
statuses array
eq, not_eq
stock_item_id uuid
eq
stop_location_id uuid
eq, not_eq
stops_at datetime
eq, not_eq, gt, gte, lt, lte
tag_list string
eq
tax_in_cents integer
eq, not_eq, gt, gte, lt, lte
tax_region_id uuid
eq, not_eq
to_be_paid_in_cents integer
eq, not_eq, gt, gte, lt, lte
total_discount_in_cents integer
eq, not_eq, gt, gte, lt, lte
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
coupon_discount_in_cents array
sum, maximum, minimum, average
deposit_held_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_to_refund_in_cents array
sum, maximum, minimum, average
deposit_type array
count
discount_in_cents array
sum, maximum, minimum, average
discount_percentage array
maximum, minimum, average
grand_total_in_cents array
sum, maximum, minimum, average
grand_total_with_tax_in_cents array
sum, maximum, minimum, average
location_shortage array
count
paid_in_cents array
sum, maximum, minimum, average
payment_status array
count
price_in_cents array
sum, maximum, minimum, average
shortage array
count
status array
count
statuses array
count
tag_list array
count
tax_in_cents array
sum, maximum, minimum, average
to_be_paid_in_cents array
sum, maximum, minimum, average
total array
count
total_discount_in_cents array
sum, maximum, minimum, average

Includes

This request accepts the following includes:

customer

coupon

start_location

stop_location

properties

Search 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": "2025-01-14T09:26:27Z",
                       "lte": "2025-01-17T09:26:27Z"
                     }
                   },
                   {
                     "stops_at": {
                       "gte": "2025-01-14T09:26:27Z",
                       "lte": "2025-01-17T09:26:27Z"
                     }
                   }
                 ]
               },
               {
                 "operator": "and",
                 "attributes": [
                   {
                     "deposit_type": "none"
                   },
                   {
                     "payment_status": "paid"
                   }
                 ]
               }
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "b16cd617-07ab-4ca4-87d3-8868952b190e"
      },
      {
        "id": "6021cb4f-601d-47a1-8f99-610793da2ba1"
      }
    ]
  }

HTTP Request

POST api/boomerang/orders/search

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[orders]=created_at,updated_at,number
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=customer,coupon,start_location
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
any_shortage boolean
eq
billing_address_property_id uuid
eq, not_eq
conditions hash
eq
coupon_discount_in_cents integer
eq, not_eq, gt, gte, lt, lte
coupon_id uuid
eq, not_eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
customer_id uuid
eq, not_eq
delivery_address_property_id uuid
eq, not_eq
deposit_held_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_to_refund_in_cents integer
eq, not_eq, gt, gte, lt, lte
deposit_type string_enum
eq
discount_in_cents integer
eq, not_eq, gt, gte, lt, lte
discount_percentage float
eq, not_eq, gt, gte, lt, lte
discount_value float
eq, not_eq, gt, gte, lt, lte
fulfillment_type string
eq
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
has_signed_contract boolean
eq
id uuid
eq, not_eq, gt
item_id uuid
eq
location_shortage boolean
eq
number integer
eq, not_eq, gt, gte, lt, lte
paid_in_cents integer
eq, not_eq, gt, gte, lt, lte
payment_status string_enum
eq
price_in_cents integer
eq, not_eq, gt, gte, lt, lte
q string
eq
shortage boolean
eq
start_location_id uuid
eq, not_eq
start_or_stop_time datetime
eq, not_eq, gt, gte, lt, lte, between
starts_at datetime
eq, not_eq, gt, gte, lt, lte
status string_enum
eq
status_counts hash
eq
statuses array
eq, not_eq
stock_item_id uuid
eq
stop_location_id uuid
eq, not_eq
stops_at datetime
eq, not_eq, gt, gte, lt, lte
tag_list string
eq
tax_in_cents integer
eq, not_eq, gt, gte, lt, lte
tax_region_id uuid
eq, not_eq
to_be_paid_in_cents integer
eq, not_eq, gt, gte, lt, lte
total_discount_in_cents integer
eq, not_eq, gt, gte, lt, lte
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
coupon_discount_in_cents array
sum, maximum, minimum, average
deposit_held_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_to_refund_in_cents array
sum, maximum, minimum, average
deposit_type array
count
discount_in_cents array
sum, maximum, minimum, average
discount_percentage array
maximum, minimum, average
grand_total_in_cents array
sum, maximum, minimum, average
grand_total_with_tax_in_cents array
sum, maximum, minimum, average
location_shortage array
count
paid_in_cents array
sum, maximum, minimum, average
payment_status array
count
price_in_cents array
sum, maximum, minimum, average
shortage array
count
status array
count
statuses array
count
tag_list array
count
tax_in_cents array
sum, maximum, minimum, average
to_be_paid_in_cents array
sum, maximum, minimum, average
total array
count
total_discount_in_cents array
sum, 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 --get 'https://example.booqable.com/api/boomerang/orders/new'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "952676bb-b830-4efa-8bd4-6b03b23fbe32",
      "type": "orders",
      "attributes": {
        "created_at": "2025-08-08T10:38:00.000000+00:00",
        "updated_at": "2025-08-08T10:38:00.000000+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,
        "delivery_address_property_id": null,
        "fulfillment_type": "pickup",
        "customer_id": null,
        "tax_region_id": null,
        "coupon_id": null,
        "start_location_id": "a1af9993-17e0-4410-8fd6-a096f9bcdd0d",
        "stop_location_id": "a1af9993-17e0-4410-8fd6-a096f9bcdd0d"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET api/boomerang/orders/new

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[orders]=created_at,updated_at,number
include string
List of comma seperated relationships to sideload. ?include=barcode,coupon,customer

Includes

This request accepts the following includes:

barcode

coupon

customer => merge_suggestion_customer

properties

documents

lines => item => barcode

photo

properties

planning => stock_item_plannings => stock_item => barcode

tax_category

notes

properties

start_location

stop_location

tax_region

tax_values

transfers

order_delivery_rate => delivery_address

Fetch an order

How to fetch an order:

  curl --get 'https://example.booqable.com/api/boomerang/orders/620766b9-d5c5-4e8d-83cd-c106f1bb148e'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "620766b9-d5c5-4e8d-83cd-c106f1bb148e",
      "type": "orders",
      "attributes": {
        "created_at": "2015-07-07T09:48:01.000000+00:00",
        "updated_at": "2015-07-07T09:48:01.000000+00:00",
        "number": 1,
        "status": "reserved",
        "statuses": [
          "reserved"
        ],
        "status_counts": {
          "concept": 0,
          "new": 0,
          "reserved": 1,
          "started": 0,
          "stopped": 0
        },
        "starts_at": "1970-09-23T12:22:01.000000+00:00",
        "stops_at": "1970-10-23T12:22:01.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,
        "delivery_address_property_id": null,
        "fulfillment_type": "pickup",
        "customer_id": "af4ff106-fdde-49e2-83ec-57302f00cd68",
        "tax_region_id": null,
        "coupon_id": null,
        "start_location_id": "8a045d6d-cb6a-4ead-8c79-6e7bc659d7d4",
        "stop_location_id": "8a045d6d-cb6a-4ead-8c79-6e7bc659d7d4"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET api/boomerang/orders/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[orders]=created_at,updated_at,number
include string
List of comma seperated relationships to sideload. ?include=barcode,coupon,customer

Includes

This request accepts the following includes:

barcode

coupon

customer => merge_suggestion_customer

properties

documents

lines => item => barcode

photo

properties

planning => stock_item_plannings => stock_item => barcode

tax_category

notes

properties

start_location

stop_location

tax_region

tax_values

transfers

order_delivery_rate => delivery_address

Create 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": "2026-09-25T14:40:01.000000+00:00",
             "stops_at": "2026-11-03T14:40:01.000000+00:00"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "2ad70f42-1f86-4a2a-80fd-d3da815fcc0a",
      "type": "orders",
      "attributes": {
        "created_at": "2026-09-22T14:40:01.000000+00:00",
        "updated_at": "2026-09-22T14:40:01.000000+00:00",
        "number": null,
        "status": "new",
        "statuses": [
          "new"
        ],
        "status_counts": {
          "new": 0,
          "concept": 0,
          "reserved": 0,
          "started": 0,
          "stopped": 0
        },
        "starts_at": "2026-09-25T14:29:01.000000+00:00",
        "stops_at": "2026-11-03T14:29:01.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,
        "delivery_address_property_id": null,
        "fulfillment_type": "pickup",
        "customer_id": null,
        "tax_region_id": null,
        "coupon_id": null,
        "start_location_id": "e425fa84-11b4-48c8-8c41-73bdfabc34d9",
        "stop_location_id": "e425fa84-11b4-48c8-8c41-73bdfabc34d9"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/orders

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[orders]=created_at,updated_at,number
include string
List of comma seperated relationships to sideload. ?include=barcode,coupon,customer

Request body

This request accepts the following body:

Name Description
data[attributes][billing_address_property_id] uuid
The property id of the billing address.
data[attributes][confirm_shortage] boolean
Confirm shortage on update.
data[attributes][coupon_id] uuid
The Coupon added to this Order.
data[attributes][customer_id] uuid
The Customer this Order is for.
data[attributes][delivery_address_property_id] uuid
The property id of the delivery address.
data[attributes][deposit_type] enum
How deposit is calculated.
One of: none, percentage_total, percentage, fixed.
data[attributes][deposit_value] float
The value to use for deposit_type.
data[attributes][discount_type] string
Type of discount.
data[attributes][discount_value] float
The value to use for discount_type.
data[attributes][fulfillment_type] enum
Indicates the process used to fulfill this order.
One of: pickup, delivery.
data[attributes][order_delivery_rate_attributes] hash
Assign this attribute to create/update the order delivery rate as subresource of order in a single request.
data[attributes][override_period_restrictions] boolean
Force free period selection when there are restrictions enabled for the order period picker.
data[attributes][properties_attributes][] array
Assign this attribute to create/update properties as subresource of order in a single request.
data[attributes][start_location_id] uuid
The Location where the Customer will pick up the items.
data[attributes][starts_at] datetime
When the items on the order become unavailable.
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.
data[attributes][stops_at] datetime
When the items on the order become available again.
data[attributes][tag_list] array[string]
Case insensitive tag list.
data[attributes][tax_region_id] uuid
TaxRegion applied to this Order.

Includes

This request accepts the following includes:

barcode

coupon

customer => merge_suggestion_customer

properties

documents

lines => item => barcode

photo

properties

planning => stock_item_plannings => stock_item => barcode

tax_category

notes

properties

start_location

stop_location

tax_region

tax_values

transfers

order_delivery_rate => delivery_address

Update 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/b7fc4715-4681-4fbf-8786-f911532c94f1'
       --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": "b7fc4715-4681-4fbf-8786-f911532c94f1",
           "type": "orders",
           "attributes": {
             "customer_id": "62778da7-58fa-4717-8474-a9bcd8c003b4"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "b7fc4715-4681-4fbf-8786-f911532c94f1",
      "type": "orders",
      "attributes": {
        "price_in_cents": 80250,
        "grand_total_with_tax_in_cents": 97103,
        "to_be_paid_in_cents": 197103,
        "customer_id": "62778da7-58fa-4717-8474-a9bcd8c003b4",
        "tax_region_id": null
      },
      "relationships": {}
    },
    "meta": {}
  }

How to update the deposit_type:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/orders/2508bac9-57f4-4320-8fe5-e3e30186754d'
       --header 'content-type: application/json'
       --data '{
         "fields": {
           "orders": "deposit_type,deposit_in_cents,to_be_paid_in_cents,deposit_paid_in_cents"
         },
         "data": {
           "id": "2508bac9-57f4-4320-8fe5-e3e30186754d",
           "type": "orders",
           "attributes": {
             "deposit_type": "percentage"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "2508bac9-57f4-4320-8fe5-e3e30186754d",
      "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/93a4240b-dabb-4402-8f6c-bc85a87f922c'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "93a4240b-dabb-4402-8f6c-bc85a87f922c",
           "type": "orders",
           "attributes": {
             "stops_at": "2024-06-14T15:18:00.000000+00:00"
           }
         }
       }'

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": "6b8dcfd1-8b08-4c90-8a27-22ad5a6a3ae9",
              "unavailable": [
                "e58fe3d1-2652-4c3c-8432-caf5b7148a09"
              ],
              "available": [
                "05f42f25-5487-40b6-8494-463dcf974a53"
              ]
            }
          ]
        }
      }
    ]
  }

HTTP Request

PUT api/boomerang/orders/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[orders]=created_at,updated_at,number
include string
List of comma seperated relationships to sideload. ?include=barcode,coupon,customer

Request body

This request accepts the following body:

Name Description
data[attributes][billing_address_property_id] uuid
The property id of the billing address.
data[attributes][confirm_shortage] boolean
Confirm shortage on update.
data[attributes][coupon_id] uuid
The Coupon added to this Order.
data[attributes][customer_id] uuid
The Customer this Order is for.
data[attributes][delivery_address_property_id] uuid
The property id of the delivery address.
data[attributes][deposit_type] enum
How deposit is calculated.
One of: none, percentage_total, percentage, fixed.
data[attributes][deposit_value] float
The value to use for deposit_type.
data[attributes][discount_type] string
Type of discount.
data[attributes][discount_value] float
The value to use for discount_type.
data[attributes][fulfillment_type] enum
Indicates the process used to fulfill this order.
One of: pickup, delivery.
data[attributes][order_delivery_rate_attributes] hash
Assign this attribute to create/update the order delivery rate as subresource of order in a single request.
data[attributes][override_period_restrictions] boolean
Force free period selection when there are restrictions enabled for the order period picker.
data[attributes][properties_attributes][] array
Assign this attribute to create/update properties as subresource of order in a single request.
data[attributes][start_location_id] uuid
The Location where the Customer will pick up the items.
data[attributes][starts_at] datetime
When items become unavailable, changing this value may result in shortages
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.
data[attributes][stops_at] datetime
When items become available, changing this value may result in shortages
data[attributes][tag_list] array[string]
Case insensitive tag list.
data[attributes][tax_region_id] uuid
TaxRegion applied to this Order.

Includes

This request accepts the following includes:

barcode

coupon

customer => merge_suggestion_customer

properties

documents

lines => item => barcode

photo

properties

planning => stock_item_plannings => stock_item => barcode

tax_category

notes

properties

start_location

stop_location

tax_region

tax_values

transfers

order_delivery_rate => delivery_address

Order delivery rate recalculations

Recalculates the delivery rate of a delivery order.

Relationships

Name Description
order Order required
Order that needs recalculation of its rates.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
id uuid readonly
Primary key.
order_id uuid
Order that needs recalculation of its rates.

Recalculate delivery rates

How to recalculate delivery rates:

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/order_delivery_rate_recalculations'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "order_delivery_rate_recalculations",
           "attributes": {
             "order_id": "48b7ecd6-6758-4045-81ee-d430100bd349"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "0c68209e-69ed-4c80-8b11-3801b7280e42",
      "type": "order_delivery_rate_recalculations",
      "attributes": {
        "order_id": "48b7ecd6-6758-4045-81ee-d430100bd349"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/order_delivery_rate_recalculations

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[order_delivery_rate_recalculations]=order_id
include string
List of comma seperated relationships to sideload. ?include=order

Request body

This request accepts the following body:

Name Description
data[attributes][order_id] uuid
Order that needs recalculation of its rates.

Includes

This request accepts the following includes:

order => tax_values

order_delivery_rate

Order delivery rates

Order delivery rates hold information about the delivery rate associated with a delivery order. This data is relevant only for orders that have a delivery fulfillment type.

Relationships

Name Description
carrier Carrier required
The selected carrier for this order.
order Order required
The delivery order this rate is for.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
carrier_id uuid readonly-after-create
The selected carrier for this order.
created_at datetime readonly
When the resource was created.
id uuid readonly
Primary key.
identifier string
The identifier of the delivery rate.
minimum_order_amount_in_cents integer
The minimum order amount in cents for this delivery rate.
order_id uuid readonly-after-create
The delivery order this rate is for.
price_in_cents integer
The price of the delivery rate in cents.
rate_id string
The rate id returned by a delivery app.
updated_at datetime readonly
When the resource was last updated.

Fetch rates from all installed delivery apps for an order

How to fetch a list of rates:

  curl --get 'https://example.booqable.com/api/boomerang/order_delivery_rates'
       --header 'content-type: application/json'
       --data-urlencode 'filter[order_id]=511097b6-24a3-4291-8141-095dcff3eb32'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "2370b233-cede-4a13-807c-be861a8e3cbd",
        "type": "delivery_rates",
        "attributes": {
          "type": "flat",
          "carrier_id": "04fc2f33-2196-4bbf-80be-31bdddf2a302",
          "price_in_cents": 1000,
          "label": "standard_delivery",
          "range": "10 km",
          "minimum_order_amount_in_cents": 0,
          "description": "Standard delivery",
          "errors": []
        }
      },
      {
        "id": "2bad4bc7-ab29-43ba-8c99-61c895023e9f",
        "type": "delivery_rates",
        "attributes": {
          "type": "calculated",
          "carrier_id": "04fc2f33-2196-4bbf-80be-31bdddf2a302",
          "price_in_cents": 2500,
          "label": "fast_delivery",
          "range": "8.75 km",
          "minimum_order_amount_in_cents": 1000,
          "description": "Fast delivery",
          "errors": [
            "under_minimum_order_amount"
          ]
        }
      }
    ]
  }

HTTP Request

GET /api/boomerang/order_delivery_rates

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[order_delivery_rates]=created_at,updated_at,identifier
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=carrier,order
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
carrier_id uuid
eq, not_eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
identifier string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
minimum_order_amount_in_cents integer
eq, not_eq, gt, gte, lt, lte
order_id uuid
eq, not_eq
price_in_cents integer
eq, not_eq, gt, gte, lt, lte
rate_id string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request accepts the following includes:

carrier

order

Fetch an order delivery rate

How to fetch a rate:

  curl --get 'https://example.booqable.com/api/boomerang/order_delivery_rates/92882618-2029-4da8-84ce-00546ba482bf'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "92882618-2029-4da8-84ce-00546ba482bf",
      "type": "order_delivery_rates",
      "attributes": {
        "created_at": "2025-11-19T18:45:00.000000+00:00",
        "updated_at": "2025-11-19T18:45:00.000000+00:00",
        "identifier": "Xpress",
        "price_in_cents": 10000,
        "rate_id": "5d74673e-ac2b-4853-8a69-66982a001b26",
        "minimum_order_amount_in_cents": 0,
        "carrier_id": "02745660-23b2-4aea-84e5-d7b8dab1c31d",
        "order_id": "0dfa2277-bb9f-48aa-8d5a-eeba5ff88cc6"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/order_delivery_rates/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[order_delivery_rates]=created_at,updated_at,identifier
include string
List of comma seperated relationships to sideload. ?include=carrier,order

Includes

This request accepts the following includes:

carrier

order

Create an order delivery rate

How to create an order delivery rate:

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/order_delivery_rates'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "order_delivery_rates",
           "attributes": {
             "identifier": "Custom rate",
             "price_in_cents": 5000,
             "rate_id": null,
             "carrier_id": null,
             "order_id": "614e2067-a249-44aa-899c-e0e493f52f34"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "3b1f144e-04a1-4bc3-829d-e1eb2c56f060",
      "type": "order_delivery_rates",
      "attributes": {
        "created_at": "2026-03-19T10:24:00.000000+00:00",
        "updated_at": "2026-03-19T10:24:00.000000+00:00",
        "identifier": "Custom rate",
        "price_in_cents": 5000,
        "rate_id": null,
        "minimum_order_amount_in_cents": null,
        "carrier_id": null,
        "order_id": "614e2067-a249-44aa-899c-e0e493f52f34"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/order_delivery_rates

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[order_delivery_rates]=created_at,updated_at,identifier
include string
List of comma seperated relationships to sideload. ?include=carrier,order

Request body

This request accepts the following body:

Name Description
data[attributes][carrier_id] uuid
The selected carrier for this order.
data[attributes][identifier] string
The identifier of the delivery rate.
data[attributes][minimum_order_amount_in_cents] integer
The minimum order amount in cents for this delivery rate.
data[attributes][order_id] uuid
The delivery order this rate is for.
data[attributes][price_in_cents] integer
The price of the delivery rate in cents.
data[attributes][rate_id] string
The rate id returned by a delivery app.

Includes

This request accepts the following includes:

carrier

order

Update an order delivery rate

How to update an order delivery rate:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/order_delivery_rates/00380853-f61f-4ade-8d98-f1cbcbfe2d7f'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "order_delivery_rates",
           "id": "00380853-f61f-4ade-8d98-f1cbcbfe2d7f",
           "attributes": {
             "identifier": "Standard",
             "price_in_cents": 5000,
             "rate_id": "02309205-57de-4518-85c4-551531c6aba6"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "00380853-f61f-4ade-8d98-f1cbcbfe2d7f",
      "type": "order_delivery_rates",
      "attributes": {
        "created_at": "2016-08-26T07:41:01.000000+00:00",
        "updated_at": "2016-08-26T07:41:01.000000+00:00",
        "identifier": "Standard",
        "price_in_cents": 5000,
        "rate_id": "02309205-57de-4518-85c4-551531c6aba6",
        "minimum_order_amount_in_cents": 0,
        "carrier_id": "3bc89c75-2f3e-410c-8254-8676ee3430e1",
        "order_id": "0c1a8b23-fb1a-4f8f-8a73-f9ac40f80aa7"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/order_delivery_rates/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[order_delivery_rates]=created_at,updated_at,identifier
include string
List of comma seperated relationships to sideload. ?include=carrier,order

Request body

This request accepts the following body:

Name Description
data[attributes][carrier_id] uuid
The selected carrier for this order.
data[attributes][identifier] string
The identifier of the delivery rate.
data[attributes][minimum_order_amount_in_cents] integer
The minimum order amount in cents for this delivery rate.
data[attributes][order_id] uuid
The delivery order this rate is for.
data[attributes][price_in_cents] integer
The price of the delivery rate in cents.
data[attributes][rate_id] string
The rate id returned by a delivery app.

Includes

This request accepts the following includes:

carrier

order

Delete an order delivery rate

How to delete an order delivery rate:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/order_delivery_rates/e1bbed39-2b7f-4c41-806e-4d3259929112'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "meta": {}
  }

HTTP Request

DELETE /api/boomerang/order_delivery_rates/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[order_delivery_rates]=created_at,updated_at,identifier
include string
List of comma seperated relationships to sideload. ?include=carrier,order

Includes

This request accepts the following includes:

carrier

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.

Relationships

Name Description
changed_lines Lines hasmany
The lines that have (indirectly) been created or changed by the fulfillment actions.
changed_plannings Plannings hasmany
The plannings that have (indirectly) been created or changed by the fulfillment actions.
changed_stock_item_plannings Stock item plannings hasmany
The stock item plannings that have (indirectly) been created or changed by the fulfillment actions.
order Order required
The order to be fulfilled.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
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.
id uuid readonly
Primary key.
order_id uuid readonly-after-create
The order to be fulfilled.

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": "ff0e6b03-a401-4136-878d-03515e0a3506",
             "confirm_shortage": null,
             "actions": [
               {
                 "action": "book_product",
                 "mode": "create_new",
                 "product_id": "58f2c5fd-6ac5-4557-82b8-4c33a2d89335",
                 "quantity": 3
               }
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "b19330e5-df47-4444-86b2-67785dd806ab",
      "type": "order_fulfillments",
      "attributes": {
        "order_id": "ff0e6b03-a401-4136-878d-03515e0a3506"
      },
      "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": "89ac038f-2546-4b89-8e0b-1ff27baca905",
             "confirm_shortage": null,
             "actions": [
               {
                 "action": "book_product",
                 "mode": "infer_planning",
                 "product_id": "b495248c-6a73-4745-8921-839868860e99",
                 "planning_id": null,
                 "quantity": 3
               }
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "6c4f57c9-8c1c-4e4d-8ccd-d681eb651f43",
      "type": "order_fulfillments",
      "attributes": {
        "order_id": "89ac038f-2546-4b89-8e0b-1ff27baca905"
      },
      "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": "157cec54-7cba-4324-85f7-eff41c768bab",
             "confirm_shortage": null,
             "actions": [
               {
                 "action": "book_product",
                 "mode": "update_existing",
                 "product_id": "965c1191-d5fa-4a9b-848c-fe79ad1d5594",
                 "planning_id": "08e98893-bab0-41b3-8913-ef8719114ef5",
                 "quantity": 3
               }
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "3dc24c42-ceeb-4922-8fe9-cea120a58529",
      "type": "order_fulfillments",
      "attributes": {
        "order_id": "157cec54-7cba-4324-85f7-eff41c768bab"
      },
      "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": "3d6a2dd6-55e4-4d4c-8072-e885f8315a7d",
             "confirm_shortage": null,
             "actions": [
               {
                 "action": "book_stock_items",
                 "mode": "infer_planning",
                 "product_id": "8c9026b0-3f2d-4769-8658-1bbb8a272b80",
                 "stock_item_ids": [
                   "57720425-1bd2-4475-85ac-3341b8efb4dc",
                   "cd8f2e40-ff1b-47f7-8214-ba69e52251ed"
                 ]
               }
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "3ae75561-67df-49a3-80e2-3bb12a12ed2b",
      "type": "order_fulfillments",
      "attributes": {
        "order_id": "3d6a2dd6-55e4-4d4c-8072-e885f8315a7d"
      },
      "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": "b1d40ff0-0ab6-4316-83f7-6603b72c3c0b",
             "confirm_shortage": null,
             "actions": [
               {
                 "action": "book_bundle",
                 "bundle_id": "1e5e1bd0-f59a-42a5-85ef-20d318221df3",
                 "quantity": 1,
                 "product_variations": [
                   {
                     "bundle_item_id": "09afe94a-0976-40b4-8993-b5caddafedd4",
                     "product_id": "97f7f012-d0e9-4c03-82a6-af889c86f673"
                   }
                 ]
               }
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "bf2f5b82-4ee5-47d2-866a-c48bacca6d24",
      "type": "order_fulfillments",
      "attributes": {
        "order_id": "b1d40ff0-0ab6-4316-83f7-6603b72c3c0b"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/order_fulfillments

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[order_fulfillments]=order_id
include string
List of comma seperated relationships to sideload. ?include=order,changed_lines,changed_plannings

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
The order to be fulfilled.

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": "3c6bb0a1-73c7-4087-8437-35dc26e866de",
             "actions": [
               {
                 "action": "specify_stock_items",
                 "product_id": "c34c820b-79b4-4c39-8a00-471d67934308",
                 "planning_id": "4b6038b6-5a01-4af0-83ec-0468429660c6",
                 "stock_item_ids_to_add": [
                   "5bb20b10-c7e9-4b2f-8a04-48aa9f12f117"
                 ],
                 "stock_item_ids_to_remove": []
               }
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "989891a6-cab1-4a93-8d5f-ea2bc4703ad0",
      "type": "order_fulfillments",
      "attributes": {
        "order_id": "3c6bb0a1-73c7-4087-8437-35dc26e866de"
      },
      "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": "fd750947-416c-4da3-8158-cf456b81dc87",
             "actions": [
               {
                 "action": "specify_stock_items",
                 "product_id": "45cd8238-74d4-4f33-836f-31a80860316a",
                 "planning_id": "efda8344-0d43-4bf2-8360-2eaf863301df",
                 "stock_item_ids_to_add": [],
                 "stock_item_ids_to_remove": [
                   "1cf99ea9-3582-4711-8d60-f289187d90b5"
                 ]
               }
             ]
           }
         },
         "include": "changed_stock_item_plannings"
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "16ff306e-ebff-4248-8533-bb32ff205846",
      "type": "order_fulfillments",
      "attributes": {
        "order_id": "fd750947-416c-4da3-8158-cf456b81dc87"
      },
      "relationships": {
        "changed_stock_item_plannings": {
          "data": [
            {
              "type": "stock_item_plannings",
              "id": "43523e16-c1e3-4352-8ab5-c90542c2f035"
            }
          ]
        }
      }
    },
    "included": [
      {
        "id": "43523e16-c1e3-4352-8ab5-c90542c2f035",
        "type": "stock_item_plannings",
        "attributes": {
          "created_at": "2016-07-05T01:17:01.000000+00:00",
          "updated_at": "2016-07-05T01:17:01.000000+00:00",
          "archived": true,
          "archived_at": "2016-07-05T01:17:01.000000+00:00",
          "reserved": false,
          "started": false,
          "stopped": false,
          "stock_item_id": "1cf99ea9-3582-4711-8d60-f289187d90b5",
          "planning_id": "efda8344-0d43-4bf2-8360-2eaf863301df",
          "order_id": "fd750947-416c-4da3-8158-cf456b81dc87"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

POST /api/boomerang/order_fulfillments

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[order_fulfillments]=order_id
include string
List of comma seperated relationships to sideload. ?include=order,changed_lines,changed_plannings

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
The order to be fulfilled.

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": "a9d2797d-f82f-4ca0-8f3a-8fc4e84e499a",
             "confirm_shortage": null,
             "actions": [
               {
                 "action": "start_product",
                 "product_id": "3aa6808c-eb63-4f82-8c19-a65e206b5b18",
                 "planning_id": "ce05c511-c28f-4a58-8d1c-23cc25bfec2a",
                 "quantity": 1
               }
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "5c62cc0f-134c-43a1-8d05-0a531f4bedcd",
      "type": "order_fulfillments",
      "attributes": {
        "order_id": "a9d2797d-f82f-4ca0-8f3a-8fc4e84e499a"
      },
      "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": "69b468c6-e985-416f-897c-33103eb875b3",
             "confirm_shortage": null,
             "actions": [
               {
                 "action": "start_stock_items",
                 "product_id": "df12b4c9-8a40-4d3c-86ca-cb26ad8c478a",
                 "planning_id": "964a14e3-4d5a-4466-8ba7-205f25d4797d",
                 "stock_item_ids": [
                   "fc165af7-9778-4d13-8fdb-fc647e19a9e3"
                 ]
               }
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "406efcb5-8979-43e7-8eea-b73ffd347952",
      "type": "order_fulfillments",
      "attributes": {
        "order_id": "69b468c6-e985-416f-897c-33103eb875b3"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/order_fulfillments

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[order_fulfillments]=order_id
include string
List of comma seperated relationships to sideload. ?include=order,changed_lines,changed_plannings

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
The order to be fulfilled.

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": "a8576b48-8993-43b2-84ce-ab2403706fb9",
             "actions": [
               {
                 "action": "stop_product",
                 "product_id": "4ac65a34-99d1-423b-8389-ee49e2d7f3c6",
                 "planning_id": "8af7930b-bdab-4c3c-853b-48ba3d38d9fe",
                 "quantity": 1
               }
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "1175185d-b612-4647-8bfd-24aa016dba47",
      "type": "order_fulfillments",
      "attributes": {
        "order_id": "a8576b48-8993-43b2-84ce-ab2403706fb9"
      },
      "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": "7a2fbde4-94f3-4043-81b0-d6c4efe6dc39",
             "actions": [
               {
                 "action": "stop_stock_items",
                 "product_id": "9625c967-e233-4ef4-8546-78c7727754ba",
                 "planning_id": "b3c5171d-0080-443f-89f6-08984a27e706",
                 "stock_item_ids": [
                   "cda3cf3c-d51c-4f60-8868-6100ab309d69"
                 ]
               }
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "942d8391-0f00-4a32-840c-750509db3102",
      "type": "order_fulfillments",
      "attributes": {
        "order_id": "7a2fbde4-94f3-4043-81b0-d6c4efe6dc39"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/order_fulfillments

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[order_fulfillments]=order_id
include string
List of comma seperated relationships to sideload. ?include=order,changed_lines,changed_plannings

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
The order to be fulfilled.

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.

Relationships

Name Description
order Order required
Order that needs to be recalculated.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
id uuid readonly
Primary key.
order_id uuid readonly-after-create
Order that needs to be recalculated.

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": "f9d1343a-593e-4557-86c1-de4af6faf4d2"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "9ee14a59-1417-4289-8959-a877624c6cb1",
      "type": "order_price_recalculations",
      "attributes": {
        "order_id": "f9d1343a-593e-4557-86c1-de4af6faf4d2"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/order_price_recalculations

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[order_price_recalculations]=order_id
include string
List of comma seperated relationships to sideload. ?include=order

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 an Order from one status to another status.

See Order for a description 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 OrderFulfillment resource. It is however possible to revert to the started or the stopped status.

It is not possible to resurrect a canceled order. Duplicating a canceled order is possible.

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

Relationships

Name Description
order Order required
The order whose status is changed.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
confirm_shortage boolean
A value of true overrides shortage warnings. This is only possible when reserving an Order.
id uuid readonly
Primary key.
order_id uuid
The order whose status is changed.
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.
transition_from enum
The current status of the Order.
One of: new, concept, reserved, started, stopped, archived.
transition_to enum
The new status of the Order. It is only possible to transition to started or stopped in combination with revert: true.
One of: concept, reserved, archived, canceled.

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": "62131d2f-0b4a-45c7-86b9-1ad5fa771371",
             "transition_from": "new",
             "transition_to": "concept",
             "confirm_shortage": null,
             "revert": null
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "1fa8da73-0d9d-433a-804e-2a196a6bf1a9",
      "type": "order_status_transitions",
      "attributes": {
        "order_id": "62131d2f-0b4a-45c7-86b9-1ad5fa771371",
        "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": "7dbb33d6-22c9-446f-89d0-66f6220a9d65",
             "transition_from": "concept",
             "transition_to": "reserved",
             "confirm_shortage": null,
             "revert": null
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "5ef4d6e7-b7b6-49e8-853b-391f288a55eb",
      "type": "order_status_transitions",
      "attributes": {
        "order_id": "7dbb33d6-22c9-446f-89d0-66f6220a9d65",
        "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": "2399cd14-2f8a-4ebb-8366-714552f1e32b",
             "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": "63849ebc-fadc-4dd3-8611-21c03eacb114",
              "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": "c0d42a57-6fb6-4727-8434-e9dea5e2810f",
             "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": "64959486-4cff-4185-8698-fbebc82a4b0a",
              "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": "ef64f4c5-c58f-4eac-87dd-0e2aaf793449",
             "transition_from": "concept",
             "transition_to": "reserved",
             "confirm_shortage": true,
             "revert": null
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "fab25b98-897a-498a-86f7-6bfa4924a705",
      "type": "order_status_transitions",
      "attributes": {
        "order_id": "ef64f4c5-c58f-4eac-87dd-0e2aaf793449",
        "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": "89b5f18e-b5b8-453a-8cb8-a4e79f99c9d0",
             "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": "baae48c1-e963-41f1-8a93-0f81328d655c",
              "unavailable": [
                "26a12ea9-faa5-4459-8bb4-6caf9defd51b"
              ],
              "available": [
                "ca78a0ea-16b3-4fdc-8c92-ddb1caff31d5"
              ]
            }
          ]
        }
      }
    ]
  }

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": "428183f9-884f-4ead-885c-96af503180de",
             "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": "6fde1091-2638-4df5-8664-cf228c0441db",
             "transition_from": "stopped",
             "transition_to": "archived",
             "confirm_shortage": null,
             "revert": null
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "ec20fd1d-c123-48d0-81e5-eae2c73f75e3",
      "type": "order_status_transitions",
      "attributes": {
        "order_id": "6fde1091-2638-4df5-8664-cf228c0441db",
        "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": "4c006f3f-83ed-40c6-896c-d90896be4b70",
             "transition_from": "reserved",
             "transition_to": "concept",
             "confirm_shortage": null,
             "revert": true
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "2c60e84f-cbcb-411d-8ef9-47385236371f",
      "type": "order_status_transitions",
      "attributes": {
        "order_id": "4c006f3f-83ed-40c6-896c-d90896be4b70",
        "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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[order_status_transitions]=order_id,transition_from,transition_to
include string
List of comma seperated relationships to sideload. ?include=order

Request body

This request accepts the following body:

Name Description
data[attributes][confirm_shortage] boolean
A value of true overrides shortage warnings. This is only possible when reserving an Order.
data[attributes][order_id] uuid
The order whose status is changed.
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][transition_from] enum
The current status of the Order.
One of: new, concept, reserved, started, stopped, archived.
data[attributes][transition_to] enum
The new status of the Order. It is only possible to transition to started or stopped in combination with revert: true.
One of: concept, reserved, archived, canceled.

Includes

This request accepts the following includes:

order => plannings

stock_item_plannings

Payments

A Payment holds information about a payment and its type (owner).

Relationships

Name Description
cart Cart required
The associated cart.
order Order required
The associated order.
owner Payment charge, Payment authorization, Payment refund required
The resource this payment belongs to.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
amount_in_cents integer readonly
Amount in cents.
cart_id uuid readonly-after-create
The associated cart.
created_at datetime readonly
When the resource was created.
currency string readonly
Currency.
deposit_in_cents integer readonly
Deposit in cents.
id uuid readonly
Primary key.
order_id uuid readonly-after-create
The associated order.
owner_id uuid
The resource this payment belongs to.
owner_type string
The resource type of the owner.
status string readonly
Status dependent of the owner.
total_in_cents integer readonly
Total amount in cents (amount + deposit).
updated_at datetime readonly
When the resource was last updated.

List payments

How to fetch a list of payments:

  curl --get 'https://example.booqable.com/api/boomerang/payments'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "d7796fe0-99e9-4f00-858b-eb3f1e28fd8f",
        "type": "payments",
        "attributes": {
          "created_at": "2028-11-19T02:39:01.000000+00:00",
          "updated_at": "2028-11-19T02:39:01.000000+00:00",
          "status": "created",
          "amount_in_cents": 5000,
          "deposit_in_cents": 0,
          "total_in_cents": 5000,
          "currency": "usd",
          "owner_id": null,
          "owner_type": null,
          "cart_id": null,
          "order_id": null
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/payments

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[payments]=created_at,updated_at,status
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=owner,order,cart
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
owner_id uuid
eq, not_eq
owner_type string
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
amount_in_cents array
sum
deposit_in_cents array
sum
total array
count
total_in_cents array
sum

Includes

This request accepts the following includes:

owner

order

cart

Fetch a payment

How to fetch a payment:

  curl --get 'https://example.booqable.com/api/boomerang/payments/bf92b7a9-88e9-43e2-85c0-49ff1418a448'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "bf92b7a9-88e9-43e2-85c0-49ff1418a448",
      "type": "payments",
      "attributes": {
        "created_at": "2016-06-23T23:18:00.000000+00:00",
        "updated_at": "2016-06-23T23:18:00.000000+00:00",
        "status": "created",
        "amount_in_cents": 5000,
        "deposit_in_cents": 0,
        "total_in_cents": 5000,
        "currency": "usd",
        "owner_id": null,
        "owner_type": null,
        "cart_id": null,
        "order_id": null
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/payments/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[payments]=created_at,updated_at,status
include string
List of comma seperated relationships to sideload. ?include=owner,order,cart

Includes

This request accepts the following includes:

owner

order

cart

Payment authorizations

A PaymentAuthorization is a record of payment authorization that is used to track the authorization status and details.

Relationships

Name Description
customer Customer required
The associated customer.
employee Employee required
The employee who created this payment authorization.
order Order required
The associated order.
payment Payment optional
The payment.
payment_charges Payment charges hasmany
The associated charges.
payment_method Payment method required
The payment method.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
amount_capturable_in_cents integer readonly
Capturable amount in cents.
amount_captured_in_cents integer readonly
Captured amount in cents.
amount_in_cents integer
Amount in cents.
canceled_at datetime readonly
When payment authorization was canceled.
capturable boolean readonly
Whether the authorization is capturable.
capture_before datetime readonly
When payment authorization needs to be captured before.
captured_at datetime readonly
When payment authorization was captured.
created_at datetime readonly
When the resource was created.
currency string
Currency.
customer_id uuid readonly-after-create
The associated customer.
deposit_capturable_in_cents integer readonly
Capturable deposit in cents.
deposit_captured_in_cents integer readonly
Captured deposit in cents.
deposit_in_cents integer
Deposit in cents.
description string
Description.
employee_id uuid readonly
The employee who created this payment authorization.
expired_at datetime readonly
When payment authorization expired.
failed_at datetime readonly
When payment authorization failed.
id uuid readonly
Primary key.
mode enum
Mode.
One of: off_session, checkout, request, terminal.
order_id uuid readonly-after-create
The associated order.
payment_method_id uuid readonly-after-create
The payment method.
possible_actions array readonly
Possible actions to be taken on the payment charge.
provider enum
Provider.
One of: stripe, app.
provider_id string
External provider authorization identification.
provider_method string
Provider authorization method. Ex: credit_card, boleto, cash, bank, etc...
provider_secret string
Provider authorization secret.
redirect_url string
Redirect URL to redirect to external payment provider.
status enum
Status.
One of: created, started, action_required, succeeded, failed, canceled, expired, captured.
succeeded_at datetime readonly
When payment authorization succeeded.
total_capturable_in_cents integer readonly
Total capturable amount in cents (amount_capturable + deposit_capturable).
total_captured_in_cents integer readonly
Total captured amount in cents (amount_captured + deposit_captured).
total_in_cents integer readonly
Total amount in cents (amount + deposit).
updated_at datetime readonly
When the resource was last updated.

List payment authorizations

How to fetch a list of payment authorizations:

  curl --get 'https://example.booqable.com/api/boomerang/payment_authorizations'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "66874981-e62c-43f2-802e-344df90b6097",
        "type": "payment_authorizations",
        "attributes": {
          "created_at": "2016-01-06T17:46:00.000000+00:00",
          "updated_at": "2016-01-06T17:46:00.000000+00:00",
          "status": "created",
          "amount_in_cents": 100,
          "deposit_in_cents": 0,
          "total_in_cents": 100,
          "currency": "usd",
          "mode": "request",
          "description": null,
          "redirect_url": null,
          "provider": "stripe",
          "provider_id": null,
          "provider_method": null,
          "provider_secret": null,
          "capturable": true,
          "amount_capturable_in_cents": 100,
          "deposit_capturable_in_cents": 0,
          "total_capturable_in_cents": 100,
          "amount_captured_in_cents": 0,
          "deposit_captured_in_cents": 0,
          "total_captured_in_cents": 0,
          "captured_at": null,
          "capture_before": null,
          "succeeded_at": null,
          "failed_at": null,
          "canceled_at": null,
          "expired_at": null,
          "possible_actions": [
            "cancel"
          ],
          "employee_id": null,
          "order_id": null,
          "customer_id": null,
          "payment_method_id": null
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/payment_authorizations

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[payment_authorizations]=created_at,updated_at,status
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=order,customer,payment_method
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
amount_capturable_in_cents integer
eq, not_eq, gt, gte, lt, lte
amount_captured_in_cents integer
eq, not_eq, gt, gte, lt, lte
amount_in_cents integer
eq, not_eq, gt, gte, lt, lte
canceled_at datetime
eq, not_eq, gt, gte, lt, lte
capturable boolean
eq
capture_before datetime
eq, not_eq, gt, gte, lt, lte
captured_at datetime
eq, not_eq, gt, gte, lt, lte
created_at datetime
eq, not_eq, gt, gte, lt, lte
currency string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
customer_id uuid
eq, not_eq
deposit_capturable_in_cents integer
eq, not_eq, gt, gte, lt, lte
deposit_captured_in_cents integer
eq, not_eq, gt, gte, lt, lte
deposit_in_cents integer
eq, not_eq, gt, gte, lt, lte
description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
employee_id uuid
eq, not_eq
expired_at datetime
eq, not_eq, gt, gte, lt, lte
failed_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
mode string_enum
eq
order_id uuid
eq, not_eq
payment_method_id uuid
eq, not_eq
provider string_enum
eq
provider_id string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
provider_method string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
provider_secret string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
redirect_url string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
status string_enum
eq
succeeded_at datetime
eq, not_eq, gt, gte, lt, lte
total_capturable_in_cents integer
eq, not_eq, gt, gte, lt, lte
total_captured_in_cents integer
eq, not_eq, gt, gte, lt, lte
total_in_cents integer
eq, not_eq, gt, gte, lt, lte
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
amount_in_cents array
sum
deposit_in_cents array
sum
total array
count
total_in_cents array
sum

Includes

This request accepts the following includes:

order

customer

payment_method

Fetch a payment authorization

How to fetch a payment authorization:

  curl --get 'https://example.booqable.com/api/boomerang/payment_authorizations/8123994b-ac75-49a5-89d9-e375e3a3df3f'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "8123994b-ac75-49a5-89d9-e375e3a3df3f",
      "type": "payment_authorizations",
      "attributes": {
        "created_at": "2027-10-07T00:59:00.000000+00:00",
        "updated_at": "2027-10-07T00:59:00.000000+00:00",
        "status": "created",
        "amount_in_cents": 100,
        "deposit_in_cents": 0,
        "total_in_cents": 100,
        "currency": "usd",
        "mode": "request",
        "description": null,
        "redirect_url": null,
        "provider": "stripe",
        "provider_id": null,
        "provider_method": null,
        "provider_secret": null,
        "capturable": true,
        "amount_capturable_in_cents": 100,
        "deposit_capturable_in_cents": 0,
        "total_capturable_in_cents": 100,
        "amount_captured_in_cents": 0,
        "deposit_captured_in_cents": 0,
        "total_captured_in_cents": 0,
        "captured_at": null,
        "capture_before": null,
        "succeeded_at": null,
        "failed_at": null,
        "canceled_at": null,
        "expired_at": null,
        "possible_actions": [
          "cancel"
        ],
        "employee_id": null,
        "order_id": null,
        "customer_id": null,
        "payment_method_id": null
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/payment_authorizations/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[payment_authorizations]=created_at,updated_at,status
include string
List of comma seperated relationships to sideload. ?include=order,customer,payment_method

Includes

This request accepts the following includes:

order

customer

payment_method

Create a payment authorization

How to create a payment authorization:

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/payment_authorizations'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "payment_authorizations",
           "attributes": {
             "mode": "request",
             "amount_in_cents": 10000,
             "deposit_in_cents": 5000
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "8aaa4100-cf5f-4fa4-80ba-fe3f05745629",
      "type": "payment_authorizations",
      "attributes": {
        "created_at": "2018-07-05T22:55:03.000000+00:00",
        "updated_at": "2018-07-05T22:55:03.000000+00:00",
        "status": "created",
        "amount_in_cents": 10000,
        "deposit_in_cents": 5000,
        "total_in_cents": 15000,
        "currency": "usd",
        "mode": "request",
        "description": null,
        "redirect_url": null,
        "provider": null,
        "provider_id": null,
        "provider_method": null,
        "provider_secret": null,
        "capturable": false,
        "amount_capturable_in_cents": 10000,
        "deposit_capturable_in_cents": 5000,
        "total_capturable_in_cents": 15000,
        "amount_captured_in_cents": 0,
        "deposit_captured_in_cents": 0,
        "total_captured_in_cents": 0,
        "captured_at": null,
        "capture_before": null,
        "succeeded_at": null,
        "failed_at": null,
        "canceled_at": null,
        "expired_at": null,
        "possible_actions": [
          "cancel"
        ],
        "employee_id": "c6505e37-c8ba-4ebf-8345-3c74edbd6182",
        "order_id": null,
        "customer_id": null,
        "payment_method_id": null
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/payment_authorizations

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[payment_authorizations]=created_at,updated_at,status
include string
List of comma seperated relationships to sideload. ?include=order,customer,payment_method

Request body

This request accepts the following body:

Name Description
data[attributes][amount_in_cents] integer
Amount in cents.
data[attributes][currency] string
Currency.
data[attributes][customer_id] uuid
The associated customer.
data[attributes][deposit_in_cents] integer
Deposit in cents.
data[attributes][mode] enum
Mode.
One of: off_session, checkout, request, terminal.
data[attributes][order_id] uuid
The associated order.
data[attributes][payment_method_id] uuid
The payment method.
data[attributes][provider] enum
Provider.
One of: stripe, app.
data[attributes][provider_id] string
External provider authorization identification.
data[attributes][provider_method] string
Provider authorization method. Ex: credit_card, boleto, cash, bank, etc...
data[attributes][provider_secret] string
Provider authorization secret.
data[attributes][redirect_url] string
Redirect URL to redirect to external payment provider.
data[attributes][status] enum
Status.
One of: created, started, action_required, succeeded, failed, canceled, expired, captured.

Includes

This request accepts the following includes:

order

customer

payment_method

Update a payment authorization

How to update a payment authorization:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/payment_authorizations/1ed150c8-95c1-4995-84f1-2d34064f48ed'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "1ed150c8-95c1-4995-84f1-2d34064f48ed",
           "type": "payment_authorizations",
           "attributes": {
             "status": "started",
             "provider": "stripe",
             "provider_method": "card"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "1ed150c8-95c1-4995-84f1-2d34064f48ed",
      "type": "payment_authorizations",
      "attributes": {
        "created_at": "2018-11-07T01:48:04.000000+00:00",
        "updated_at": "2018-11-07T01:48:04.000000+00:00",
        "status": "started",
        "amount_in_cents": 100,
        "deposit_in_cents": 0,
        "total_in_cents": 100,
        "currency": "usd",
        "mode": "request",
        "description": null,
        "redirect_url": null,
        "provider": "stripe",
        "provider_id": null,
        "provider_method": "card",
        "provider_secret": null,
        "capturable": true,
        "amount_capturable_in_cents": 100,
        "deposit_capturable_in_cents": 0,
        "total_capturable_in_cents": 100,
        "amount_captured_in_cents": 0,
        "deposit_captured_in_cents": 0,
        "total_captured_in_cents": 0,
        "captured_at": null,
        "capture_before": null,
        "succeeded_at": null,
        "failed_at": null,
        "canceled_at": null,
        "expired_at": null,
        "possible_actions": [],
        "employee_id": null,
        "order_id": null,
        "customer_id": null,
        "payment_method_id": null
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/payment_authorizations/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[payment_authorizations]=created_at,updated_at,status
include string
List of comma seperated relationships to sideload. ?include=order,customer,payment_method

Request body

This request accepts the following body:

Name Description
data[attributes][amount_in_cents] integer
Amount in cents.
data[attributes][currency] string
Currency.
data[attributes][customer_id] uuid
The associated customer.
data[attributes][deposit_in_cents] integer
Deposit in cents.
data[attributes][mode] enum
Mode.
One of: off_session, checkout, request, terminal.
data[attributes][order_id] uuid
The associated order.
data[attributes][payment_method_id] uuid
The payment method.
data[attributes][provider] enum
Provider.
One of: stripe, app.
data[attributes][provider_id] string
External provider authorization identification.
data[attributes][provider_method] string
Provider authorization method. Ex: credit_card, boleto, cash, bank, etc...
data[attributes][provider_secret] string
Provider authorization secret.
data[attributes][redirect_url] string
Redirect URL to redirect to external payment provider.
data[attributes][status] enum
Status.
One of: created, started, action_required, succeeded, failed, canceled, expired, captured.

Includes

This request accepts the following includes:

order

customer

payment_method

Payment charges

A PaymentCharge is a record of payment of an User that is used to track the payment status and details.

Relationships

Name Description
customer Customer required
The associated customer.
employee Employee required
The employee who created this charge.
order Order required
The associated order.
payment Payment optional
The payment.
payment_authorization Payment authorization required
The authorization under which this charge is made.
payment_method Payment method required
The payment method.
payment_refunds Payment refunds hasmany
The associated refunds.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
amount_in_cents integer
Amount in cents.
amount_refundable_in_cents integer readonly
Refundable amount in cents.
amount_refunded_in_cents integer readonly
Refunded amount in cents.
canceled_at datetime readonly
When payment charge was canceled.
created_at datetime readonly
When the resource was created.
currency string
Currency.
customer_id uuid readonly-after-create
The associated customer.
deposit_in_cents integer
Deposit in cents.
deposit_refundable_in_cents integer readonly
Refundable deposit in cents.
deposit_refunded_in_cents integer readonly
Refunded deposit in cents.
description string
Description.
employee_id uuid readonly
The employee who created this charge.
expired_at datetime readonly
When payment charge expired.
failed_at datetime readonly
When payment charge failed.
id uuid readonly
Primary key.
mode enum
Mode. checkout mode is reserved for checkout payments, not available for API.
One of: manual, off_session, request, terminal, capture.
order_id uuid readonly-after-create
The associated order.
payment_authorization_id uuid readonly-after-create
The authorization under which this charge is made.
payment_method_id uuid
The payment method.
possible_actions array readonly
Possible actions to be taken on the payment charge.
provider enum
Provider.
One of: stripe, app, none.
provider_id string
External provider payment identification.
provider_method string
Provider payment method. Ex: credit_card, boleto, cash, bank, etc..
provider_secret string
Provider payment secret.
redirect_url string
Redirect URL to redirect to external payment provider.
refundable boolean readonly
Whether the payment is refundable.
status enum
Status.
One of: created, started, action_required, processing, succeeded, failed, canceled, expired.
succeeded_at datetime
When payment charge succeeded.
total_in_cents integer readonly
Total amount in cents (amount + deposit).
total_refundable_in_cents integer readonly
Total refundable amount in cents (amount_refundable + deposit_refundable).
total_refunded_in_cents integer readonly
Total refunded amount in cents (amount_refunded + deposit_refunded).
updated_at datetime readonly
When the resource was last updated.

List payment charges

How to fetch a list of payment charges:

  curl --get 'https://example.booqable.com/api/boomerang/payment_charges'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "cf983158-4c16-463d-83f2-287e163c6316",
        "type": "payment_charges",
        "attributes": {
          "created_at": "2019-02-04T06:20:01.000000+00:00",
          "updated_at": "2019-02-04T06:20:01.000000+00:00",
          "status": "created",
          "amount_in_cents": 5000,
          "deposit_in_cents": 0,
          "total_in_cents": 5000,
          "currency": "usd",
          "mode": "request",
          "description": null,
          "redirect_url": null,
          "provider": "stripe",
          "provider_id": null,
          "provider_method": null,
          "provider_secret": null,
          "refundable": true,
          "amount_refundable_in_cents": 5000,
          "amount_refunded_in_cents": 0,
          "deposit_refundable_in_cents": 0,
          "deposit_refunded_in_cents": 0,
          "total_refundable_in_cents": 5000,
          "total_refunded_in_cents": 0,
          "succeeded_at": null,
          "failed_at": null,
          "canceled_at": null,
          "expired_at": null,
          "possible_actions": [
            "cancel"
          ],
          "employee_id": null,
          "order_id": null,
          "customer_id": null,
          "payment_method_id": null,
          "payment_authorization_id": null
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/payment_charges

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[payment_charges]=created_at,updated_at,status
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=order,customer
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
amount_in_cents integer
eq, not_eq, gt, gte, lt, lte
amount_refundable_in_cents integer
eq, not_eq, gt, gte, lt, lte
amount_refunded_in_cents integer
eq, not_eq, gt, gte, lt, lte
canceled_at datetime
eq, not_eq, gt, gte, lt, lte
created_at datetime
eq, not_eq, gt, gte, lt, lte
currency string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
customer_id uuid
eq, not_eq
deposit_in_cents integer
eq, not_eq, gt, gte, lt, lte
deposit_refundable_in_cents integer
eq, not_eq, gt, gte, lt, lte
deposit_refunded_in_cents integer
eq, not_eq, gt, gte, lt, lte
description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
employee_id uuid
eq, not_eq
expired_at datetime
eq, not_eq, gt, gte, lt, lte
failed_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
mode string_enum
eq
order_id uuid
eq, not_eq
payment_authorization_id uuid
eq, not_eq
payment_method_id uuid
eq, not_eq
provider string_enum
eq
provider_id string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
provider_method string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
provider_secret string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
redirect_url string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
refundable boolean
eq
status string_enum
eq
succeeded_at datetime
eq, not_eq, gt, gte, lt, lte
total_in_cents integer
eq, not_eq, gt, gte, lt, lte
total_refundable_in_cents integer
eq, not_eq, gt, gte, lt, lte
total_refunded_in_cents integer
eq, not_eq, gt, gte, lt, lte
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
amount_in_cents array
sum
deposit_in_cents array
sum
total array
count
total_in_cents array
sum

Includes

This request accepts the following includes:

order

customer

Fetch a payment charge

How to fetch a payment charge:

  curl --get 'https://example.booqable.com/api/boomerang/payment_charges/832f8d67-c53b-44e6-8852-154d491b0b0e'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "832f8d67-c53b-44e6-8852-154d491b0b0e",
      "type": "payment_charges",
      "attributes": {
        "created_at": "2025-06-23T03:53:07.000000+00:00",
        "updated_at": "2025-06-23T03:53:07.000000+00:00",
        "status": "created",
        "amount_in_cents": 5000,
        "deposit_in_cents": 0,
        "total_in_cents": 5000,
        "currency": "usd",
        "mode": "request",
        "description": null,
        "redirect_url": null,
        "provider": "stripe",
        "provider_id": null,
        "provider_method": null,
        "provider_secret": null,
        "refundable": true,
        "amount_refundable_in_cents": 5000,
        "amount_refunded_in_cents": 0,
        "deposit_refundable_in_cents": 0,
        "deposit_refunded_in_cents": 0,
        "total_refundable_in_cents": 5000,
        "total_refunded_in_cents": 0,
        "succeeded_at": null,
        "failed_at": null,
        "canceled_at": null,
        "expired_at": null,
        "possible_actions": [
          "cancel"
        ],
        "employee_id": null,
        "order_id": null,
        "customer_id": null,
        "payment_method_id": null,
        "payment_authorization_id": null
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/payment_charges/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[payment_charges]=created_at,updated_at,status
include string
List of comma seperated relationships to sideload. ?include=order,customer

Includes

This request accepts the following includes:

order

customer

Create a payment charge

How to create a payment charge:

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/payment_charges'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "payment_charges",
           "attributes": {
             "mode": "manual",
             "provider": "none",
             "amount_in_cents": 10000,
             "deposit_in_cents": 5000
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "173c372c-a487-4900-843d-17ca3a33c915",
      "type": "payment_charges",
      "attributes": {
        "created_at": "2023-02-26T05:02:01.000000+00:00",
        "updated_at": "2023-02-26T05:02:01.000000+00:00",
        "status": "succeeded",
        "amount_in_cents": 10000,
        "deposit_in_cents": 5000,
        "total_in_cents": 15000,
        "currency": "usd",
        "mode": "manual",
        "description": null,
        "redirect_url": null,
        "provider": "none",
        "provider_id": null,
        "provider_method": "bank",
        "provider_secret": null,
        "refundable": true,
        "amount_refundable_in_cents": 10000,
        "amount_refunded_in_cents": 0,
        "deposit_refundable_in_cents": 5000,
        "deposit_refunded_in_cents": 0,
        "total_refundable_in_cents": 15000,
        "total_refunded_in_cents": 0,
        "succeeded_at": "2023-02-26T05:02:01.000000+00:00",
        "failed_at": null,
        "canceled_at": null,
        "expired_at": null,
        "possible_actions": [],
        "employee_id": "7dd1d262-ea22-442d-8f2b-551256cde93a",
        "order_id": null,
        "customer_id": null,
        "payment_method_id": null,
        "payment_authorization_id": null
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/payment_charges

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[payment_charges]=created_at,updated_at,status
include string
List of comma seperated relationships to sideload. ?include=order,customer

Request body

This request accepts the following body:

Name Description
data[attributes][amount_in_cents] integer
Amount in cents.
data[attributes][currency] string
Currency.
data[attributes][customer_id] uuid
The associated customer.
data[attributes][deposit_in_cents] integer
Deposit in cents.
data[attributes][mode] enum
Mode. checkout mode is reserved for checkout payments, not available for API.
One of: manual, off_session, request, terminal, capture.
data[attributes][order_id] uuid
The associated order.
data[attributes][payment_authorization_id] uuid
The authorization under which this charge is made.
data[attributes][payment_method_id] uuid
The payment method.
data[attributes][provider] enum
Provider.
One of: stripe, app, none.
data[attributes][provider_id] string
External provider payment identification.
data[attributes][provider_method] string
Provider payment method. Ex: credit_card, boleto, cash, bank, etc..
data[attributes][provider_secret] string
Provider payment secret.
data[attributes][redirect_url] string
Redirect URL to redirect to external payment provider.
data[attributes][status] enum
Status.
One of: created, started, action_required, processing, succeeded, failed, canceled, expired.
data[attributes][succeeded_at] datetime
When payment charge succeeded.

Includes

This request accepts the following includes:

order

customer

Update a payment charge

How to update a payment charge:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/payment_charges/04972b14-5348-4e61-8896-e61e346e3001'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "04972b14-5348-4e61-8896-e61e346e3001",
           "type": "payment_charges",
           "attributes": {
             "status": "started",
             "provider": "stripe",
             "provider_method": "card"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "04972b14-5348-4e61-8896-e61e346e3001",
      "type": "payment_charges",
      "attributes": {
        "created_at": "2015-05-19T14:36:00.000000+00:00",
        "updated_at": "2015-05-19T14:36:00.000000+00:00",
        "status": "started",
        "amount_in_cents": 5000,
        "deposit_in_cents": 0,
        "total_in_cents": 5000,
        "currency": "usd",
        "mode": "request",
        "description": null,
        "redirect_url": null,
        "provider": "stripe",
        "provider_id": null,
        "provider_method": "card",
        "provider_secret": null,
        "refundable": true,
        "amount_refundable_in_cents": 5000,
        "amount_refunded_in_cents": 0,
        "deposit_refundable_in_cents": 0,
        "deposit_refunded_in_cents": 0,
        "total_refundable_in_cents": 5000,
        "total_refunded_in_cents": 0,
        "succeeded_at": null,
        "failed_at": null,
        "canceled_at": null,
        "expired_at": null,
        "possible_actions": [],
        "employee_id": null,
        "order_id": null,
        "customer_id": null,
        "payment_method_id": null,
        "payment_authorization_id": null
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/payment_charges/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[payment_charges]=created_at,updated_at,status
include string
List of comma seperated relationships to sideload. ?include=order,customer

Request body

This request accepts the following body:

Name Description
data[attributes][amount_in_cents] integer
Amount in cents.
data[attributes][currency] string
Currency.
data[attributes][customer_id] uuid
The associated customer.
data[attributes][deposit_in_cents] integer
Deposit in cents.
data[attributes][mode] enum
Mode. checkout mode is reserved for checkout payments, not available for API.
One of: manual, off_session, request, terminal, capture.
data[attributes][order_id] uuid
The associated order.
data[attributes][payment_authorization_id] uuid
The authorization under which this charge is made.
data[attributes][payment_method_id] uuid
The payment method.
data[attributes][provider] enum
Provider.
One of: stripe, app, none.
data[attributes][provider_id] string
External provider payment identification.
data[attributes][provider_method] string
Provider payment method. Ex: credit_card, boleto, cash, bank, etc..
data[attributes][provider_secret] string
Provider payment secret.
data[attributes][redirect_url] string
Redirect URL to redirect to external payment provider.
data[attributes][status] enum
Status.
One of: created, started, action_required, processing, succeeded, failed, canceled, expired.
data[attributes][succeeded_at] datetime
When payment charge succeeded.

Includes

This request accepts the following includes:

order

customer

Payment methods

Re-usable payment methods stored on file.

Relationships

Name Description
customer Customer optional
The customer who owns this payment method. Becomes null after detaching a payment method.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
created_at datetime readonly
When the resource was created.
customer_id uuid readonly-after-create nullable
The customer who owns this payment method. Becomes null after detaching a payment method.
details hash readonly-after-create
Method details.
id uuid readonly
Primary key.
identifier string readonly-after-create
Provider identifier of the payment method.
label string readonly-after-create
Label of the payment method.
method_type string readonly-after-create
Provider method type.
provider enum readonly-after-create
Provider of the payment method.
One of: stripe, app, none.
status enum readonly
Payment method status. Payment method becomes ready after a successful charge.
One of: created, ready.
updated_at datetime readonly
When the resource was last updated.

List payment methods

How to fetch a list of payment methods:

  curl --get 'https://example.booqable.com/api/boomerang/payment_methods'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "eb25bad2-c1b1-45c1-8526-2085a293c457",
        "type": "payment_methods",
        "attributes": {
          "created_at": "2017-06-03T16:17:00.000000+00:00",
          "updated_at": "2017-06-03T16:17:00.000000+00:00",
          "label": "Visa XXX1234",
          "status": "created",
          "provider": "stripe",
          "identifier": "pm_1234567890",
          "method_type": null,
          "details": {},
          "customer_id": "b0815afc-9d5d-405b-8ef8-fd5373dad3e5"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/payment_methods

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[payment_methods]=created_at,updated_at,label
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
created_at datetime
eq, not_eq, gt, gte, lt, lte
customer_id uuid
eq, not_eq
id uuid
eq, not_eq
identifier string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
label 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
provider string_enum
eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request does not accept any includes

Create 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": "e1f17238-83d4-4660-8f3b-5e95b67094df",
             "label": "Test card"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "395900e5-12f7-4449-8212-a7dc4c52edf3",
      "type": "payment_methods",
      "attributes": {
        "created_at": "2019-01-15T14:37:00.000000+00:00",
        "updated_at": "2019-01-15T14:37:00.000000+00:00",
        "label": "Test card",
        "status": "created",
        "provider": "stripe",
        "identifier": "pm_123",
        "method_type": null,
        "details": {},
        "customer_id": "e1f17238-83d4-4660-8f3b-5e95b67094df"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/payment_methods

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[payment_methods]=created_at,updated_at,label

Request body

This request accepts the following body:

Name Description
data[attributes][customer_id] uuid
The customer who owns this payment method. Becomes null after detaching a payment method.
data[attributes][details] hash
Method details.
data[attributes][identifier] string
Provider identifier of the payment method.
data[attributes][label] string
Label of the payment method.
data[attributes][method_type] string
Provider method type.
data[attributes][provider] enum
Provider of the payment method.
One of: stripe, app, none.

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/116b5701-21a0-41af-8a36-ca8d5e8767d6'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "116b5701-21a0-41af-8a36-ca8d5e8767d6",
      "type": "payment_methods",
      "attributes": {
        "created_at": "2016-08-19T20:26:00.000000+00:00",
        "updated_at": "2016-08-19T20:26:00.000000+00:00",
        "label": "Visa XXX1234",
        "status": "created",
        "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 separated fields to include instead of the default fields. ?fields[payment_methods]=created_at,updated_at,label

Includes

This request does not accept any includes

Payment refunds

A PaymentRefund is a record of refund to the User that is used to track the refund status and details.

Relationships

Name Description
customer Customer required
The associated customer.
employee Employee required
The employee who issued this refund.
order Order required
The associated order.
payment_charge Payment charge required
The charge being refunded.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
amount_in_cents integer
Amount in cents.
canceled_at datetime readonly
When payment refund was canceled.
created_at datetime readonly
When the resource was created.
currency string
Currency.
customer_id uuid readonly-after-create
The associated customer.
deposit_in_cents integer
Deposit in cents.
description string
Description.
employee_id uuid readonly
The employee who issued this refund.
expired_at datetime readonly
When payment refund expired.
failed_at datetime readonly
When payment refund failed.
failure_reason string
Failure reason.
id uuid readonly
Primary key.
order_id uuid readonly-after-create
The associated order.
payment_charge_id uuid readonly-after-create
The charge being refunded.
possible_actions array readonly
Possible actions to be taken on the payment charge.
provider enum
Provider.
One of: stripe, app, none.
provider_id string
External provider refund identification.
provider_method string
Provider refund method. Ex: credit_card, boleto, cash, bank, etc...
provider_secret string
Provider refund secret.
reason string
Reason.
status enum
Status.
One of: created, pending, succeeded, failed, canceled, expired.
succeeded_at datetime
When payment refund succeeded.
total_in_cents integer readonly
Total amount in cents (amount + deposit).
updated_at datetime readonly
When the resource was last updated.

List payment refunds

How to fetch a list of payment refunds:

  curl --get 'https://example.booqable.com/api/boomerang/payment_refunds'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "7ea1a363-fc84-4e97-84fc-c02f561b6afd",
        "type": "payment_refunds",
        "attributes": {
          "created_at": "2022-07-28T01:00:00.000000+00:00",
          "updated_at": "2022-07-28T01:00:00.000000+00:00",
          "status": "created",
          "amount_in_cents": 100,
          "deposit_in_cents": 0,
          "total_in_cents": 100,
          "currency": "usd",
          "description": null,
          "failure_reason": null,
          "reason": null,
          "provider": "none",
          "provider_id": null,
          "provider_method": null,
          "provider_secret": null,
          "succeeded_at": null,
          "failed_at": null,
          "canceled_at": null,
          "expired_at": null,
          "possible_actions": [
            "cancel"
          ],
          "employee_id": null,
          "order_id": null,
          "customer_id": null,
          "payment_charge_id": null
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/payment_refunds

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[payment_refunds]=created_at,updated_at,status
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=order,customer
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
amount_in_cents integer
eq, not_eq, gt, gte, lt, lte
canceled_at datetime
eq, not_eq, gt, gte, lt, lte
created_at datetime
eq, not_eq, gt, gte, lt, lte
currency string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
customer_id uuid
eq, not_eq
deposit_in_cents integer
eq, not_eq, gt, gte, lt, lte
description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
employee_id uuid
eq, not_eq
expired_at datetime
eq, not_eq, gt, gte, lt, lte
failed_at datetime
eq, not_eq, gt, gte, lt, lte
failure_reason string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
id uuid
eq, not_eq
order_id uuid
eq, not_eq
payment_charge_id uuid
eq, not_eq
provider string_enum
eq
provider_id string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
provider_method string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
provider_secret string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
reason string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
status string_enum
eq
succeeded_at datetime
eq, not_eq, gt, gte, lt, lte
total_in_cents integer
eq, not_eq, gt, gte, lt, lte
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
amount_in_cents array
sum
deposit_in_cents array
sum
total array
count
total_in_cents array
sum

Includes

This request accepts the following includes:

order

customer

Fetch a payment refund

How to fetch a payment refund:

  curl --get 'https://example.booqable.com/api/boomerang/payment_refunds/4436dae4-b75e-4a33-8eea-f5f0cc97ba32'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "4436dae4-b75e-4a33-8eea-f5f0cc97ba32",
      "type": "payment_refunds",
      "attributes": {
        "created_at": "2017-01-02T10:29:00.000000+00:00",
        "updated_at": "2017-01-02T10:29:00.000000+00:00",
        "status": "created",
        "amount_in_cents": 100,
        "deposit_in_cents": 0,
        "total_in_cents": 100,
        "currency": "usd",
        "description": null,
        "failure_reason": null,
        "reason": null,
        "provider": "none",
        "provider_id": null,
        "provider_method": null,
        "provider_secret": null,
        "succeeded_at": null,
        "failed_at": null,
        "canceled_at": null,
        "expired_at": null,
        "possible_actions": [
          "cancel"
        ],
        "employee_id": null,
        "order_id": null,
        "customer_id": null,
        "payment_charge_id": null
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/payment_refunds/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[payment_refunds]=created_at,updated_at,status
include string
List of comma seperated relationships to sideload. ?include=order,customer

Includes

This request accepts the following includes:

order

customer

Create a payment refund

How to create a payment refund:

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/payment_refunds'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "payment_refunds",
           "attributes": {
             "provider": "none",
             "amount_in_cents": 10000,
             "deposit_in_cents": 5000
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "f7983fdf-6655-4adf-8ee8-12f3d3e51898",
      "type": "payment_refunds",
      "attributes": {
        "created_at": "2014-04-24T08:32:00.000000+00:00",
        "updated_at": "2014-04-24T08:32:00.000000+00:00",
        "status": "succeeded",
        "amount_in_cents": 10000,
        "deposit_in_cents": 5000,
        "total_in_cents": 15000,
        "currency": "usd",
        "description": null,
        "failure_reason": null,
        "reason": null,
        "provider": "none",
        "provider_id": null,
        "provider_method": null,
        "provider_secret": null,
        "succeeded_at": "2014-04-24T08:32:00.000000+00:00",
        "failed_at": null,
        "canceled_at": null,
        "expired_at": null,
        "possible_actions": [],
        "employee_id": "a169cc22-50a0-4bf6-8a15-1516035f6501",
        "order_id": null,
        "customer_id": null,
        "payment_charge_id": null
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/payment_refunds

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[payment_refunds]=created_at,updated_at,status
include string
List of comma seperated relationships to sideload. ?include=order,customer

Request body

This request accepts the following body:

Name Description
data[attributes][amount_in_cents] integer
Amount in cents.
data[attributes][currency] string
Currency.
data[attributes][customer_id] uuid
The associated customer.
data[attributes][deposit_in_cents] integer
Deposit in cents.
data[attributes][failure_reason] string
Failure reason.
data[attributes][order_id] uuid
The associated order.
data[attributes][payment_charge_id] uuid
The charge being refunded.
data[attributes][provider] enum
Provider.
One of: stripe, app, none.
data[attributes][provider_id] string
External provider refund identification.
data[attributes][provider_method] string
Provider refund method. Ex: credit_card, boleto, cash, bank, etc...
data[attributes][provider_secret] string
Provider refund secret.
data[attributes][reason] string
Reason.
data[attributes][status] enum
Status.
One of: created, pending, succeeded, failed, canceled, expired.
data[attributes][succeeded_at] datetime
When payment refund succeeded.

Includes

This request accepts the following includes:

order

customer

Update a payment refund

How to update a payment refund:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/payment_refunds/d296895a-e933-4609-8b59-6850e2d29497'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "d296895a-e933-4609-8b59-6850e2d29497",
           "type": "payment_refunds",
           "attributes": {
             "status": "succeeded"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "d296895a-e933-4609-8b59-6850e2d29497",
      "type": "payment_refunds",
      "attributes": {
        "created_at": "2020-11-02T14:47:07.000000+00:00",
        "updated_at": "2020-11-02T14:47:07.000000+00:00",
        "status": "succeeded",
        "amount_in_cents": 100,
        "deposit_in_cents": 0,
        "total_in_cents": 100,
        "currency": "usd",
        "description": null,
        "failure_reason": null,
        "reason": null,
        "provider": "none",
        "provider_id": null,
        "provider_method": null,
        "provider_secret": null,
        "succeeded_at": "2020-11-02T14:47:07.000000+00:00",
        "failed_at": null,
        "canceled_at": null,
        "expired_at": null,
        "possible_actions": [],
        "employee_id": null,
        "order_id": null,
        "customer_id": null,
        "payment_charge_id": null
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/payment_refunds/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[payment_refunds]=created_at,updated_at,status
include string
List of comma seperated relationships to sideload. ?include=order,customer

Request body

This request accepts the following body:

Name Description
data[attributes][amount_in_cents] integer
Amount in cents.
data[attributes][currency] string
Currency.
data[attributes][customer_id] uuid
The associated customer.
data[attributes][deposit_in_cents] integer
Deposit in cents.
data[attributes][failure_reason] string
Failure reason.
data[attributes][order_id] uuid
The associated order.
data[attributes][payment_charge_id] uuid
The charge being refunded.
data[attributes][provider] enum
Provider.
One of: stripe, app, none.
data[attributes][provider_id] string
External provider refund identification.
data[attributes][provider_method] string
Provider refund method. Ex: credit_card, boleto, cash, bank, etc...
data[attributes][provider_secret] string
Provider refund secret.
data[attributes][reason] string
Reason.
data[attributes][status] enum
Status.
One of: created, pending, succeeded, failed, canceled, expired.
data[attributes][succeeded_at] datetime
When payment refund succeeded.

Includes

This request accepts the following includes:

order

customer

Photos

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

Relationships

Name Description
owner Product group, Product, Bundle required
The thing pictured in this photo.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
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.
created_at datetime readonly
When the resource was created.
id uuid readonly
Primary key.
large_url string readonly
Url to large stored image (max 500x500).
original_url string readonly
Url to original stored image.
owner_id uuid
The thing pictured in this photo.
owner_type string
The resource type of the owner.
photo carrierwave_file
An object describing the photo.
photo_base64 string writeonly
Base64 encoded photo.
position integer
Which position the photo has in the album.
preview string readonly
Base64 encoded preview.
remote_photo_url string writeonly
Url to an image on the web.
updated_at datetime readonly
When the resource was last updated.
xlarge_url string readonly
Url to xlarge stored image (max 2000x2000).

List photos

How to fetch a list of photos:

  curl --get 'https://example.booqable.com/api/boomerang/photos'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "1ba0ace1-dcf6-4d18-8296-444c10c904b1",
        "type": "photos",
        "attributes": {
          "created_at": "2015-06-17T07:25:01.000000+00:00",
          "updated_at": "2015-06-17T07:25:01.000000+00:00",
          "original_url": "/uploads/84696b61e5664464f6ccb00e1fda1b0b/photo/photo/1ba0ace1-dcf6-4d18-8296-444c10c904b1/1736760418-948937306242249-0003-9034/upload.png",
          "large_url": "/uploads/84696b61e5664464f6ccb00e1fda1b0b/photo/photo/1ba0ace1-dcf6-4d18-8296-444c10c904b1/large_1736760418-948937306242249-0003-9034/upload.jpg",
          "xlarge_url": "/uploads/84696b61e5664464f6ccb00e1fda1b0b/photo/photo/1ba0ace1-dcf6-4d18-8296-444c10c904b1/xlarge_1736760418-948937306242249-0003-9034/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+kBDQkaOktlCWEAAAGRSURBVCjPNVIHVxYxENzb7F4+sCHNLk1RQVFQ7A1EARvYKKIiKNiwUKy/3pm9j7x395JMMmU3IlIUWiiGiKRCTS2JcKlAMDAXF3ETKZMkNyPKS/hwXLEhKblLhWigwelSp01g45XALOOCePxJTigQEDikcs4k9gpNajEVSinVchbhHIcKbNcaGsOtukMwTDCHljt27tq9p4Z8iRwW7KpZm/Y2t7S2te/brwDIKhFW5cDBQ4ePHO3o7OruqZzm0BU5drz3xMlTff2nzwycPUcPtCBZdHDo/IXhi5cuX7l67fqNm7dUk9FS1tsjo3fG7t4bn5i8/+Dho5bHU5pCR6efPH32/MXMLFZz8y8XXr1+swgLzPN2afnd+5XVUK59+Pjp85c11IrI12/ff6xXYc10Y3Pr5y+VMrz9/lPSOQsCgfLvP8Ylgqge3o2xWQ/84FjQJ60KrznXG1bgrOl287TeXq4Zx6LmxfZZIJDyDB3ja8laJuzyFURP8GpgghUnJRZsH42HHalaCwQ1dDbWLfF9+H+O8CGkTfhjrQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNS0wMS0xM1QwOToyNjo1OCswMDowMJdx7bYAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjUtMDEtMTNUMDk6MjY6NTgrMDA6MDDmLFUKAAAAAElFTkSuQmCC",
          "position": 1,
          "photo": {
            "url": "/uploads/84696b61e5664464f6ccb00e1fda1b0b/photo/photo/1ba0ace1-dcf6-4d18-8296-444c10c904b1/1736760418-948937306242249-0003-9034/upload.png"
          },
          "owner_id": "182cbf22-6a51-4729-81a3-190d3cbb3c57",
          "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 separated fields to include instead of the default fields. ?fields[photos]=created_at,updated_at,original_url
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
owner_id uuid
eq, not_eq
owner_type string
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request does not accept any includes

Fetch a photo

How to fetch a photo:

  curl --get 'https://example.booqable.com/api/boomerang/photos/93237a3f-2869-4ac3-8dbb-fabd864e9f81'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "93237a3f-2869-4ac3-8dbb-fabd864e9f81",
      "type": "photos",
      "attributes": {
        "created_at": "2022-08-01T02:59:00.000000+00:00",
        "updated_at": "2022-08-01T02:59:00.000000+00:00",
        "original_url": "/uploads/ed619234e7d3d43630945e706eff6913/photo/photo/93237a3f-2869-4ac3-8dbb-fabd864e9f81/1736760419-105361303531239-0004-1914/upload.png",
        "large_url": "/uploads/ed619234e7d3d43630945e706eff6913/photo/photo/93237a3f-2869-4ac3-8dbb-fabd864e9f81/large_1736760419-105361303531239-0004-1914/upload.jpg",
        "xlarge_url": "/uploads/ed619234e7d3d43630945e706eff6913/photo/photo/93237a3f-2869-4ac3-8dbb-fabd864e9f81/xlarge_1736760419-105361303531239-0004-1914/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+kBDQkaOzxiOfcAAAGRSURBVCjPNVIHVxYxENzb7F4+sCHNLk1RQVFQ7A1EARvYKKIiKNiwUKy/3pm9j7x395JMMmU3IlIUWiiGiKRCTS2JcKlAMDAXF3ETKZMkNyPKS/hwXLEhKblLhWigwelSp01g45XALOOCePxJTigQEDikcs4k9gpNajEVSinVchbhHIcKbNcaGsOtukMwTDCHljt27tq9p4Z8iRwW7KpZm/Y2t7S2te/brwDIKhFW5cDBQ4ePHO3o7OruqZzm0BU5drz3xMlTff2nzwycPUcPtCBZdHDo/IXhi5cuX7l67fqNm7dUk9FS1tsjo3fG7t4bn5i8/+Dho5bHU5pCR6efPH32/MXMLFZz8y8XXr1+swgLzPN2afnd+5XVUK59+Pjp85c11IrI12/ff6xXYc10Y3Pr5y+VMrz9/lPSOQsCgfLvP8Ylgqge3o2xWQ/84FjQJ60KrznXG1bgrOl287TeXq4Zx6LmxfZZIJDyDB3ja8laJuzyFURP8GpgghUnJRZsH42HHalaCwQ1dDbWLfF9+H+O8CGkTfhjrQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNS0wMS0xM1QwOToyNjo1OSswMDowMDEG5gIAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjUtMDEtMTNUMDk6MjY6NTkrMDA6MDBAW16+AAAAAElFTkSuQmCC",
        "position": 1,
        "photo": {
          "url": "/uploads/ed619234e7d3d43630945e706eff6913/photo/photo/93237a3f-2869-4ac3-8dbb-fabd864e9f81/1736760419-105361303531239-0004-1914/upload.png"
        },
        "owner_id": "850b4eb4-0a7a-4316-8eef-e66a40d0e055",
        "owner_type": "product_groups"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/photos/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[photos]=created_at,updated_at,original_url
include string
List of comma seperated relationships to sideload. ?include=owner

Includes

This request accepts the following includes:

owner

Create 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": "5ef74fb8-c1c9-47af-8fac-bcab35a7a867",
             "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": "a8eb63bc-693b-4335-865c-8dbf5462fc14",
      "type": "photos",
      "attributes": {
        "created_at": "2024-05-28T22:17:00.000000+00:00",
        "updated_at": "2024-05-28T22:17:00.000000+00:00",
        "original_url": "/uploads/354d68b26fcffd8f9a3c21cae0ba8d0d/photo/photo/a8eb63bc-693b-4335-865c-8dbf5462fc14/1736760420-243048457116738-0006-1612/upload.png",
        "large_url": "/uploads/354d68b26fcffd8f9a3c21cae0ba8d0d/photo/photo/a8eb63bc-693b-4335-865c-8dbf5462fc14/large_1736760420-243048457116738-0006-1612/upload.jpg",
        "xlarge_url": "/uploads/354d68b26fcffd8f9a3c21cae0ba8d0d/photo/photo/a8eb63bc-693b-4335-865c-8dbf5462fc14/xlarge_1736760420-243048457116738-0006-1612/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+kBDQkbAJRy4ZIAAAGRSURBVCjPNVIHVxYxENzb7F4+sCHNLk1RQVFQ7A1EARvYKKIiKNiwUKy/3pm9j7x395JMMmU3IlIUWiiGiKRCTS2JcKlAMDAXF3ETKZMkNyPKS/hwXLEhKblLhWigwelSp01g45XALOOCePxJTigQEDikcs4k9gpNajEVSinVchbhHIcKbNcaGsOtukMwTDCHljt27tq9p4Z8iRwW7KpZm/Y2t7S2te/brwDIKhFW5cDBQ4ePHO3o7OruqZzm0BU5drz3xMlTff2nzwycPUcPtCBZdHDo/IXhi5cuX7l67fqNm7dUk9FS1tsjo3fG7t4bn5i8/+Dho5bHU5pCR6efPH32/MXMLFZz8y8XXr1+swgLzPN2afnd+5XVUK59+Pjp85c11IrI12/ff6xXYc10Y3Pr5y+VMrz9/lPSOQsCgfLvP8Ylgqge3o2xWQ/84FjQJ60KrznXG1bgrOl287TeXq4Zx6LmxfZZIJDyDB3ja8laJuzyFURP8GpgghUnJRZsH42HHalaCwQ1dDbWLfF9+H+O8CGkTfhjrQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNS0wMS0xM1QwOToyNzowMCswMDowMAO8xosAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjUtMDEtMTNUMDk6Mjc6MDArMDA6MDBy4X43AAAAAElFTkSuQmCC",
        "position": 2,
        "photo": {
          "url": "/uploads/354d68b26fcffd8f9a3c21cae0ba8d0d/photo/photo/a8eb63bc-693b-4335-865c-8dbf5462fc14/1736760420-243048457116738-0006-1612/upload.png"
        },
        "owner_id": "5ef74fb8-c1c9-47af-8fac-bcab35a7a867",
        "owner_type": "product_groups"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/photos

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[photos]=created_at,updated_at,original_url
include string
List of comma seperated relationships to sideload. ?include=owner

Request body

This request accepts the following body:

Name Description
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][owner_id] uuid
The thing pictured in this photo.
data[attributes][owner_type] string
The resource type of the owner.
data[attributes][photo] carrierwave_file
An object describing the photo.
data[attributes][photo_base64] string
Base64 encoded photo.
data[attributes][position] integer
Which position the photo has in the album.
data[attributes][remote_photo_url] string
Url to an image on the web.

Includes

This request accepts the following includes:

owner

Update a photo

How to update a photo:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/photos/f25879e9-ea1c-4b0f-8cc7-9b2eb23b96c0'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "f25879e9-ea1c-4b0f-8cc7-9b2eb23b96c0",
           "type": "photos",
           "attributes": {
             "coordinates": {
               "x": 10,
               "y": 100
             }
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "f25879e9-ea1c-4b0f-8cc7-9b2eb23b96c0",
      "type": "photos",
      "attributes": {
        "created_at": "2024-12-16T09:31:00.000000+00:00",
        "updated_at": "2024-12-16T09:31:00.000000+00:00",
        "original_url": "/uploads/8188eebd3991392b266b288655dfde98/photo/photo/f25879e9-ea1c-4b0f-8cc7-9b2eb23b96c0/1736760421-698980998113944-0007-5720/upload.png",
        "large_url": "/uploads/8188eebd3991392b266b288655dfde98/photo/photo/f25879e9-ea1c-4b0f-8cc7-9b2eb23b96c0/large_1736760421-698980998113944-0007-5720/upload.jpg",
        "xlarge_url": "/uploads/8188eebd3991392b266b288655dfde98/photo/photo/f25879e9-ea1c-4b0f-8cc7-9b2eb23b96c0/xlarge_1736760421-698980998113944-0007-5720/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+kBDQkbAeN10QQAAAGRSURBVCjPNVIHVxYxENzb7F4+sCHNLk1RQVFQ7A1EARvYKKIiKNiwUKy/3pm9j7x395JMMmU3IlIUWiiGiKRCTS2JcKlAMDAXF3ETKZMkNyPKS/hwXLEhKblLhWigwelSp01g45XALOOCePxJTigQEDikcs4k9gpNajEVSinVchbhHIcKbNcaGsOtukMwTDCHljt27tq9p4Z8iRwW7KpZm/Y2t7S2te/brwDIKhFW5cDBQ4ePHO3o7OruqZzm0BU5drz3xMlTff2nzwycPUcPtCBZdHDo/IXhi5cuX7l67fqNm7dUk9FS1tsjo3fG7t4bn5i8/+Dho5bHU5pCR6efPH32/MXMLFZz8y8XXr1+swgLzPN2afnd+5XVUK59+Pjp85c11IrI12/ff6xXYc10Y3Pr5y+VMrz9/lPSOQsCgfLvP8Ylgqge3o2xWQ/84FjQJ60KrznXG1bgrOl287TeXq4Zx6LmxfZZIJDyDB3ja8laJuzyFURP8GpgghUnJRZsH42HHalaCwQ1dDbWLfF9+H+O8CGkTfhjrQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNS0wMS0xM1QwOToyNzowMSswMDowMKXLzT8AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjUtMDEtMTNUMDk6Mjc6MDErMDA6MDDUlnWDAAAAAElFTkSuQmCC",
        "position": 1,
        "photo": {
          "url": "/uploads/8188eebd3991392b266b288655dfde98/photo/photo/f25879e9-ea1c-4b0f-8cc7-9b2eb23b96c0/1736760421-698980998113944-0007-5720/upload.png"
        },
        "owner_id": "266622d8-4266-4054-8c2c-617ae1a4b11e",
        "owner_type": "product_groups"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/photos/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[photos]=created_at,updated_at,original_url
include string
List of comma seperated relationships to sideload. ?include=owner

Request body

This request accepts the following body:

Name Description
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][owner_id] uuid
The thing pictured in this photo.
data[attributes][owner_type] string
The resource type of the owner.
data[attributes][photo] carrierwave_file
An object describing the photo.
data[attributes][photo_base64] string
Base64 encoded photo.
data[attributes][position] integer
Which position the photo has in the album.
data[attributes][remote_photo_url] string
Url to an image on the web.

Includes

This request accepts the following includes:

owner

Delete a photo

How to delete a photo:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/photos/d9aa6a55-20cb-4b4e-8dc1-b546e4d3abf0'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "d9aa6a55-20cb-4b4e-8dc1-b546e4d3abf0",
      "type": "photos",
      "attributes": {
        "created_at": "2025-11-22T09:49:03.000000+00:00",
        "updated_at": "2025-11-22T09:49:03.000000+00:00",
        "original_url": "/uploads/5e3caf7997ce0b0563ffc6e824afbe2a/photo/photo/d9aa6a55-20cb-4b4e-8dc1-b546e4d3abf0/1736760421-812703449393376-0008-2844/upload.png",
        "large_url": "/uploads/5e3caf7997ce0b0563ffc6e824afbe2a/photo/photo/d9aa6a55-20cb-4b4e-8dc1-b546e4d3abf0/large_1736760421-812703449393376-0008-2844/upload.jpg",
        "xlarge_url": "/uploads/5e3caf7997ce0b0563ffc6e824afbe2a/photo/photo/d9aa6a55-20cb-4b4e-8dc1-b546e4d3abf0/xlarge_1736760421-812703449393376-0008-2844/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+kBDQkbAeN10QQAAAGRSURBVCjPNVIHVxYxENzb7F4+sCHNLk1RQVFQ7A1EARvYKKIiKNiwUKy/3pm9j7x395JMMmU3IlIUWiiGiKRCTS2JcKlAMDAXF3ETKZMkNyPKS/hwXLEhKblLhWigwelSp01g45XALOOCePxJTigQEDikcs4k9gpNajEVSinVchbhHIcKbNcaGsOtukMwTDCHljt27tq9p4Z8iRwW7KpZm/Y2t7S2te/brwDIKhFW5cDBQ4ePHO3o7OruqZzm0BU5drz3xMlTff2nzwycPUcPtCBZdHDo/IXhi5cuX7l67fqNm7dUk9FS1tsjo3fG7t4bn5i8/+Dho5bHU5pCR6efPH32/MXMLFZz8y8XXr1+swgLzPN2afnd+5XVUK59+Pjp85c11IrI12/ff6xXYc10Y3Pr5y+VMrz9/lPSOQsCgfLvP8Ylgqge3o2xWQ/84FjQJ60KrznXG1bgrOl287TeXq4Zx6LmxfZZIJDyDB3ja8laJuzyFURP8GpgghUnJRZsH42HHalaCwQ1dDbWLfF9+H+O8CGkTfhjrQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNS0wMS0xM1QwOToyNzowMSswMDowMKXLzT8AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjUtMDEtMTNUMDk6Mjc6MDErMDA6MDDUlnWDAAAAAElFTkSuQmCC",
        "position": 1,
        "photo": {
          "url": "/uploads/5e3caf7997ce0b0563ffc6e824afbe2a/photo/photo/d9aa6a55-20cb-4b4e-8dc1-b546e4d3abf0/1736760421-812703449393376-0008-2844/upload.png"
        },
        "owner_id": "98ee3afa-9bdc-4ccd-850a-61157c8e2a39",
        "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 separated fields to include instead of the default fields. ?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. The Item can either be a Product or a Bundle. Plannings 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.

Relationships

Name Description
item Item required
The product or Bundle that was booked.
nested_plannings Plannings hasmany
When item is a Bundle, then there is a nested_planning that corresponds for each BundleItem.
order Order required
The Order this planning belongs to.
order_line Line optional
The Line which holds financial information for this planning.
parent_planning Planning required
When present, then this Planning is part of a Bundle, and corresponds to a BundleItem. Inverse of nested_plannings relation.
start_location Location required
The Location where the Customer will pick up the Item.
stock_item_plannings Stock item plannings hasmany
The StockItems specified for this Planning, and their current status.
The number ot StockItemPlannings can be less than planning.quantity.
stop_location Location required
The Location where the Customer will return the Item.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
archived boolean readonly
Whether planning is archived.
archived_at datetime readonly nullable
When the planning was archived.
created_at datetime readonly
When the resource was created.
id uuid readonly
Primary key.
item_id uuid
The product or Bundle that was booked.
item_name string writeonly
Allows sorting plannings by item name.
location_shortage_amount integer
Amount of items short. This attribute is omitted when this is a parent planning for a Bundle.
order_id uuid
The Order this planning belongs to.
order_number integer writeonly
Allows sorting plannings by order number.
parent_planning_id uuid
When present, then this Planning is part of a Bundle, and corresponds to a BundleItem. Inverse of nested_plannings relation.
quantity integer
Total planned.
reserved boolean
Wheter items are reserved.
reserved_from datetime
When the items become unavailable.
reserved_till datetime
When the items become available again.
shortage_amount integer
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.
start_location_id uuid
The Location where the Customer will pick up the Item.
started integer
Amount of items started. Cannot exceed quantity. This attribute is omitted when this is a parent planning for a Bundle.
starts_at datetime
When the start action is planned.
stop_location_id uuid
The Location where the Customer will return the Item.
stopped integer
Amount of items stopped. Cannot exceed quantity and started. This attribute is omitted when this is a parent planning for a Bundle.
stops_at datetime
When the stop action is planned.
updated_at datetime readonly
When the resource was last updated.

List plannings

How to fetch a list of plannings:

  curl --get 'https://example.booqable.com/api/boomerang/plannings'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "61b93896-5b57-455e-84fe-39f48ce6f4ab",
        "type": "plannings",
        "attributes": {
          "created_at": "2018-03-21T05:17:00.000000+00:00",
          "updated_at": "2018-03-21T05:17:00.000000+00:00",
          "archived": false,
          "archived_at": null,
          "quantity": 1,
          "starts_at": "1973-06-07T07:50:00.000000+00:00",
          "stops_at": "1973-07-07T07:50:00.000000+00:00",
          "reserved_from": "1973-06-07T07:50:00.000000+00:00",
          "reserved_till": "1973-07-07T07:50:00.000000+00:00",
          "reserved": true,
          "started": 0,
          "stopped": 0,
          "location_shortage_amount": 0,
          "shortage_amount": 0,
          "order_id": "ead6ad3f-bdc9-47c1-86d3-7f825d8f0769",
          "item_id": "bc366da1-7df4-4bc5-846b-8d94a52be19b",
          "start_location_id": "91d91031-83d2-483b-8d80-12ce62a11b4f",
          "stop_location_id": "91d91031-83d2-483b-8d80-12ce62a11b4f",
          "parent_planning_id": null
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/plannings

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[plannings]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=order,item,order_line
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
item_id uuid
eq, not_eq
item_type string
eq, not_eq
location_shortage_amount integer
eq, not_eq, gt, gte, lt, lte
order_id uuid
eq, not_eq
parent_planning_id uuid
eq, not_eq
product_type string
eq, not_eq
q string
eq
quantity integer
eq, not_eq, gt, gte, lt, lte
reserved boolean
eq
reserved_from datetime
eq, not_eq, gt, gte, lt, lte
reserved_till datetime
eq, not_eq, gt, gte, lt, lte
shortage_amount integer
eq, not_eq, gt, gte, lt, lte
start_location_id uuid
eq, not_eq
started integer
eq, not_eq, gt, gte, lt, lte
starts_at datetime
eq, not_eq, gt, gte, lt, lte
stop_location_id uuid
eq, not_eq
stopped integer
eq, not_eq, gt, gte, lt, lte
stops_at datetime
eq, not_eq, gt, gte, lt, lte
updated_at datetime
eq, not_eq, gt, gte, lt, lte

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

Search 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": "2025-01-14T09:27:08Z"
                     }
                   },
                   {
                     "starts_at": {
                       "lte": "2025-01-17T09:27:08Z"
                     }
                   }
                 ]
               },
               {
                 "operator": "and",
                 "attributes": [
                   {
                     "stops_at": {
                       "gte": "2025-01-14T09:27:08Z"
                     }
                   },
                   {
                     "stops_at": {
                       "lte": "2025-01-17T09:27:08Z"
                     }
                   }
                 ]
               }
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "b256e1d6-5a03-4c89-8561-d96d00867c8b"
      },
      {
        "id": "68589e0b-87d0-47f5-81fc-bc562e69965d"
      }
    ]
  }

HTTP Request

POST api/boomerang/plannings/search

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[plannings]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=order,item,order_line
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
item_id uuid
eq, not_eq
item_type string
eq, not_eq
location_shortage_amount integer
eq, not_eq, gt, gte, lt, lte
order_id uuid
eq, not_eq
parent_planning_id uuid
eq, not_eq
product_type string
eq, not_eq
q string
eq
quantity integer
eq, not_eq, gt, gte, lt, lte
reserved boolean
eq
reserved_from datetime
eq, not_eq, gt, gte, lt, lte
reserved_till datetime
eq, not_eq, gt, gte, lt, lte
shortage_amount integer
eq, not_eq, gt, gte, lt, lte
start_location_id uuid
eq, not_eq
started integer
eq, not_eq, gt, gte, lt, lte
starts_at datetime
eq, not_eq, gt, gte, lt, lte
stop_location_id uuid
eq, not_eq
stopped integer
eq, not_eq, gt, gte, lt, lte
stops_at datetime
eq, not_eq, gt, gte, lt, lte
updated_at datetime
eq, not_eq, gt, gte, lt, lte

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

Fetch a planning

How to fetch a planning:

  curl --get 'https://example.booqable.com/api/boomerang/plannings/7ab088ea-e88a-4452-8ab3-d8593ea31603'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "7ab088ea-e88a-4452-8ab3-d8593ea31603",
      "type": "plannings",
      "attributes": {
        "created_at": "2023-04-14T01:42:01.000000+00:00",
        "updated_at": "2023-04-14T01:42:01.000000+00:00",
        "archived": false,
        "archived_at": null,
        "quantity": 1,
        "starts_at": "1978-07-01T04:15:01.000000+00:00",
        "stops_at": "1978-07-31T04:15:01.000000+00:00",
        "reserved_from": "1978-07-01T04:15:01.000000+00:00",
        "reserved_till": "1978-07-31T04:15:01.000000+00:00",
        "reserved": true,
        "started": 0,
        "stopped": 0,
        "location_shortage_amount": 0,
        "shortage_amount": 0,
        "order_id": "73a043aa-a655-48a0-8936-f1c8ded729d7",
        "item_id": "ab4d2f98-31a4-4d84-8750-a8b3c4408a4a",
        "start_location_id": "090a3ed2-c86a-468d-8d55-d59c162f9276",
        "stop_location_id": "090a3ed2-c86a-468d-8d55-d59c162f9276",
        "parent_planning_id": null
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/plannings/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[plannings]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=order,item,order_line

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:

Relationships

Name Description
price_ruleset Price ruleset required
The advanced pricing ruleset this rule is part of.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
adjustment_strategy enum
Determines wether a price rule adjusts prices by percentage or exact cent ammounts.
One of: percentage, charge.
charge boolean
Determines effect of rules using charge attribute.
created_at datetime readonly
When the resource was created.
from datetime
Defines start 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.
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.
id uuid readonly
Primary key.
match_strategy enum
Determines how dates are matched to the rule.
One of: starts_within, stops_within, overlap, span, within.
max_duration integer
Rule will only be applied when order period is smaller than max duration in seconds.
min_duration integer
Rule will only be applied when order period is greater than min duration in seconds.
name string
Name of the rule.
price_ruleset_id uuid readonly-after-create
Which ruleset this rule belongs to.
rule_type enum
Determines rule behaviour.
One of: range_of_days, range_of_dates, exclude_date_range, exclude_week_days, pickup_day, return_day.
stacked boolean
If a ruleset consists of multiple rules that adjust the product price, determines if rule should interact with other rules.
till datetime
Defines end of period, used by range_of_dates rule type.
till_day integer
Defines end of period in weekdays, 0 is monday, used by range_of_days rule type.
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.
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.
updated_at datetime readonly
When the resource was last updated.
value float
Adjustment value in percent.

Create 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": "7d2b2786-70ba-41b4-82cc-05cbe8cacb34",
             "name": "Off season",
             "rule_type": "range_of_dates",
             "match_strategy": "span",
             "value": 25,
             "from": "2014-12-05T04:39:00.000000+00:00",
             "till": "2015-02-05T04:39:00.000000+00:00"
           }
         },
         "include": "price_rules"
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "496355f5-1c79-4b05-86e8-fb9f00c27d78",
      "type": "price_rules",
      "attributes": {
        "created_at": "2015-01-05T04:39:00.000000+00:00",
        "updated_at": "2015-01-05T04:39:00.000000+00:00",
        "name": "Off season",
        "rule_type": "range_of_dates",
        "match_strategy": "span",
        "adjustment_strategy": "percentage",
        "value": 25.0,
        "from": "2014-12-05T04:39:00.000000+00:00",
        "till": "2015-02-05T04:39: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": "7d2b2786-70ba-41b4-82cc-05cbe8cacb34"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/price_rules

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[price_rules]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=price_ruleset

Request body

This request accepts the following body:

Name Description
data[attributes][adjustment_strategy] enum
Determines wether a price rule adjusts prices by percentage or exact cent ammounts.
One of: percentage, charge.
data[attributes][charge] boolean
Determines effect of rules using charge attribute.
data[attributes][from] datetime
Defines start 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][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][match_strategy] enum
Determines how dates are matched to the rule.
One of: starts_within, stops_within, overlap, span, within.
data[attributes][max_duration] integer
Rule will only be applied when order period is smaller than max duration in seconds.
data[attributes][min_duration] integer
Rule will only be applied when order period is greater than min duration in seconds.
data[attributes][name] string
Name of the rule.
data[attributes][price_ruleset_id] uuid
Which ruleset this rule belongs to.
data[attributes][rule_type] enum
Determines rule behaviour.
One of: range_of_days, range_of_dates, exclude_date_range, exclude_week_days, pickup_day, return_day.
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][till] datetime
Defines end of period, used by range_of_dates 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][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][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][value] float
Adjustment value in percent.

Includes

This request accepts the following includes:

price_ruleset => price_rules

Update a price rule

How to update a price rule:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/price_rules/03a98195-fad9-4128-8b3d-f8fca9458b1e'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "03a98195-fad9-4128-8b3d-f8fca9458b1e",
           "type": "price_rules",
           "attributes": {
             "value": 10
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "03a98195-fad9-4128-8b3d-f8fca9458b1e",
      "type": "price_rules",
      "attributes": {
        "created_at": "2022-06-25T00:41:07.000000+00:00",
        "updated_at": "2022-06-25T00:41:07.000000+00:00",
        "name": "Holidays",
        "rule_type": "range_of_dates",
        "match_strategy": "span",
        "adjustment_strategy": "percentage",
        "value": 10.0,
        "from": "2028-05-11T15:14:07.000000+00:00",
        "till": "2028-07-11T15:14:07.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": "8a88d3b1-8d95-45c3-8d9c-37f4189f8e18"
      },
      "relationships": {}
    },
    "meta": {}
  }

Updating a price rule:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/price_rules/ad06b6c5-c179-4a32-8260-11b998f79946'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "ad06b6c5-c179-4a32-8260-11b998f79946",
           "type": "price_rules",
           "attributes": {
             "id": "ad06b6c5-c179-4a32-8260-11b998f79946",
             "name": "Off season"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "ad06b6c5-c179-4a32-8260-11b998f79946",
      "type": "price_rules",
      "attributes": {
        "created_at": "2020-09-12T03:59:01.000000+00:00",
        "updated_at": "2020-09-12T03:59:01.000000+00:00",
        "name": "Off season",
        "rule_type": "range_of_dates",
        "match_strategy": "span",
        "adjustment_strategy": "percentage",
        "value": 5.0,
        "from": "2026-07-30T18:32:01.000000+00:00",
        "till": "2026-09-29T18:32:01.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": "da082b15-8901-48df-8450-683f48eb006e"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/price_rules/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[price_rules]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=price_ruleset

Request body

This request accepts the following body:

Name Description
data[attributes][adjustment_strategy] enum
Determines wether a price rule adjusts prices by percentage or exact cent ammounts.
One of: percentage, charge.
data[attributes][charge] boolean
Determines effect of rules using charge attribute.
data[attributes][from] datetime
Defines start 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][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][match_strategy] enum
Determines how dates are matched to the rule.
One of: starts_within, stops_within, overlap, span, within.
data[attributes][max_duration] integer
Rule will only be applied when order period is smaller than max duration in seconds.
data[attributes][min_duration] integer
Rule will only be applied when order period is greater than min duration in seconds.
data[attributes][name] string
Name of the rule.
data[attributes][price_ruleset_id] uuid
Which ruleset this rule belongs to.
data[attributes][rule_type] enum
Determines rule behaviour.
One of: range_of_days, range_of_dates, exclude_date_range, exclude_week_days, pickup_day, return_day.
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][till] datetime
Defines end of period, used by range_of_dates 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][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][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][value] float
Adjustment value in percent.

Includes

This request accepts the following includes:

price_ruleset => price_rules

Archive a price rule

How to archive a price ruleset:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/price_rules/dcba05ea-7016-4ed4-8034-a823d01f4d26'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "dcba05ea-7016-4ed4-8034-a823d01f4d26",
      "type": "price_rules",
      "attributes": {
        "created_at": "2020-12-18T05:52:07.000000+00:00",
        "updated_at": "2020-12-18T05:52:07.000000+00:00",
        "name": "Holidays",
        "rule_type": "range_of_dates",
        "match_strategy": "span",
        "adjustment_strategy": "percentage",
        "value": 5.0,
        "from": "2026-11-04T20:25:07.000000+00:00",
        "till": "2027-01-04T20:25:07.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": "0f77bbbc-4358-4a67-85a9-ca319b75a498"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

DELETE /api/boomerang/price_rules/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[price_rules]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=price_ruleset

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.

Relationships

Name Description
price_rules Price rules hasmany
The rules included in this ruleset.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

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

List price rulesets

How to fetch price rulesets:

  curl --get 'https://example.booqable.com/api/boomerang/price_rulesets'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "c218f45f-5f3f-4800-8f10-4d3ad173bd93",
        "type": "price_rulesets",
        "attributes": {
          "created_at": "2023-11-03T10:09:00.000000+00:00",
          "updated_at": "2023-11-03T10:09:00.000000+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 separated fields to include instead of the default fields. ?fields[price_rulesets]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
price_rules_attributes array
eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request does not accept any includes

Fetch a price ruleset

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

  curl --get 'https://example.booqable.com/api/boomerang/price_rulesets/ca85320f-4ffc-496c-855e-77a3d0f4a40a'
       --header 'content-type: application/json'
       --data-urlencode 'include=price_rules'

A 200 status response looks like this:

  {
    "data": {
      "id": "ca85320f-4ffc-496c-855e-77a3d0f4a40a",
      "type": "price_rulesets",
      "attributes": {
        "created_at": "2027-04-22T08:54:05.000000+00:00",
        "updated_at": "2027-04-22T08:54:05.000000+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Ruleset",
        "description": null
      },
      "relationships": {
        "price_rules": {
          "data": [
            {
              "type": "price_rules",
              "id": "e80760ba-0d09-4a88-878f-b2f2dfd3ad73"
            }
          ]
        }
      }
    },
    "included": [
      {
        "id": "e80760ba-0d09-4a88-878f-b2f2dfd3ad73",
        "type": "price_rules",
        "attributes": {
          "created_at": "2027-04-22T08:54:05.000000+00:00",
          "updated_at": "2027-04-22T08:54:05.000000+00:00",
          "name": "Price rule",
          "rule_type": "range_of_dates",
          "match_strategy": "span",
          "adjustment_strategy": "percentage",
          "value": 30.0,
          "from": "2032-10-06T23:27:05.000000+00:00",
          "till": "2032-12-06T23:27:05.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": "ca85320f-4ffc-496c-855e-77a3d0f4a40a"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/price_rulesets/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[price_rulesets]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=price_rules

Includes

This request accepts the following includes:

price_rules

Create 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": "2014-09-24T15:02:01.000000+00:00",
                 "till": "2014-11-25T15:02:01.000000+00:00"
               }
             ]
           }
         },
         "include": "price_rules"
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "e4fe0b61-208f-4525-8281-39ceec698804",
      "type": "price_rulesets",
      "attributes": {
        "created_at": "2014-10-25T15:02:01.000000+00:00",
        "updated_at": "2014-10-25T15:02:01.000000+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Seasonal ruleset",
        "description": null
      },
      "relationships": {
        "price_rules": {
          "data": [
            {
              "type": "price_rules",
              "id": "fe521f82-f68d-479c-843d-7420dbcf18ae"
            }
          ]
        }
      }
    },
    "included": [
      {
        "id": "fe521f82-f68d-479c-843d-7420dbcf18ae",
        "type": "price_rules",
        "attributes": {
          "created_at": "2014-10-25T15:02:01.000000+00:00",
          "updated_at": "2014-10-25T15:02:01.000000+00:00",
          "name": "Off season",
          "rule_type": "range_of_dates",
          "match_strategy": "span",
          "adjustment_strategy": "percentage",
          "value": 25.0,
          "from": "2014-09-24T15:02:01.000000+00:00",
          "till": "2014-11-25T15:02:01.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": "e4fe0b61-208f-4525-8281-39ceec698804"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

POST /api/boomerang/price_rulesets

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[price_rulesets]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=price_rules

Request body

This request accepts the following body:

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

Includes

This request accepts the following includes:

price_rules

Update a price ruleset

How to update a price ruleset:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/price_rulesets/f45fa6ef-5ccc-4a37-89b6-5701c9c8f77b'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "f45fa6ef-5ccc-4a37-89b6-5701c9c8f77b",
           "type": "price_rulesets",
           "attributes": {
             "name": "Seasonal ruleset (old)"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "f45fa6ef-5ccc-4a37-89b6-5701c9c8f77b",
      "type": "price_rulesets",
      "attributes": {
        "created_at": "2016-01-18T12:44:00.000000+00:00",
        "updated_at": "2016-01-18T12:44:00.000000+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/8fdd2e80-1ce2-4bf8-8e01-df9e6925b595'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "8fdd2e80-1ce2-4bf8-8e01-df9e6925b595",
           "type": "price_rulesets",
           "attributes": {
             "price_rules_attributes": [
               {
                 "id": "ab3f8794-7809-432e-8619-556bc2224ad3",
                 "name": "Off season"
               }
             ]
           }
         },
         "include": "price_rules"
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "8fdd2e80-1ce2-4bf8-8e01-df9e6925b595",
      "type": "price_rulesets",
      "attributes": {
        "created_at": "2023-09-01T22:07:00.000000+00:00",
        "updated_at": "2023-09-01T22:07:00.000000+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Ruleset",
        "description": null
      },
      "relationships": {
        "price_rules": {
          "data": [
            {
              "type": "price_rules",
              "id": "ab3f8794-7809-432e-8619-556bc2224ad3"
            }
          ]
        }
      }
    },
    "included": [
      {
        "id": "ab3f8794-7809-432e-8619-556bc2224ad3",
        "type": "price_rules",
        "attributes": {
          "created_at": "2023-09-01T22:07:00.000000+00:00",
          "updated_at": "2023-09-01T22:07:00.000000+00:00",
          "name": "Off season",
          "rule_type": "range_of_dates",
          "match_strategy": "span",
          "adjustment_strategy": "percentage",
          "value": 30.0,
          "from": "2029-02-16T12:40:00.000000+00:00",
          "till": "2029-04-18T12:40: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": "8fdd2e80-1ce2-4bf8-8e01-df9e6925b595"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/price_rulesets/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[price_rulesets]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=price_rules

Request body

This request accepts the following body:

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

Includes

This request accepts the following includes:

price_rules

Archive a price ruleset

How to archive a price ruleset:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/price_rulesets/dcba05ea-7016-4ed4-8034-a823d01f4d26'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "dcba05ea-7016-4ed4-8034-a823d01f4d26",
      "type": "price_rulesets",
      "attributes": {
        "created_at": "2020-12-18T05:52:07.000000+00:00",
        "updated_at": "2020-12-18T05:52:07.000000+00:00",
        "archived": true,
        "archived_at": "2020-12-18T05:52:07.000000+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 separated fields to include instead of the default fields. ?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 the price type of a product group is set to private_structure.

Relationships

Name Description
price_tiles Price tiles hasmany
The tiles (or tiers) within this price structure.
Tiles can be created/updated through the PriceStructure resource by writing the price_tiles_attributes attribute.
product_group Product group required
The product group for private price structures.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
archived boolean readonly
Whether price structure is archived.
archived_at datetime readonly
When the price structure was archived.
created_at datetime readonly
When the resource was created.
day float
Multiplier for every day outside of its tiles.
hour float
Multiplier for every hour outside of its tiles.
id uuid readonly
Primary key.
month float
Multiplier for every month outside of its tiles.
name string
Name of the structure.
price_structure_type enum readonly
Type.
One of: reusable, private.
price_tiles_attributes array writeonly
The price tiles to associate.
product_group_id uuid readonly
The product group for private price structures.
updated_at datetime readonly
When the resource was last updated.
week float
Multiplier for every week outside of its tiles.
year float
Multiplier for every year outside of its tiles.

List price structures

How to fetch a list of price structures:

  curl --get 'https://example.booqable.com/api/boomerang/price_structures'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "ec8cd116-78dd-4aa2-8794-723225fb7f27",
        "type": "price_structures",
        "attributes": {
          "created_at": "2027-12-25T18:39:02.000000+00:00",
          "updated_at": "2027-12-25T18:39:02.000000+00:00",
          "archived": false,
          "archived_at": null,
          "name": "Price per hour (3 hours minimum)",
          "price_structure_type": "reusable",
          "hour": 1.0,
          "day": 0.0,
          "week": 0.0,
          "month": 0.0,
          "year": 0.0,
          "product_group_id": null
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/price_structures

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[price_structures]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
archived boolean
eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
price_structure_type string_enum
eq, not_eq
product_group_id uuid
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request does not accept any includes

Fetch a price structure

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

  curl --get 'https://example.booqable.com/api/boomerang/price_structures/1eefd0fa-08d5-4e02-8267-c2db07cb35a0'
       --header 'content-type: application/json'
       --data-urlencode 'include=price_tiles'

A 200 status response looks like this:

  {
    "data": {
      "id": "1eefd0fa-08d5-4e02-8267-c2db07cb35a0",
      "type": "price_structures",
      "attributes": {
        "created_at": "2021-07-22T04:14:00.000000+00:00",
        "updated_at": "2021-07-22T04:14:00.000000+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Price per hour (3 hours minimum)",
        "price_structure_type": "reusable",
        "hour": 1.0,
        "day": 0.0,
        "week": 0.0,
        "month": 0.0,
        "year": 0.0,
        "product_group_id": null
      },
      "relationships": {
        "price_tiles": {
          "data": [
            {
              "type": "price_tiles",
              "id": "f4b52aba-05ab-4ad3-8b2f-814b68c688cd"
            }
          ]
        }
      }
    },
    "included": [
      {
        "id": "f4b52aba-05ab-4ad3-8b2f-814b68c688cd",
        "type": "price_tiles",
        "attributes": {
          "created_at": "2021-07-22T04:14:00.000000+00:00",
          "updated_at": "2021-07-22T04:14:00.000000+00:00",
          "name": "3 hours",
          "quantity": 3,
          "length": 10800,
          "multiplier": 1.0,
          "period": "hours",
          "price_structure_id": "1eefd0fa-08d5-4e02-8267-c2db07cb35a0"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/price_structures/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[price_structures]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=price_tiles

Includes

This request accepts the following includes:

price_tiles

Create 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": "135630ff-fb4a-4bbb-8e04-85d256658648",
      "type": "price_structures",
      "attributes": {
        "created_at": "2017-09-22T05:03:01.000000+00:00",
        "updated_at": "2017-09-22T05:03:01.000000+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Price per hour (3 hours minimum)",
        "price_structure_type": "reusable",
        "hour": 1.0,
        "day": 0.0,
        "week": 0.0,
        "month": 0.0,
        "year": 0.0,
        "product_group_id": null
      },
      "relationships": {
        "price_tiles": {
          "data": [
            {
              "type": "price_tiles",
              "id": "c49c9747-d7b5-4faf-8042-f0fc3dcd5706"
            }
          ]
        }
      }
    },
    "included": [
      {
        "id": "c49c9747-d7b5-4faf-8042-f0fc3dcd5706",
        "type": "price_tiles",
        "attributes": {
          "created_at": "2017-09-22T05:03:01.000000+00:00",
          "updated_at": "2017-09-22T05:03:01.000000+00:00",
          "name": "3 hours",
          "quantity": 3,
          "length": 10800,
          "multiplier": 1.0,
          "period": "hours",
          "price_structure_id": "135630ff-fb4a-4bbb-8e04-85d256658648"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

POST /api/boomerang/price_structures

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[price_structures]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=price_tiles

Request body

This request accepts the following body:

Name Description
data[attributes][day] float
Multiplier for every day outside of its tiles.
data[attributes][hour] float
Multiplier for every hour outside of its tiles.
data[attributes][month] float
Multiplier for every month outside of its tiles.
data[attributes][name] string
Name of the structure.
data[attributes][price_tiles_attributes][] array
The price tiles to associate.
data[attributes][week] float
Multiplier for every week 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

Update a price structure

How to update a price structure with price tiles:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/price_structures/bbc6913e-a6dd-4ab4-8c78-a004643a9cad'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "bbc6913e-a6dd-4ab4-8c78-a004643a9cad",
           "type": "price_structures",
           "attributes": {
             "name": "Charge per week (cut-rate > 3 weeks)",
             "price_tiles_attributes": [
               {
                 "id": "514b2a51-5961-411f-8000-e4712f4024df",
                 "name": "1 semana"
               },
               {
                 "id": "9d9034c8-9bcf-4c35-831c-93c082af2305",
                 "name": "2 semanas"
               },
               {
                 "id": "c08789b9-93ca-475f-83d1-6868f2d3602f",
                 "name": "3 semanas"
               },
               {
                 "id": "69e2abc5-8433-4b13-871c-1141dd30c453",
                 "_destroy": true
               }
             ]
           }
         },
         "include": "price_tiles"
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "bbc6913e-a6dd-4ab4-8c78-a004643a9cad",
      "type": "price_structures",
      "attributes": {
        "created_at": "2026-07-21T11:43:00.000000+00:00",
        "updated_at": "2026-07-21T11:43:00.000000+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Charge per week (cut-rate > 3 weeks)",
        "price_structure_type": "reusable",
        "hour": 0.0,
        "day": 0.0,
        "week": 0.8,
        "month": 0.0,
        "year": 0.0,
        "product_group_id": null
      },
      "relationships": {
        "price_tiles": {
          "data": [
            {
              "type": "price_tiles",
              "id": "514b2a51-5961-411f-8000-e4712f4024df"
            },
            {
              "type": "price_tiles",
              "id": "9d9034c8-9bcf-4c35-831c-93c082af2305"
            },
            {
              "type": "price_tiles",
              "id": "c08789b9-93ca-475f-83d1-6868f2d3602f"
            }
          ]
        }
      }
    },
    "included": [
      {
        "id": "514b2a51-5961-411f-8000-e4712f4024df",
        "type": "price_tiles",
        "attributes": {
          "created_at": "2026-07-21T11:43:00.000000+00:00",
          "updated_at": "2026-07-21T11:43:00.000000+00:00",
          "name": "1 semana",
          "quantity": 1,
          "length": 604800,
          "multiplier": 1.0,
          "period": "weeks",
          "price_structure_id": "bbc6913e-a6dd-4ab4-8c78-a004643a9cad"
        },
        "relationships": {}
      },
      {
        "id": "9d9034c8-9bcf-4c35-831c-93c082af2305",
        "type": "price_tiles",
        "attributes": {
          "created_at": "2026-07-21T11:43:00.000000+00:00",
          "updated_at": "2026-07-21T11:43:00.000000+00:00",
          "name": "2 semanas",
          "quantity": 2,
          "length": 1209600,
          "multiplier": 2.0,
          "period": "weeks",
          "price_structure_id": "bbc6913e-a6dd-4ab4-8c78-a004643a9cad"
        },
        "relationships": {}
      },
      {
        "id": "c08789b9-93ca-475f-83d1-6868f2d3602f",
        "type": "price_tiles",
        "attributes": {
          "created_at": "2026-07-21T11:43:00.000000+00:00",
          "updated_at": "2026-07-21T11:43:00.000000+00:00",
          "name": "3 semanas",
          "quantity": 3,
          "length": 1814400,
          "multiplier": 3.0,
          "period": "weeks",
          "price_structure_id": "bbc6913e-a6dd-4ab4-8c78-a004643a9cad"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/price_structures/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[price_structures]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=price_tiles

Request body

This request accepts the following body:

Name Description
data[attributes][day] float
Multiplier for every day outside of its tiles.
data[attributes][hour] float
Multiplier for every hour outside of its tiles.
data[attributes][month] float
Multiplier for every month outside of its tiles.
data[attributes][name] string
Name of the structure.
data[attributes][price_tiles_attributes][] array
The price tiles to associate.
data[attributes][week] float
Multiplier for every week 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

Delete a price structure

How to delete a price structure with tax rates:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/price_structures/787c6191-4590-4d80-8b25-2675dd775bb1'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "787c6191-4590-4d80-8b25-2675dd775bb1",
      "type": "price_structures",
      "attributes": {
        "created_at": "2023-08-07T17:52:01.000000+00:00",
        "updated_at": "2023-08-07T17:52:01.000000+00:00",
        "archived": true,
        "archived_at": "2023-08-07T17:52:01.000000+00:00",
        "name": "Price per hour (3 hours minimum) (Deleted)",
        "price_structure_type": "reusable",
        "hour": 1.0,
        "day": 0.0,
        "week": 0.0,
        "month": 0.0,
        "year": 0.0,
        "product_group_id": null
      },
      "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 separated fields to include instead of the default fields. ?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.

Relationships

Name Description
price_structure Price structure required
Price structure this price tile is part of.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
created_at datetime readonly
When the resource was created.
id uuid readonly
Primary key.
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).
name string
Name of the tile, which will be used as charge label in the store and on lines.
period enum
Period.
One of: hours, days, weeks, months, years.
price_structure_id uuid readonly-after-create
Price structure this price tile is part of.
quantity integer
Used in combination with period (e.g. 3 with period days).
updated_at datetime readonly
When the resource was last updated.

List price tiles

How to fetch a list of price tiles:

  curl --get 'https://example.booqable.com/api/boomerang/price_tiles'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "0d6f13f8-3b9b-4c22-8b76-818cde33de51",
        "type": "price_tiles",
        "attributes": {
          "created_at": "2024-06-11T13:44:00.000000+00:00",
          "updated_at": "2024-06-11T13:44:00.000000+00:00",
          "name": "3 hours",
          "quantity": 3,
          "length": 10800,
          "multiplier": 3.0,
          "period": "hours",
          "price_structure_id": "206c8e98-0263-4e64-8a9a-6dee477153a3"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/price_tiles

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[price_tiles]=created_at,updated_at,name
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
price_structure_id uuid
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request does not accept any includes

Fetch a price tile

How to fetch a price tile:

  curl --get 'https://example.booqable.com/api/boomerang/price_tiles/f87df772-a192-4033-84c5-daf41c699939'
       --header 'content-type: application/json'
       --data-urlencode 'include=price_tiles'

A 200 status response looks like this:

  {
    "data": {
      "id": "f87df772-a192-4033-84c5-daf41c699939",
      "type": "price_tiles",
      "attributes": {
        "created_at": "2024-10-25T02:33:08.000000+00:00",
        "updated_at": "2024-10-25T02:33:08.000000+00:00",
        "name": "3 hours",
        "quantity": 3,
        "length": 10800,
        "multiplier": 3.0,
        "period": "hours",
        "price_structure_id": "a945c0c5-af5b-404b-87fd-9096543d28f9"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/price_tiles/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[price_tiles]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=price_structure

Includes

This request accepts the following includes:

price_structure

Create 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": "8f39c1c4-b736-4059-8db2-de921565f8e7",
             "name": "3 hours",
             "quantity": 3,
             "period": "hours",
             "multiplier": 3
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "9adeb1b0-13d6-4add-8865-6795db1fd6f0",
      "type": "price_tiles",
      "attributes": {
        "created_at": "2023-05-15T06:12:04.000000+00:00",
        "updated_at": "2023-05-15T06:12:04.000000+00:00",
        "name": "3 hours",
        "quantity": 3,
        "length": 10800,
        "multiplier": 3.0,
        "period": "hours",
        "price_structure_id": "8f39c1c4-b736-4059-8db2-de921565f8e7"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/price_tiles

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[price_tiles]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=price_structure

Request body

This request accepts the following body:

Name Description
data[attributes][multiplier] float
The amount to multiply a product's base price with (e.g. 2.8 for three days).
data[attributes][name] string
Name of the tile, which will be used as charge label in the store and on lines.
data[attributes][period] enum
Period.
One of: hours, days, weeks, months, years.
data[attributes][price_structure_id] uuid
Price structure this price tile is part of.
data[attributes][quantity] integer
Used in combination with period (e.g. 3 with period days).

Includes

This request accepts the following includes:

price_structure

Update a price tile

How to update a price tile:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/price_tiles/37e5319a-6e66-49a9-8d18-9d98fef25147'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "37e5319a-6e66-49a9-8d18-9d98fef25147",
           "type": "price_tiles",
           "attributes": {
             "name": "4 days",
             "quantity": 4,
             "period": "days",
             "multiplier": 4
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "37e5319a-6e66-49a9-8d18-9d98fef25147",
      "type": "price_tiles",
      "attributes": {
        "created_at": "2027-02-09T08:16:02.000000+00:00",
        "updated_at": "2027-02-09T08:16:02.000000+00:00",
        "name": "4 days",
        "quantity": 4,
        "length": 345600,
        "multiplier": 4.0,
        "period": "days",
        "price_structure_id": "754fab8c-2d27-4abc-8d24-c5b673ca95f6"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/price_tiles/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[price_tiles]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=price_structure

Request body

This request accepts the following body:

Name Description
data[attributes][multiplier] float
The amount to multiply a product's base price with (e.g. 2.8 for three days).
data[attributes][name] string
Name of the tile, which will be used as charge label in the store and on lines.
data[attributes][period] enum
Period.
One of: hours, days, weeks, months, years.
data[attributes][price_structure_id] uuid
Price structure this price tile is part of.
data[attributes][quantity] integer
Used in combination with period (e.g. 3 with period days).

Includes

This request accepts the following includes:

price_structure

Delete a price tile

How to delete a price tile:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/price_tiles/46af1ccd-943e-408c-8de5-d7b51faf300b'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "46af1ccd-943e-408c-8de5-d7b51faf300b",
      "type": "price_tiles",
      "attributes": {
        "created_at": "2021-11-04T04:21:00.000000+00:00",
        "updated_at": "2021-11-04T04:21:00.000000+00:00",
        "name": "3 hours",
        "quantity": 3,
        "length": 10800,
        "multiplier": 3.0,
        "period": "hours",
        "price_structure_id": "b51ac374-2b75-4abf-8c3c-6691345dda34"
      },
      "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 separated fields to include instead of the default fields. ?fields[price_tiles]=created_at,updated_at,name

Includes

This request does not accept any includes

Products

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

A product inherits most of its attributes from the product group. Inherited attributes can only be changed through the product group, and will then be applied to all products that belong to the same product group.

The following attributes/relations can be configured on individual products when variations are enabled:

Relationships

Name Description
barcode Barcode optional
The barcode that points to this product.
inventory_levels Inventory levels hasmany
Availability of this product.
photo Photo optional
Main photo.
price_ruleset Price ruleset optional
The price ruleset to use for advanced price calculations. This is inherited from the product group this product belongs to.
price_structure Price structure optional
The price strucure to use when this product uses tiered pricing. This is inherited from the product group this product belongs to.
product_group Product group required
The product group this product belongs to. When a product group does not have variations, there will be exactly one product record. When there variations are enabled, then there can be multiple product records.
properties Properties hasmany
Custom structured data about this product, based on DefaultProperties. These are inherited from the product group this product belongs to. While it is possible to sideload properties for products, it is not possible to assign them.
tax_category Tax category optional
Tax category for tax calculations.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
archived boolean readonly
Whether item is archived.
archived_at datetime readonly nullable
When the item was archived.
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.
created_at datetime readonly
When the resource was created.
id uuid readonly
Primary key.
photo_id uuid nullable
Main photo.
photo_url string readonly nullable
Main photo url.
product_group_id uuid readonly-after-create
The product group this product belongs to. When a product group does not have variations, there will be exactly one product record. When there variations are enabled, then there can be multiple product records.
sorting_weight integer
Defines sorting of variations within a product group. The lower the weight - the higher it shows up in lists.
type string readonly
Always product.
updated_at datetime readonly
When the resource was last updated.
variation_values array[string]
List of values corresponding to the fields defined in product_group.variation_fields. Values should be in the same order as the fields. product_group.variation_fields are the keys, and product.variation_values are the values, and they are matched by their index in the arrays.

Inherited Fields

Name Description
allow_shortage boolean readonly
Whether shortages are allowed.
deposit_in_cents integer readonly
The value to use for deposit calculations.
description string readonly nullable
Description used in the online store.
discountable boolean readonly
Whether discounts should be applied to this item (note that price rules will still apply).
excerpt string readonly nullable
Excerpt used in the online store.
extra_information string readonly nullable
Extra information about the item, shown on orders and documents.
group_name string readonly
The name of the product group.
has_variations boolean readonly
Whether variations are enabled. Not applicable for product_type service.
lag_time integer readonly
The amount of seconds the item should be unavailable after a reservation.
lead_time integer readonly
The amount of seconds the item should be unavailable before a reservation.
name string readonly
Name of the item (based on product group and variations_values).
price_period enum readonly
The period which is the base for price calculation when price type simple.
One of: hour, day, week, month.
price_ruleset_id uuid readonly nullable
The price ruleset to use for advanced price calculations. This is inherited from the product group this product belongs to.
price_structure_id uuid readonly nullable
The price strucure to use when this product uses tiered pricing. This is inherited from the product group this product belongs to.
price_type enum readonly
They way prices are calculated for this product.
One of: structure, private_structure, fixed, simple, none.
product_type enum readonly
Type of product.
One of: rental, consumable, service.
properties hash readonly
Key value pairs of associated properties. This is the same data as provided by the properties relation, but without information about type and position.
seo_description string readonly nullable
SEO meta description tag.
seo_title string readonly nullable
SEO title tag.
shortage_limit integer readonly
The maximum allowed shortage for any date range.
show_in_store boolean readonly
Whether to show this item in the online.
sku string readonly
Stock keeping unit.
slug string readonly
Slug of the product.
tag_list array readonly
List of tags.
tax_category_id uuid readonly nullable
Tax category for tax calculations.
taxable boolean readonly
Whether item is taxable.
trackable boolean readonly
Whether stock items are tracked.
tracking_type enum readonly
How the product is tracked.
One of: none, bulk, trackable.
variation boolean readonly
Whether this Item is a variation in a product group.

List products

How to fetch a list of products:

  curl --get 'https://example.booqable.com/api/boomerang/products'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "ed6e7fb4-7f13-4729-8dce-0f8b8c640d0b",
        "type": "products",
        "attributes": {
          "created_at": "2017-02-21T06:58:03.000000+00:00",
          "updated_at": "2017-02-21T06:58:03.000000+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,
          "allow_shortage": false,
          "shortage_limit": 0,
          "variation_values": [
            "green"
          ],
          "product_group_id": "66a43973-a27a-4282-8f4a-c125934b1469"
        },
        "relationships": {}
      },
      {
        "id": "e78aa4d3-4a0b-4904-8980-60f6cc41d84d",
        "type": "products",
        "attributes": {
          "created_at": "2017-02-21T06:58:03.000000+00:00",
          "updated_at": "2017-02-21T06:58:03.000000+00:00",
          "archived": false,
          "archived_at": null,
          "type": "products",
          "name": "iPad Pro - blue",
          "group_name": "iPad Pro",
          "slug": "ipad-pro-blue",
          "sku": "PRODUCT 1000051",
          "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,
          "allow_shortage": false,
          "shortage_limit": 0,
          "variation_values": [
            "blue"
          ],
          "product_group_id": "66a43973-a27a-4282-8f4a-c125934b1469"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/products

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[products]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=barcode,inventory_levels,photo
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
allow_shortage boolean
eq
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
base_price_in_cents integer
eq, not_eq, gt, gte, lt, lte
collection_id uuid
eq, not_eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
deposit_in_cents integer
eq, not_eq, gt, gte, lt, lte
description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
discountable boolean
eq
excerpt 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
group_name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
has_variations boolean
eq
id uuid
eq, not_eq, gt
lag_time integer
eq, not_eq, gt, gte, lt, lte
lead_time 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
photo_id uuid
eq, not_eq
price_period string_enum
eq
price_ruleset_id uuid
eq, not_eq
price_structure_id uuid
eq, not_eq
price_type string_enum
eq
product_group_id uuid
eq, not_eq
product_type string_enum
eq
q string
eq
seo_description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
seo_title string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
shortage_limit integer
eq, not_eq, gt, gte, lt, lte
show_in_store boolean
eq
sku 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
sorting_weight integer
eq, not_eq, gt, gte, lt, lte
tag_list array
eq
tax_category_id uuid
eq, not_eq
taxable boolean
eq
trackable boolean
eq
tracking_type string_enum
eq
type string
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte
variation boolean
eq

Meta

Results can be aggregated on:

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

Includes

This request accepts the following includes:

barcode

inventory_levels

photo

price_structure => price_tiles

product_group

properties

tax_category

Search 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": "14ec83de-d661-4078-8309-4f5f36813f83"
      },
      {
        "id": "72a41c5e-63c7-4472-888d-91a3231c4a27"
      },
      {
        "id": "770bd85c-629f-42e8-8a11-2197aa83f218"
      },
      {
        "id": "5b6bf5cc-4d27-4c95-8d55-9b672d09fc2c"
      }
    ]
  }

HTTP Request

POST api/boomerang/products/search

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[products]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=barcode,inventory_levels,photo
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
allow_shortage boolean
eq
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
base_price_in_cents integer
eq, not_eq, gt, gte, lt, lte
collection_id uuid
eq, not_eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
deposit_in_cents integer
eq, not_eq, gt, gte, lt, lte
description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
discountable boolean
eq
excerpt 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
group_name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
has_variations boolean
eq
id uuid
eq, not_eq, gt
lag_time integer
eq, not_eq, gt, gte, lt, lte
lead_time 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
photo_id uuid
eq, not_eq
price_period string_enum
eq
price_ruleset_id uuid
eq, not_eq
price_structure_id uuid
eq, not_eq
price_type string_enum
eq
product_group_id uuid
eq, not_eq
product_type string_enum
eq
q string
eq
seo_description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
seo_title string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
shortage_limit integer
eq, not_eq, gt, gte, lt, lte
show_in_store boolean
eq
sku 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
sorting_weight integer
eq, not_eq, gt, gte, lt, lte
tag_list array
eq
tax_category_id uuid
eq, not_eq
taxable boolean
eq
trackable boolean
eq
tracking_type string_enum
eq
type string
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte
variation boolean
eq

Meta

Results can be aggregated on:

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

Includes

This request accepts the following includes:

barcode

inventory_levels

photo

price_structure => price_tiles

product_group

properties

tax_category

Fetch a product

How to fetch a product:

  curl --get 'https://example.booqable.com/api/boomerang/products/8f191698-6a00-445a-8b40-3f5449981539'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "8f191698-6a00-445a-8b40-3f5449981539",
      "type": "products",
      "attributes": {
        "created_at": "2022-10-14T09:41:00.000000+00:00",
        "updated_at": "2022-10-14T09:41:00.000000+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,
        "allow_shortage": false,
        "shortage_limit": 0,
        "variation_values": [
          "green"
        ],
        "product_group_id": "c22ea0d0-9487-4cab-86f8-2859a76f32e4"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/products/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[products]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=barcode,inventory_levels,photo

Includes

This request accepts the following includes:

barcode

inventory_levels

photo

price_structure => price_tiles

product_group

properties

tax_category

Create 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": "a048e1e3-6c98-4b3f-8a9b-e693eefeebac",
             "variation_values": [
               "red"
             ]
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "ccab90b8-7b93-4828-8ec0-7de6cb6e0c4a",
      "type": "products",
      "attributes": {
        "created_at": "2017-11-22T20:35:01.000000+00:00",
        "updated_at": "2017-11-22T20:35:01.000000+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,
        "allow_shortage": false,
        "shortage_limit": 0,
        "variation_values": [
          "red"
        ],
        "product_group_id": "a048e1e3-6c98-4b3f-8a9b-e693eefeebac"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/products

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[products]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=barcode,inventory_levels,photo

Request body

This request accepts the following body:

Name Description
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][photo_id] uuid
Main photo.
data[attributes][product_group_id] uuid
The product group this product belongs to. When a product group does not have variations, there will be exactly one product record. When there variations are enabled, then there can be multiple product records.
data[attributes][sorting_weight] integer
Defines sorting of variations within a product group. The lower the weight - the higher it shows up in lists.
data[attributes][variation_values] array[string]
List of values corresponding to the fields defined in product_group.variation_fields. Values should be in the same order as the fields. product_group.variation_fields are the keys, and product.variation_values are the values, and they are matched by their index in the arrays.

Includes

This request accepts the following includes:

barcode

inventory_levels

photo

price_structure => price_tiles

product_group

properties

tax_category

Update a product

How to update a product:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/products/d2da581f-c48e-4b27-8d9d-9fc0d8b00c8f'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "d2da581f-c48e-4b27-8d9d-9fc0d8b00c8f",
           "type": "products",
           "attributes": {
             "variation_values": [
               "red"
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "d2da581f-c48e-4b27-8d9d-9fc0d8b00c8f",
      "type": "products",
      "attributes": {
        "created_at": "2027-05-05T21:58:04.000000+00:00",
        "updated_at": "2027-05-05T21:58:04.000000+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,
        "allow_shortage": false,
        "shortage_limit": 0,
        "variation_values": [
          "red"
        ],
        "product_group_id": "302a3d1f-b536-467c-8597-35c1733fc1a7"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/products/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[products]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=barcode,inventory_levels,photo

Request body

This request accepts the following body:

Name Description
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][photo_id] uuid
Main photo.
data[attributes][product_group_id] uuid
The product group this product belongs to. When a product group does not have variations, there will be exactly one product record. When there variations are enabled, then there can be multiple product records.
data[attributes][sorting_weight] integer
Defines sorting of variations within a product group. The lower the weight - the higher it shows up in lists.
data[attributes][variation_values] array[string]
List of values corresponding to the fields defined in product_group.variation_fields. Values should be in the same order as the fields. product_group.variation_fields are the keys, and product.variation_values are the values, and they are matched by their index in the arrays.

Includes

This request accepts the following includes:

barcode

inventory_levels

photo

price_structure => price_tiles

product_group

properties

tax_category

Archive a product

How to delete a product:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/products/5fe125ba-4a82-4fad-8a18-03ea09db75a3'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "5fe125ba-4a82-4fad-8a18-03ea09db75a3",
      "type": "products",
      "attributes": {
        "created_at": "2021-02-18T21:58:00.000000+00:00",
        "updated_at": "2021-02-18T21:58:00.000000+00:00",
        "archived": true,
        "archived_at": "2021-02-18T21:58:00.000000+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,
        "allow_shortage": false,
        "shortage_limit": 0,
        "variation_values": [
          "green"
        ],
        "product_group_id": "a220adae-27d9-4298-8e37-e44d9f89f5db"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

DELETE /api/boomerang/products/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[products]=created_at,updated_at,archived

Includes

This request does not accept any includes

Product groups

Product groups hold general information and configuration about products. A product group always contains at least one product. When a product group is enabled to have variations, it can have multiple products.

Product groups are not plannable on orders. Products are the resource that is planned.

Product Types

Tracking Types

The tracking type determines how the product is tracked.

Pricing Types

Relationships

Name Description
inventory_levels Inventory levels hasmany
Availability of this item.
photo Photo optional
Main photo.
price_ruleset Price ruleset optional
The price ruleset used for advanced price calculations.
price_structure Price structure optional
The price strucure to use when this product group uses tiered pricing.
products Products hasmany
When this product group does not have variations: there will be exactly one product. When this product group does have variations: one or more products. These products can be distinquished by their variation_values.
properties Properties hasmany
Custom structured data about this product group, based on DefaultProperties. These properties apply to all products in the same product group.
tax_category Tax category optional
Tax category for tax calculations.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
allow_shortage boolean
Whether shortages are allowed. Changing this setting affects availablity, and can trigger a shortage warning.
archived boolean readonly
Whether product group is archived.
archived_at datetime readonly nullable
When the product group was archived.
base_price_in_cents integer readonly
The value that is being calculated with (based on the current price_type).
confirm_shortage boolean writeonly
Set this to true to override certain shortage warnings.
created_at datetime readonly
When the resource was created.
deposit_in_cents integer
The value to use for deposit calculations.
description string nullable
Description used in the online store.
discountable boolean
Whether discounts should be applied to this product groups and products in it (note that price rules will still apply).
excerpt string nullable
Excerpt used in the online store.
extra_information string nullable
Extra information about the product group, shown on orders and documents.
flat_fee_price_in_cents integer
Use this value when price type is simple.
group_name string readonly
Same as name.
has_variations boolean
Whether variations are enabled. Variations can be enabled after a product group has been created, but variations can not be disabled once they have been enabled. Product group of product_type service cannot have variations.
id uuid readonly
Primary key.
lag_time integer
The amount of seconds the item should be unavailable after a reservation. Changing this setting affects availablity, and can trigger a shortage warning.
lead_time integer
The amount of seconds the item should be unavailable before a reservation. Changing this setting affects availablity, and can trigger a shortage warning.
name string
Name of the item.
photo_base64 string writeonly
Base64 encoded photo, use this field to store a main photo.
photo_id uuid readonly nullable
Main photo.
photo_url string readonly
Main photo url.
price_period enum
The period which is the base for price calculation when price type simple.
One of: hour, day, week, month.
price_ruleset_id uuid nullable
The price ruleset used for advanced price calculations.
price_structure_id uuid nullable
The price strucure to use when this product group uses tiered pricing.
price_type enum
How prices are calculated for this product group and all products in it.
One of: structure, private_structure, fixed, simple, none.
product_type enum readonly-after-create
Type of product. Can only be set when creating a ProductGroup.
One of: bundle, rental, consumable, service.
properties hash readonly
Hash of properties. Sideload the properties relation when more information is needed.
properties_attributes array writeonly
Create or update multiple properties associated with this product group.
remote_photo_url string writeonly
Url to an image on the web.
seo_description string nullable
SEO meta description tag.
seo_title string nullable
SEO title tag.
shortage_limit integer
The maximum allowed shortage for any date range. Changing this setting affects availablity, and can trigger a shortage warning.
show_in_store boolean
Whether to show this product group in the online store.
sku string
Stock keeping unit.
slug string
Slug of the item.
sorting_weight integer
Defines sort order in the online store, the lower the weight - the higher it shows up in lists.
stock_item_properties array[string]
Names of custom properties for stock items of this product group.
structure_price_in_cents integer
Use this value when price type is structure or private_structure.
tag_list array[string]
List of tags.
tax_category_id uuid nullable
Tax category for tax calculations.
taxable boolean
Whether this product group is taxable.
trackable boolean readonly-after-create
Whether stock items are tracked.
tracking_type enum readonly-after-create
How the product is tracked. Can only be set when creating a ProductGroup.
One of: none, bulk, trackable.
type string readonly
Always product group.
updated_at datetime readonly
When the resource was last updated.
variation boolean readonly
Whether this Item is a variation in a ProductGroup..
variation_fields array
Array of fields that distinguish variations (e.g. color or size). product_group.variation_fields are the keys, and product.variation_values are the values, and they are matched by their index in the arrays.

List product groups

How to fetch a list of product groups:

  curl --get 'https://example.booqable.com/api/boomerang/product_groups'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "f0f79b63-e2b9-4178-81f6-3b28593c5419",
        "type": "product_groups",
        "attributes": {
          "created_at": "2026-12-03T23:48:01.000000+00:00",
          "updated_at": "2026-12-03T23:48:01.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[product_groups]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=photo,properties
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
allow_shortage boolean
eq
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
base_price_in_cents integer
eq, not_eq, gt, gte, lt, lte
collection_id uuid
eq, not_eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
deposit_in_cents integer
eq, not_eq, gt, gte, lt, lte
description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
discountable boolean
eq
excerpt 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
flat_fee_price_in_cents integer
eq, not_eq, gt, gte, lt, lte
group_name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
has_variations boolean
eq
id uuid
eq, not_eq, gt
lag_time integer
eq, not_eq, gt, gte, lt, lte
lead_time 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
photo_id uuid
eq, not_eq
price_period string_enum
eq
price_ruleset_id uuid
eq, not_eq
price_structure_id uuid
eq, not_eq
price_type string_enum
eq
product_group_id uuid
eq
product_type string_enum
eq
q 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
seo_title string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
shortage_limit integer
eq, not_eq, gt, gte, lt, lte
show_in_store boolean
eq
sku 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
sorting_weight integer
eq, not_eq, gt, gte, lt, lte
structure_price_in_cents integer
eq, not_eq, gt, gte, lt, lte
tag_list string
eq
tax_category_id uuid
eq, not_eq
taxable boolean
eq
trackable boolean
eq
tracking_type string_enum
eq
type string
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte
variation boolean
eq

Meta

Results can be aggregated on:

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

Includes

This request accepts the following includes:

photo

properties

Search 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": "4c211b3b-f619-45e3-8a3a-c020abe4ddf8"
      },
      {
        "id": "b0871c21-545a-427e-87a2-34b8dd0977b6"
      },
      {
        "id": "caa90af2-e33d-464c-836f-2e933d2bc1c8"
      }
    ]
  }

HTTP Request

POST api/boomerang/product_groups/search

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[product_groups]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=photo,properties
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
allow_shortage boolean
eq
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
base_price_in_cents integer
eq, not_eq, gt, gte, lt, lte
collection_id uuid
eq, not_eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
deposit_in_cents integer
eq, not_eq, gt, gte, lt, lte
description string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
discountable boolean
eq
excerpt 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
flat_fee_price_in_cents integer
eq, not_eq, gt, gte, lt, lte
group_name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
has_variations boolean
eq
id uuid
eq, not_eq, gt
lag_time integer
eq, not_eq, gt, gte, lt, lte
lead_time 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
photo_id uuid
eq, not_eq
price_period string_enum
eq
price_ruleset_id uuid
eq, not_eq
price_structure_id uuid
eq, not_eq
price_type string_enum
eq
product_group_id uuid
eq
product_type string_enum
eq
q 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
seo_title string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
shortage_limit integer
eq, not_eq, gt, gte, lt, lte
show_in_store boolean
eq
sku 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
sorting_weight integer
eq, not_eq, gt, gte, lt, lte
structure_price_in_cents integer
eq, not_eq, gt, gte, lt, lte
tag_list string
eq
tax_category_id uuid
eq, not_eq
taxable boolean
eq
trackable boolean
eq
tracking_type string_enum
eq
type string
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte
variation boolean
eq

Meta

Results can be aggregated on:

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

Includes

This request accepts the following includes:

photo

properties

Fetch a product group

How to fetch a product group:

  curl --get 'https://example.booqable.com/api/boomerang/product_groups/edabcdd8-89b1-46a8-8163-98ae0d275cd1'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "edabcdd8-89b1-46a8-8163-98ae0d275cd1",
      "type": "product_groups",
      "attributes": {
        "created_at": "2025-01-22T17:59:01.000000+00:00",
        "updated_at": "2025-01-22T17:59:01.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[product_groups]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=photo,properties,tax_category

Includes

This request accepts the following includes:

photo

properties

tax_category

barcode

products

price_structure => price_tiles

Create 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": "56ea2eb6-d09f-4f5d-8482-6eb1e7af9908",
      "type": "product_groups",
      "attributes": {
        "created_at": "2018-12-20T06:18:00.000000+00:00",
        "updated_at": "2018-12-20T06:18:00.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[product_groups]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=photo,properties,tax_category

Request body

This request accepts the following body:

Name Description
data[attributes][allow_shortage] boolean
Whether shortages are allowed. Changing this setting affects availablity, and can trigger a shortage warning.
data[attributes][confirm_shortage] boolean
Set this to true to override certain shortage warnings.
data[attributes][deposit_in_cents] integer
The value to use for deposit calculations.
data[attributes][discountable] boolean
Whether discounts should be applied to this product groups and products in it (note that price rules will still apply).
data[attributes][excerpt] string
Excerpt used in the online store.
data[attributes][extra_information] string
Extra information about the product group, shown on orders and documents.
data[attributes][flat_fee_price_in_cents] integer
Use this value when price type is simple.
data[attributes][has_variations] boolean
Whether variations are enabled. Variations can be enabled after a product group has been created, but variations can not be disabled once they have been enabled. Product group of product_type service cannot have variations.
data[attributes][lag_time] integer
The amount of seconds the item should be unavailable after a reservation. Changing this setting affects availablity, and can trigger a shortage warning.
data[attributes][lead_time] integer
The amount of seconds the item should be unavailable before a reservation. Changing this setting affects availablity, and can trigger a shortage warning.
data[attributes][name] string
Name of the item.
data[attributes][photo_base64] string
Base64 encoded photo, use this field to store a main photo.
data[attributes][price_period] enum
The period which is the base for price calculation when price type simple.
One of: hour, day, week, month.
data[attributes][price_ruleset_id] uuid
The price ruleset used for advanced price calculations.
data[attributes][price_structure_id] uuid
The price strucure to use when this product group uses tiered pricing.
data[attributes][price_type] enum
How prices are calculated for this product group and all products in it.
One of: structure, private_structure, fixed, simple, none.
data[attributes][product_type] enum
Type of product. Can only be set when creating a ProductGroup.
One of: bundle, rental, consumable, service.
data[attributes][properties_attributes][] array
Create or update multiple properties associated with this product group.
data[attributes][remote_photo_url] string
Url to an image on the web.
data[attributes][seo_description] string
SEO meta description tag.
data[attributes][seo_title] string
SEO title tag.
data[attributes][shortage_limit] integer
The maximum allowed shortage for any date range. Changing this setting affects availablity, and can trigger a shortage warning.
data[attributes][show_in_store] boolean
Whether to show this product group in the online store.
data[attributes][sku] string
Stock keeping unit.
data[attributes][slug] string
Slug of the item.
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][stock_item_properties] array[string]
Names of custom properties for stock items of this product group.
data[attributes][structure_price_in_cents] integer
Use this value when price type is structure or private_structure.
data[attributes][tag_list] array[string]
List of tags.
data[attributes][tax_category_id] uuid
Tax category for tax calculations.
data[attributes][taxable] boolean
Whether this product group is taxable.
data[attributes][trackable] boolean
Whether stock items are tracked.
data[attributes][tracking_type] enum
How the product is tracked. Can only be set when creating a ProductGroup.
One of: none, bulk, trackable.
data[attributes][variation_fields][] array
Array of fields that distinguish variations (e.g. color or size). product_group.variation_fields are the keys, and product.variation_values are the values, and they are matched by their index in the arrays.

Includes

This request accepts the following includes:

photo

properties

tax_category

barcode

price_structure => price_tiles

Update a product group

How to update a product group:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/product_groups/a32d904d-cb11-4b83-80c4-5974eff77dc8'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "a32d904d-cb11-4b83-80c4-5974eff77dc8",
           "type": "product_groups",
           "attributes": {
             "name": "iPad mini"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "a32d904d-cb11-4b83-80c4-5974eff77dc8",
      "type": "product_groups",
      "attributes": {
        "created_at": "2017-06-27T18:12:01.000000+00:00",
        "updated_at": "2017-06-27T18:12:01.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[product_groups]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=photo,properties,tax_category

Request body

This request accepts the following body:

Name Description
data[attributes][allow_shortage] boolean
Whether shortages are allowed. Changing this setting affects availablity, and can trigger a shortage warning.
data[attributes][confirm_shortage] boolean
Set this to true to override certain shortage warnings.
data[attributes][deposit_in_cents] integer
The value to use for deposit calculations.
data[attributes][discountable] boolean
Whether discounts should be applied to this product groups and products in it (note that price rules will still apply).
data[attributes][excerpt] string
Excerpt used in the online store.
data[attributes][extra_information] string
Extra information about the product group, shown on orders and documents.
data[attributes][flat_fee_price_in_cents] integer
Use this value when price type is simple.
data[attributes][has_variations] boolean
Whether variations are enabled. Variations can be enabled after a product group has been created, but variations can not be disabled once they have been enabled. Product group of product_type service cannot have variations.
data[attributes][lag_time] integer
The amount of seconds the item should be unavailable after a reservation. Changing this setting affects availablity, and can trigger a shortage warning.
data[attributes][lead_time] integer
The amount of seconds the item should be unavailable before a reservation. Changing this setting affects availablity, and can trigger a shortage warning.
data[attributes][name] string
Name of the item.
data[attributes][photo_base64] string
Base64 encoded photo, use this field to store a main photo.
data[attributes][price_period] enum
The period which is the base for price calculation when price type simple.
One of: hour, day, week, month.
data[attributes][price_ruleset_id] uuid
The price ruleset used for advanced price calculations.
data[attributes][price_structure_id] uuid
The price strucure to use when this product group uses tiered pricing.
data[attributes][price_type] enum
How prices are calculated for this product group and all products in it.
One of: structure, private_structure, fixed, simple, none.
data[attributes][product_type] enum
Type of product. Can only be set when creating a ProductGroup.
One of: bundle, rental, consumable, service.
data[attributes][properties_attributes][] array
Create or update multiple properties associated with this product group.
data[attributes][remote_photo_url] string
Url to an image on the web.
data[attributes][seo_description] string
SEO meta description tag.
data[attributes][seo_title] string
SEO title tag.
data[attributes][shortage_limit] integer
The maximum allowed shortage for any date range. Changing this setting affects availablity, and can trigger a shortage warning.
data[attributes][show_in_store] boolean
Whether to show this product group in the online store.
data[attributes][sku] string
Stock keeping unit.
data[attributes][slug] string
Slug of the item.
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][stock_item_properties] array[string]
Names of custom properties for stock items of this product group.
data[attributes][structure_price_in_cents] integer
Use this value when price type is structure or private_structure.
data[attributes][tag_list] array[string]
List of tags.
data[attributes][tax_category_id] uuid
Tax category for tax calculations.
data[attributes][taxable] boolean
Whether this product group is taxable.
data[attributes][trackable] boolean
Whether stock items are tracked.
data[attributes][tracking_type] enum
How the product is tracked. Can only be set when creating a ProductGroup.
One of: none, bulk, trackable.
data[attributes][variation_fields][] array
Array of fields that distinguish variations (e.g. color or size). product_group.variation_fields are the keys, and product.variation_values are the values, and they are matched by their index in the arrays.

Includes

This request accepts the following includes:

photo

properties

tax_category

barcode

price_structure => price_tiles

Archive a product group

How to delete a product group:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/product_groups/0845ee1b-c095-41c8-8179-28d5fe7fd2f3'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "0845ee1b-c095-41c8-8179-28d5fe7fd2f3",
      "type": "product_groups",
      "attributes": {
        "created_at": "2025-02-14T15:30:00.000000+00:00",
        "updated_at": "2025-02-14T15:30:00.000000+00:00",
        "archived": true,
        "archived_at": "2025-02-14T15:30:00.000000+00:00",
        "type": "product_groups",
        "name": "iPad Pro",
        "group_name": null,
        "slug": "ipad-pro-archived-0845ee1b-c095-41c8-8179-28d5fe7fd2f3",
        "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 separated fields to include instead of the default fields. ?fields[product_groups]=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.

Linking to default properties

Properties inherit their configuration from a default property. When creating properties, they are linked to a default when one of the following fields matches:

Owners

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_field 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

Relationships

Name Description
default_property Default property optional
The default property this property is linked to. Properties without default property are called "one-off" properties.
owner Customer, Order, Product group, Stock item, Order delivery rate required
The resource this property is about.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
address1 string
For type address.
address2 string
For type address.
city string
For type address.
country string
For property_type address.
country_id string
For property_type address.
created_at datetime readonly
When the resource was created.
default_property_id uuid nullable
The default property this property is linked to. Properties without default property are called "one-off" properties.
first_name string
For type address.
id uuid readonly
Primary key.
identifier string
Key that will be used in exports, responses and custom field variables in templates.
last_name string
For type address.
latitude string
For property_type address.
longitude string
For property_type address.
meets_validation_requirements boolean
Whether this property meets the validation requirements.
name string
Name of the property (used as label and to compute identifier if left blank).
owner_id uuid
The resource this property is about.
owner_type string
The resource type of the owner.
position integer
Which position the property has relative to other properties of the same owner. This determines the sorting of properties when they are displayed.
property_type enum
Determines how the data is rendered and the kind of input shown to the user.
One of: address, date_field, email, phone, select, text_area, text_field.
province_id string
For property_type address.
region string
For property_type address.
show_on array[string]
Array of document types to show this custom field on. Zero or more from contract, invoice, packing, quote. For properties that are linked to a default property, always the value from the default property will be used and the show_on attribute of the individual property is ignored.
updated_at datetime readonly
When the resource was last updated.
validation_required boolean
Whether this property has to be validated.
value string
For property_type text_field, text_area, phone, email, date_field, select.
zipcode string
For property_type address.

Manage properties through their owner

On the following resources you can manage properties by setting the properties_attribute attribute:

Create a property that corresponds with an existing default property (assuming a default phone property exists):

  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": "78172414-b6f5-44e3-874c-3ca4eafe1a02",
      "type": "customers",
      "attributes": {
        "created_at": "2027-08-03T07:47:02.000000+00:00",
        "updated_at": "2027-08-03T07:47:02.000000+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": {}
  }

Create a one-off property (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": "48b9cace-e329-4be8-809a-d997d34eb388",
      "type": "customers",
      "attributes": {
        "created_at": "2026-04-01T06:11:06.000000+00:00",
        "updated_at": "2026-04-01T06:11:06.000000+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/273e87b8-f7db-4315-8d74-4371f489b516'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "customers",
           "id": "273e87b8-f7db-4315-8d74-4371f489b516",
           "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": "273e87b8-f7db-4315-8d74-4371f489b516",
      "type": "customers",
      "attributes": {
        "created_at": "2022-01-05T06:05:01.000000+00:00",
        "updated_at": "2022-01-05T06:05:01.000000+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": {}
  }

List properties

How to fetch a list of properties:

  curl --get 'https://example.booqable.com/api/boomerang/properties'
       --header 'content-type: application/json'
       --data-urlencode 'include=owner'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "e3140ee7-66da-44b5-827f-a62c7f18110d",
        "type": "properties",
        "attributes": {
          "created_at": "2015-06-08T16:26:00.000000+00:00",
          "updated_at": "2015-06-08T16:26:00.000000+00:00",
          "name": "Phone",
          "identifier": "property_12",
          "position": 0,
          "property_type": "phone",
          "show_on": [],
          "validation_required": false,
          "meets_validation_requirements": true,
          "value": "+316000000",
          "default_property_id": null,
          "owner_id": "b4833bd7-fc68-444f-8965-b78a8ca805e5",
          "owner_type": "customers"
        },
        "relationships": {
          "owner": {
            "data": {
              "type": "customers",
              "id": "b4833bd7-fc68-444f-8965-b78a8ca805e5"
            }
          }
        }
      }
    ],
    "included": [
      {
        "id": "b4833bd7-fc68-444f-8965-b78a8ca805e5",
        "type": "customers",
        "attributes": {
          "created_at": "2015-06-08T16:26:00.000000+00:00",
          "updated_at": "2015-06-08T16:26:00.000000+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_12": "+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[properties]=created_at,updated_at,name
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=owner
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
created_at datetime
eq, not_eq, gt, gte, lt, lte
default_property_id uuid
eq, not_eq
id uuid
eq, not_eq
identifier 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
owner_id uuid
eq, not_eq
owner_type string
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request accepts the following includes:

owner

Fetch a property

How to fetch a property:

  curl --get 'https://example.booqable.com/api/boomerang/properties/65f05300-83b5-4cd8-8a15-36bc907ecfe1'
       --header 'content-type: application/json'
       --data-urlencode 'include=owner'

A 200 status response looks like this:

  {
    "data": {
      "id": "65f05300-83b5-4cd8-8a15-36bc907ecfe1",
      "type": "properties",
      "attributes": {
        "created_at": "2026-04-19T17:00:00.000000+00:00",
        "updated_at": "2026-04-19T17:00:00.000000+00:00",
        "name": "Phone",
        "identifier": "property_13",
        "position": 0,
        "property_type": "phone",
        "show_on": [],
        "validation_required": false,
        "meets_validation_requirements": true,
        "value": "+316000000",
        "default_property_id": null,
        "owner_id": "bef24f9a-d753-437a-8b76-468be9985412",
        "owner_type": "customers"
      },
      "relationships": {
        "owner": {
          "data": {
            "type": "customers",
            "id": "bef24f9a-d753-437a-8b76-468be9985412"
          }
        }
      }
    },
    "included": [
      {
        "id": "bef24f9a-d753-437a-8b76-468be9985412",
        "type": "customers",
        "attributes": {
          "created_at": "2026-04-19T17:00:00.000000+00:00",
          "updated_at": "2026-04-19T17:00:00.000000+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_13": "+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[properties]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=owner

Includes

This request accepts the following includes:

owner

Create 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": "7e69a28e-0d76-4024-81cc-bf5354f84c2e",
             "owner_type": "customers"
           }
         },
         "include": "owner"
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "a0e53cf2-3711-46d7-86f4-ff9422e2c069",
      "type": "properties",
      "attributes": {
        "created_at": "2023-03-09T00:06:01.000000+00:00",
        "updated_at": "2023-03-09T00:06:01.000000+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": "7e69a28e-0d76-4024-81cc-bf5354f84c2e",
        "owner_type": "customers"
      },
      "relationships": {
        "owner": {
          "data": {
            "type": "customers",
            "id": "7e69a28e-0d76-4024-81cc-bf5354f84c2e"
          }
        }
      }
    },
    "included": [
      {
        "id": "7e69a28e-0d76-4024-81cc-bf5354f84c2e",
        "type": "customers",
        "attributes": {
          "created_at": "2023-03-09T00:06:01.000000+00:00",
          "updated_at": "2023-03-09T00:06:01.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[properties]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=owner

Request body

This request accepts the following body:

Name Description
data[attributes][address1] string
For type address.
data[attributes][address2] string
For type address.
data[attributes][city] string
For type address.
data[attributes][country] string
For property_type address.
data[attributes][country_id] string
For property_type address.
data[attributes][default_property_id] uuid
The default property this property is linked to. Properties without default property are called "one-off" properties.
data[attributes][first_name] string
For type address.
data[attributes][identifier] string
Key that will be used in exports, responses and custom field variables in templates.
data[attributes][last_name] string
For type address.
data[attributes][latitude] string
For property_type address.
data[attributes][longitude] string
For property_type address.
data[attributes][meets_validation_requirements] boolean
Whether this property meets the validation requirements.
data[attributes][name] string
Name of the property (used as label and to compute identifier if left blank).
data[attributes][owner_id] uuid
The resource this property is about.
data[attributes][owner_type] string
The resource type of the owner.
data[attributes][position] integer
Which position the property has relative to other properties of the same owner. This determines the sorting of properties when they are displayed.
data[attributes][property_type] enum
Determines how the data is rendered and the kind of input shown to the user.
One of: address, date_field, email, phone, select, text_area, text_field.
data[attributes][province_id] string
For property_type address.
data[attributes][region] string
For property_type address.
data[attributes][show_on] array[string]
Array of document types to show this custom field on. Zero or more from contract, invoice, packing, quote. For properties that are linked to a default property, always the value from the default property will be used and the show_on attribute of the individual property is ignored.
data[attributes][validation_required] boolean
Whether this property has to be validated.
data[attributes][value] string
For property_type text_field, text_area, phone, email, date_field, select.
data[attributes][zipcode] string
For property_type address.

Includes

This request accepts the following includes:

owner

Update a property

How to update a property:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/properties/a08be1e9-e4aa-4b1e-8a1c-ac9d6fa79d78'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "a08be1e9-e4aa-4b1e-8a1c-ac9d6fa79d78",
           "type": "properties",
           "attributes": {
             "value": "+316000001"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "a08be1e9-e4aa-4b1e-8a1c-ac9d6fa79d78",
      "type": "properties",
      "attributes": {
        "created_at": "2028-10-19T14:18:00.000000+00:00",
        "updated_at": "2028-10-19T14:18:00.000000+00:00",
        "name": "Phone",
        "identifier": "property_15",
        "position": 0,
        "property_type": "phone",
        "show_on": [],
        "validation_required": false,
        "meets_validation_requirements": true,
        "value": "+316000001",
        "default_property_id": null,
        "owner_id": "4e6e1abc-ddfd-434a-89eb-921b87839aff",
        "owner_type": "customers"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/properties/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[properties]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=owner

Request body

This request accepts the following body:

Name Description
data[attributes][address1] string
For type address.
data[attributes][address2] string
For type address.
data[attributes][city] string
For type address.
data[attributes][country] string
For property_type address.
data[attributes][country_id] string
For property_type address.
data[attributes][default_property_id] uuid
The default property this property is linked to. Properties without default property are called "one-off" properties.
data[attributes][first_name] string
For type address.
data[attributes][identifier] string
Key that will be used in exports, responses and custom field variables in templates.
data[attributes][last_name] string
For type address.
data[attributes][latitude] string
For property_type address.
data[attributes][longitude] string
For property_type address.
data[attributes][meets_validation_requirements] boolean
Whether this property meets the validation requirements.
data[attributes][name] string
Name of the property (used as label and to compute identifier if left blank).
data[attributes][owner_id] uuid
The resource this property is about.
data[attributes][owner_type] string
The resource type of the owner.
data[attributes][position] integer
Which position the property has relative to other properties of the same owner. This determines the sorting of properties when they are displayed.
data[attributes][property_type] enum
Determines how the data is rendered and the kind of input shown to the user.
One of: address, date_field, email, phone, select, text_area, text_field.
data[attributes][province_id] string
For property_type address.
data[attributes][region] string
For property_type address.
data[attributes][show_on] array[string]
Array of document types to show this custom field on. Zero or more from contract, invoice, packing, quote. For properties that are linked to a default property, always the value from the default property will be used and the show_on attribute of the individual property is ignored.
data[attributes][validation_required] boolean
Whether this property has to be validated.
data[attributes][value] string
For property_type text_field, text_area, phone, email, date_field, select.
data[attributes][zipcode] string
For property_type address.

Includes

This request accepts the following includes:

owner

Delete a property

How to delete a property:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/properties/eab99cab-3fac-4afa-88a3-1ce18a98889e'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "eab99cab-3fac-4afa-88a3-1ce18a98889e",
      "type": "properties",
      "attributes": {
        "created_at": "2023-03-23T09:40:01.000000+00:00",
        "updated_at": "2023-03-23T09:40:01.000000+00:00",
        "name": "Phone",
        "identifier": "property_16",
        "position": 0,
        "property_type": "phone",
        "show_on": [],
        "validation_required": false,
        "meets_validation_requirements": null,
        "value": "+316000000",
        "default_property_id": null,
        "owner_id": "229fb004-46fc-4b3f-8564-613cc13d86db",
        "owner_type": "customers"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

DELETE /api/boomerang/properties/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[properties]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=owner

Includes

This request accepts the following includes:

owner

Provinces

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

Relationships

Name Description
country Country required
The country the province/state belongs to.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
code string readonly
The code of the province/state.
country_id uuid readonly
The country the province/state belongs to.
created_at datetime readonly
When the resource was created.
id uuid readonly
Primary key.
name string readonly
The name of the province/state.
position integer readonly
The position of the province/state in the list.
updated_at datetime readonly
When the resource was last updated.

List provinces

How to fetch a list of provinces:

  curl --get 'https://example.booqable.com/api/boomerang/provinces'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "3026cccd-b110-4086-805e-a014d51387c0",
        "type": "provinces",
        "attributes": {
          "created_at": "2027-04-07T00:26:00.000000+00:00",
          "updated_at": "2027-04-07T00:26:00.000000+00:00",
          "name": "Friesland",
          "code": "FR",
          "position": 0,
          "country_id": "f5f75fb6-0967-4cc7-862d-b277d7a5bd44"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/provinces

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[provinces]=created_at,updated_at,name
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
country_id uuid
eq, not_eq
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request does not accept any includes

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

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

Fetch settings

How to fetch settings:

  curl --get 'https://example.booqable.com/api/boomerang/settings/current'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "7ed00443-a502-4b1a-88ae-d8b726190682",
      "type": "settings",
      "attributes": {
        "updated_at": "2017-11-19T10:18:02.000000+00:00",
        "currency": {
          "name": "USD",
          "decimal": ".",
          "thousand": ",",
          "symbol": "$",
          "precision": 2,
          "format": "%s%v"
        },
        "defaults": {
          "timezone": "UTC",
          "timezone_offset": 0,
          "tax_category_id": "7d25ac45-0c83-4217-8fbd-76ec66f71228",
          "tax_region_id": "7ab2a037-7829-4476-8a65-17b89e83a6f5",
          "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
extra_fields[] array
List of comma separated fields to include in addition to the default fields. ?extra_fields[settings]=dashboard,setup_checklist,onboarding
fields[] array
List of comma separated fields to include instead of the default fields. ?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.

Relationships

Name Description
customer Customer required
The associated customer.
document Document required
The associated contract or quote.
order Order required
The associated order.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
customer_id uuid readonly
The associated customer.
document_id uuid readonly-after-create
The associated contract or quote.
id uuid readonly
Primary key.
order_id uuid readonly
The associated order.
signature_base64 string writeonly required
Base64 encoded signature, use this field to store a signature.

Sign 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": "6ea8048b-b423-4dfb-8076-da8361155b47",
             "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": "914a141f-72ee-48a6-8d8f-75f19df8096a",
      "type": "signatures",
      "attributes": {
        "document_id": "6ea8048b-b423-4dfb-8076-da8361155b47",
        "order_id": "57b1b33c-c25e-4c82-85f1-a1fc25d65fd4",
        "customer_id": "538b2f72-8ad8-419f-8f8f-f5b2c8e07381"
      },
      "relationships": {
        "document": {
          "data": {
            "type": "documents",
            "id": "6ea8048b-b423-4dfb-8076-da8361155b47"
          }
        },
        "order": {
          "data": {
            "type": "orders",
            "id": "57b1b33c-c25e-4c82-85f1-a1fc25d65fd4"
          }
        }
      }
    },
    "included": [
      {
        "id": "6ea8048b-b423-4dfb-8076-da8361155b47",
        "type": "documents",
        "attributes": {
          "created_at": "2025-11-01T01:57:01.000000+00:00",
          "updated_at": "2025-11-01T01:57:01.000000+00:00",
          "archived": false,
          "archived_at": null,
          "document_type": "contract",
          "number": 1,
          "prefix": null,
          "prefix_with_number": "1",
          "date": "2025-01-13",
          "due_date": null,
          "name": "John Doe",
          "address": null,
          "body": null,
          "footer": null,
          "reference": null,
          "revised": false,
          "finalized": true,
          "sent": false,
          "confirmed": true,
          "status": "confirmed",
          "signature_url": "/uploads/6ec35b15c20e2b83d46f922e40351a06/document/contract/signature/6ea8048b-b423-4dfb-8076-da8361155b47/fd41339f-7791-4cad-8f8f-47650ac6fbba.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": "57b1b33c-c25e-4c82-85f1-a1fc25d65fd4",
          "customer_id": "538b2f72-8ad8-419f-8f8f-f5b2c8e07381",
          "tax_region_id": null,
          "coupon_id": null
        },
        "relationships": {}
      },
      {
        "id": "57b1b33c-c25e-4c82-85f1-a1fc25d65fd4",
        "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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[signatures]=document_id,order_id,customer_id
include string
List of comma seperated relationships to sideload. ?include=document,order,customer

Request body

This request accepts the following body:

Name Description
data[attributes][document_id] uuid
The associated contract or quote.
data[attributes][signature_base64] string
Base64 encoded signature, use this field to store a signature.

Includes

This request accepts the following includes:

document

order

customer

Sortings

A convienient way to bulk update positions for supported resources.

Fields

Name Description
id uuid readonly
Primary key.
ids array[string] writeonly
Array of ids, positions are determined by the order of the array.
type enum writeonly
Type of resource to update.
One of: bundle_items, default_properties, lines, photos, properties, tax_rates, collection_items, products.

Sort resources

How to update ordering of lines on an order:

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/sortings'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "sorting",
           "attributes": {
             "type": "lines",
             "ids": [
               "dd7704d6-92af-433f-8307-1580c222b45b",
               "f07a772a-99b8-42a9-80cf-ae5f022c3a88",
               "0b8285b3-8cc6-4091-8484-0ae26045348e"
             ]
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "c9141d6a-4138-42f9-8b9b-ec969ca14eb7",
      "type": "sortings"
    },
    "meta": {}
  }

How to update the order in which default properties are displayed:

  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": [
               "b4bc1f68-037d-4910-8c66-87497dd24491",
               "0bd669a0-51bf-4493-8ce1-22c9ca11fce7",
               "e54e6ae1-8288-4ffd-8e7a-f3450abfc7ba",
               "41c3e709-3062-4040-8862-3f5c87890671",
               "2033f2d9-8300-4554-8070-08271971674b"
             ]
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "09ef6bf7-74e3-4276-8064-c916d9e88fac",
      "type": "sortings"
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/sortings

Request body

This request accepts the following body:

Name Description
data[attributes][ids] array[string]
Array of ids, positions are determined by the order of the array.
data[attributes][type] enum
Type of resource to update.
One of: bundle_items, default_properties, lines, photos, properties, tax_rates, collection_items, products.

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.

Statuses

Relationships

Name Description
barcode Barcode optional
Barcode to quickly identify this StockItem.
location Location required
Location where this StockItem currently resides. This is the start location of the order if the StockItem is currently out with a customer.
product Product required
The Product this StockItem is one instance of.
properties Properties hasmany
Custom data associated with this StockItem.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
archived boolean readonly
Whether item is archived.
archived_at datetime readonly nullable
When the item was archived.
confirm_shortage boolean writeonly
Whether to confirm a shortage when updating from, till or location of a stock item.
created_at datetime readonly
When the resource was created.
from datetime nullable
When the stock item will be available in stock (temporary items or expected arrival date).
id uuid readonly
Primary key.
identifier string
Unique identifier (like serial number).
location_id uuid
Location where this StockItem currently resides. This is the start location of the order if the StockItem is currently out with a customer.
product_group_id uuid readonly
The ProductGroup this StockItem belongs to.
product_id uuid readonly-after-create
The Product this StockItem is one instance of.
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 stock item.
status enum readonly
Whether item is out with a customer or in-store/warehouse.
One of: archived, expected, in_stock, started, overdue, expired.
stock_item_type enum readonly
Based on the values of from and till.
One of: regular, temporary.
till datetime nullable
When item will be out of stock (temporary items).
updated_at datetime readonly
When the resource was last updated.

List stock_items

How to fetch a list of stock items:

  curl --get 'https://example.booqable.com/api/boomerang/stock_items'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "080ec72f-da7f-4569-8d12-1a6770c8f19f",
        "type": "stock_items",
        "attributes": {
          "created_at": "2025-04-07T23:24:00.000000+00:00",
          "updated_at": "2025-04-07T23:24:00.000000+00:00",
          "archived": false,
          "archived_at": null,
          "identifier": "id1000183",
          "status": "in_stock",
          "from": null,
          "till": null,
          "stock_item_type": "regular",
          "product_group_id": "33aa5e86-cf21-4867-8ce8-6ca8000eee14",
          "properties": {},
          "product_id": "ab39f2f5-e082-4520-8ba6-57e483d3686a",
          "location_id": "78ae9e4b-b588-4fb0-845a-99371ba4d69c"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/stock_items

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[stock_items]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=product,barcode,location
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
created_at datetime
eq, not_eq, gt, gte, lt, lte
from datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
identifier string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
location_id uuid
eq, not_eq
product_group_id uuid
eq, not_eq
product_id uuid
eq, not_eq
q string
eq
status string_enum
eq
stock_item_type string_enum
eq
till datetime
eq, not_eq, gt, gte, lt, lte
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
status array
count
stock_item_type array
count
total array
count

Includes

This request accepts the following includes:

product

barcode

location

properties

Fetch a stock_item

How to fetch a stock item:

  curl --get 'https://example.booqable.com/api/boomerang/stock_items/218c1f4b-3124-4718-86e3-fc4646fe5562'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "218c1f4b-3124-4718-86e3-fc4646fe5562",
      "type": "stock_items",
      "attributes": {
        "created_at": "2020-12-14T17:16:00.000000+00:00",
        "updated_at": "2020-12-14T17:16:00.000000+00:00",
        "archived": false,
        "archived_at": null,
        "identifier": "id1000184",
        "status": "in_stock",
        "from": null,
        "till": null,
        "stock_item_type": "regular",
        "product_group_id": "20441cdb-ca45-49d3-887f-91258ef2c191",
        "properties": {},
        "product_id": "62127110-28f1-4b13-84de-f7287c9f9691",
        "location_id": "42f6ee46-44cc-47e4-8775-d2f20612347a"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/stock_items/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[stock_items]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=barcode,location,properties

Includes

This request accepts the following includes:

barcode

location

properties

product => product_group

Create 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": "8ba34c4e-02e7-46c8-87c1-741102785936"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "63a10585-7a78-4d77-8fc0-04fefeb7b255",
      "type": "stock_items",
      "attributes": {
        "created_at": "2025-07-23T16:54:00.000000+00:00",
        "updated_at": "2025-07-23T16:54:00.000000+00:00",
        "archived": false,
        "archived_at": null,
        "identifier": "12345",
        "status": "in_stock",
        "from": null,
        "till": null,
        "stock_item_type": "regular",
        "product_group_id": "d798843c-7589-4a94-85cd-e47efc86c6ab",
        "properties": {},
        "product_id": "8ba34c4e-02e7-46c8-87c1-741102785936",
        "location_id": "216d7c85-e3a6-4f77-809a-a5fb404ea9a4"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/stock_items

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[stock_items]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=barcode,location,properties

Request body

This request accepts the following body:

Name Description
data[attributes][confirm_shortage] boolean
Whether to confirm a shortage when updating from, till or location of a stock item.
data[attributes][from] datetime
When the stock item will be available in stock (temporary items or expected arrival date).
data[attributes][identifier] string
Unique identifier (like serial number).
data[attributes][location_id] uuid
Location where this StockItem currently resides. This is the start location of the order if the StockItem is currently out with a customer.
data[attributes][product_id] uuid
The Product this StockItem is one instance of.
data[attributes][properties_attributes][] array
Create or update multiple properties associated with this stock item.
data[attributes][till] datetime
When item will be out of stock (temporary items).

Includes

This request accepts the following includes:

barcode

location

properties

product => product_group

Update a stock_item

How to update a stock item:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/stock_items/96e16eb3-614f-4a6a-8444-531244376f3a'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "96e16eb3-614f-4a6a-8444-531244376f3a",
           "type": "stock_items",
           "attributes": {
             "identifier": "12346"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "96e16eb3-614f-4a6a-8444-531244376f3a",
      "type": "stock_items",
      "attributes": {
        "created_at": "2019-01-10T06:59:11.000000+00:00",
        "updated_at": "2019-01-10T06:59:11.000000+00:00",
        "archived": false,
        "archived_at": null,
        "identifier": "12346",
        "status": "in_stock",
        "from": null,
        "till": null,
        "stock_item_type": "regular",
        "product_group_id": "4fd29b75-0981-44f0-893f-c9e5885ec5f6",
        "properties": {},
        "product_id": "797648e2-ccc4-4117-832c-6b0a19709ee5",
        "location_id": "b10fb7f2-9f8e-4e91-8a52-93585748b5a3"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/stock_items/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[stock_items]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=barcode,location,properties

Request body

This request accepts the following body:

Name Description
data[attributes][confirm_shortage] boolean
Whether to confirm a shortage when updating from, till or location of a stock item.
data[attributes][from] datetime
When the stock item will be available in stock (temporary items or expected arrival date).
data[attributes][identifier] string
Unique identifier (like serial number).
data[attributes][location_id] uuid
Location where this StockItem currently resides. This is the start location of the order if the StockItem is currently out with a customer.
data[attributes][product_id] uuid
The Product this StockItem is one instance of.
data[attributes][properties_attributes][] array
Create or update multiple properties associated with this stock item.
data[attributes][till] datetime
When item will be out of stock (temporary items).

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.

Errors

When the request fails, the error.code attribute can have the following values:

Relationships

Name Description
stock_item Stock item required
The stock item that needs to be archived.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
confirm_shortage boolean writeonly
A value of true overrides shortage warnings.
id uuid readonly
Primary key.
stock_item_id uuid readonly-after-create
The stock item that needs to be archived.

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": "37f0c3fc-b2bf-4966-8eb5-d78dd973ed78"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "16f1d062-5ca2-4e3d-86ef-07d906b31fcf",
      "type": "stock_item_archivations",
      "attributes": {
        "stock_item_id": "37f0c3fc-b2bf-4966-8eb5-d78dd973ed78"
      },
      "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": "3ff5774c-b38f-47e3-87b2-c514df491708"
           }
         }
       }'

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": "00fb3418-f6cc-403c-8a08-25489ba726a0"
           }
         }
       }'

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": [
                "809e9c77-25f8-4f0e-8a50-7c1e884681d5"
              ]
            }
          ]
        }
      }
    ]
  }

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": "b4e06e4a-63ed-4e5d-8e4e-f6594bac9ab9"
           }
         }
       }'

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": "f5273ac1-25df-4451-82dd-a11908f80b33",
              "mutation": -1,
              "order_ids": [
                "48e3654d-1bd3-4805-8dc4-28a9702fd4be"
              ],
              "location_id": "a850b1a1-8829-4508-8ce1-2fa8e886fce6",
              "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": "d4f5dbfe-e53b-4fae-8d91-56dbd8ec1f0a"
           }
         }
       }'

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": "56a2701d-0c44-442b-881b-2332c08e358c",
              "mutation": -1,
              "order_ids": [
                "9ab41c24-253e-4ca3-8714-4e2ae2dbcaeb"
              ],
              "location_id": "bffaaa23-5b23-494f-8775-986f7429fbae",
              "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": "b899b3e7-5c23-4e22-8859-325956852bea",
             "confirm_shortage": true
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "2adbd074-8788-4a4c-85e1-3043bd4d878a",
      "type": "stock_item_archivations",
      "attributes": {
        "stock_item_id": "b899b3e7-5c23-4e22-8859-325956852bea"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/stock_item_archivations

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[stock_item_archivations]=stock_item_id
include string
List of comma seperated relationships to sideload. ?include=stock_item

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
The stock item that needs to be archived.

Includes

This request accepts the following includes:

stock_item

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 OrderFulfillments resource for examples.

Relationships

Name Description
order Order required
The Order this StockItemPlanning is part of.
planning Planning required
The Planning for which this StockItemPlanning specifies a StockItem.
stock_item Stock item required
The StockItem being specified, and whose status through the fulfillment process is tracked by this StockItemPlanning.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
archived boolean readonly
Whether stock item planning is archived.
archived_at datetime readonly nullable
When the stock item planning was archived.
created_at datetime readonly
When the resource was created.
id uuid readonly
Primary key.
order_id uuid
The Order this StockItemPlanning is part of.
planning_id uuid
The Planning for which this StockItemPlanning specifies a StockItem.
reserved boolean
Wheter stock item is reserved, meaning it's unavailable for other orders.
started boolean
Wheter stock item is started.
stock_item_id uuid
The StockItem being specified, and whose status through the fulfillment process is tracked by this StockItemPlanning.
stopped boolean
Wheter stock item is stopped. Meaning it's available again.
updated_at datetime readonly
When the resource was last updated.

List stock item plannings

How to fetch a list of stock item plannings:

  curl --get 'https://example.booqable.com/api/boomerang/stock_item_plannings'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "76e3b6a9-a2ef-48f7-813b-a183307e38ce",
        "type": "stock_item_plannings",
        "attributes": {
          "created_at": "2021-11-26T13:55:00.000000+00:00",
          "updated_at": "2021-11-26T13:55:00.000000+00:00",
          "archived": false,
          "archived_at": null,
          "reserved": false,
          "started": false,
          "stopped": false,
          "stock_item_id": "cb6d24a2-3cdf-47ad-8b45-e484a3447f07",
          "planning_id": "a0d6b272-7ad6-4a19-8c78-7a77546685b6",
          "order_id": "a7840ea8-9a1c-473b-8218-df29c7e23ae3"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/stock_item_plannings

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[stock_item_plannings]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=stock_item,planning,order
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
order_id uuid
eq, not_eq
planning_id uuid
eq, not_eq
reserved boolean
eq
started boolean
eq
stock_item_id uuid
eq, not_eq
stopped boolean
eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request accepts the following includes:

stock_item => product => photo

planning

order

Archive a stock_item planning

How to archive a stock item planning:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/stock_item_plannings/68bb0a74-3b6a-479a-8db0-851ae0d77511'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "68bb0a74-3b6a-479a-8db0-851ae0d77511",
      "type": "stock_item_plannings",
      "attributes": {
        "created_at": "2020-03-22T01:19:28.000000+00:00",
        "updated_at": "2020-03-22T01:19:28.000000+00:00",
        "archived": false,
        "archived_at": null,
        "reserved": false,
        "started": false,
        "stopped": false,
        "stock_item_id": "c0063ec0-3366-4182-8cd6-209e7aa5f8df",
        "planning_id": "2e914ecb-75f6-445d-8016-d168dd39ae4a",
        "order_id": "88e2c331-8b9c-4d53-8297-c0bdab76db52"
      },
      "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 separated fields to include instead of the default fields. ?fields[stock_item_plannings]=created_at,updated_at,archived

Includes

This request does not accept any includes

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.

Relationships

Name Description
item Item required
The Product the suggested stock item belongs to.
stock_item Stock item required
The suggested stock item.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
id uuid readonly
Primary key.
item_id uuid readonly
The Product the suggested stock item belongs to.
status enum readonly
Status of the suggested stock item.
One of: available_in_location, available_in_cluster, overdue, unavailable, already_booked.
stock_item_id uuid readonly
The suggested stock item.

List stock item suggestions

Retrieve stock item suggestions for booking:

  curl --get 'https://example.booqable.com/api/boomerang/stock_item_suggestions'
       --header 'content-type: application/json'
       --data-urlencode 'filter[action]=book'
       --data-urlencode 'filter[item_id]=402fa5d1-ec05-46ad-85ee-c56564c66946'
       --data-urlencode 'filter[order_id]=38c7808b-99c9-4b0e-8dbe-dcf731d54ca9'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "8ce54731-3e9e-48fd-898a-42985159c79a",
        "type": "stock_item_suggestions",
        "attributes": {
          "status": "available_in_location",
          "item_id": "402fa5d1-ec05-46ad-85ee-c56564c66946",
          "stock_item_id": "e1ceaec8-5cd6-4097-87ec-77e8e1fe5381"
        },
        "relationships": {}
      },
      {
        "id": "484c2445-4864-4e9d-87f6-d37086fbae96",
        "type": "stock_item_suggestions",
        "attributes": {
          "status": "already_booked",
          "item_id": "402fa5d1-ec05-46ad-85ee-c56564c66946",
          "stock_item_id": "8d913ead-29f6-4cde-8a88-001222806991"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/stock_item_suggestions

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[stock_item_suggestions]=status,item_id,stock_item_id
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=stock_item
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
action string_enum required
eq
from datetime
eq
item_id uuid required
eq
location_id uuid
eq
order_id uuid required
eq
q string
eq
status string_enum
eq
till datetime
eq

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request accepts the following includes:

stock_item

Tags

Tags allow users to label and quickly identify customers, orders and products.

Tags are assigned by writing the tag_list attribute on resources that support tags.

The Tag resource allows to gather names and usage counts of tags that are being used.

Fields

Name Description
count integer
How often this tag is used.
for enum writeonly
The resource to show the tag counts for.
One of: Order, Customer, ProductGroup, Bundle, Document.
id uuid readonly
Primary key.
name string
Name of the tag.

List tags

How to fetch a list of tags with their counts:

  curl --get 'https://example.booqable.com/api/boomerang/tags'
       --header 'content-type: application/json'
       --data-urlencode 'filter[for]=Order'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "9ab5867e-6bcc-497d-800a-17a81435dca3",
        "type": "tags",
        "attributes": {
          "name": "vip",
          "count": 1
        }
      },
      {
        "id": "e15b75d1-c447-4d47-87a5-24e44dfac6a4",
        "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 separated fields to include instead of the default fields. ?fields[tags]=name,count
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
for string_enum required
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.

Relationships

Name Description
tax_rates Tax rates hasmany
The different rates that need to be charged.
Rates can be created/updated through the TaxRate resource by writing the tax_rates_attributes attrinute.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
archived boolean readonly
Whether tax category is archived.
archived_at datetime readonly nullable
When the tax category was archived.
created_at datetime readonly
When the resource was created.
default boolean
Whether this is the default tax category. Setting this value to true will set other tax categories to false.
id uuid readonly
Primary key.
name string
Name of the tax category.
tax_rates_attributes array writeonly
The tax rates to associate.
updated_at datetime readonly
When the resource was last updated.

List tax categories

How to fetch a list of tax categories:

  curl --get 'https://example.booqable.com/api/boomerang/tax_categories'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "eb6ca64a-1783-4ca7-8e92-8ec7ab3ff4eb",
        "type": "tax_categories",
        "attributes": {
          "created_at": "2021-09-13T19:57:01.000000+00:00",
          "updated_at": "2021-09-13T19:57:01.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[tax_categories]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=tax_rates
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
created_at datetime
eq, not_eq, gt, gte, lt, lte
default boolean
eq
id uuid
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request accepts the following includes:

tax_rates

Fetch a tax category

How to fetch a tax categories with it's tax rates:

  curl --get 'https://example.booqable.com/api/boomerang/tax_categories/471739b4-dc9f-404d-8324-c61a3de5e2da'
       --header 'content-type: application/json'
       --data-urlencode 'include=tax_rates'

A 200 status response looks like this:

  {
    "data": {
      "id": "471739b4-dc9f-404d-8324-c61a3de5e2da",
      "type": "tax_categories",
      "attributes": {
        "created_at": "2021-02-06T21:30:00.000000+00:00",
        "updated_at": "2021-02-06T21:30:00.000000+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Sales Tax",
        "default": false
      },
      "relationships": {
        "tax_rates": {
          "data": [
            {
              "type": "tax_rates",
              "id": "2de2a095-6e4a-4ebd-8b21-6bb8dabfd593"
            }
          ]
        }
      }
    },
    "included": [
      {
        "id": "2de2a095-6e4a-4ebd-8b21-6bb8dabfd593",
        "type": "tax_rates",
        "attributes": {
          "created_at": "2021-02-06T21:30:00.000000+00:00",
          "updated_at": "2021-02-06T21:30:00.000000+00:00",
          "name": "VAT",
          "value": 21.0,
          "position": 1,
          "owner_id": "471739b4-dc9f-404d-8324-c61a3de5e2da",
          "owner_type": "tax_categories"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/tax_categories/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[tax_categories]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=tax_rates

Includes

This request accepts the following includes:

tax_rates

Create 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": "a2acf665-e4f1-4f21-8dbc-bc971ddc0930",
      "type": "tax_categories",
      "attributes": {
        "created_at": "2022-01-08T11:51:00.000000+00:00",
        "updated_at": "2022-01-08T11:51:00.000000+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Sales Tax",
        "default": false
      },
      "relationships": {
        "tax_rates": {
          "data": [
            {
              "type": "tax_rates",
              "id": "823436f2-33a3-40d1-8841-d71705ec33f5"
            }
          ]
        }
      }
    },
    "included": [
      {
        "id": "823436f2-33a3-40d1-8841-d71705ec33f5",
        "type": "tax_rates",
        "attributes": {
          "created_at": "2022-01-08T11:51:00.000000+00:00",
          "updated_at": "2022-01-08T11:51:00.000000+00:00",
          "name": "VAT",
          "value": 21.0,
          "position": 1,
          "owner_id": "a2acf665-e4f1-4f21-8dbc-bc971ddc0930",
          "owner_type": "tax_categories"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

POST /api/boomerang/tax_categories

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[tax_categories]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=tax_rates

Request body

This request accepts the following body:

Name Description
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][name] string
Name of the tax category.
data[attributes][tax_rates_attributes][] array
The tax rates to associate.

Includes

This request accepts the following includes:

tax_rates

Update a tax category

How to update a tax category with tax rates:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/tax_categories/e3d7ddaf-e57a-47bb-8eef-839b7f1a4bfd'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "e3d7ddaf-e57a-47bb-8eef-839b7f1a4bfd",
           "type": "tax_categories",
           "attributes": {
             "name": "State Tax",
             "tax_rates_attributes": [
               {
                 "name": "VAT",
                 "value": 9
               },
               {
                 "id": "3341f09b-efc4-4586-8c73-2125fbb05896",
                 "_destroy": true
               }
             ]
           }
         },
         "include": "tax_rates"
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "e3d7ddaf-e57a-47bb-8eef-839b7f1a4bfd",
      "type": "tax_categories",
      "attributes": {
        "created_at": "2021-11-08T05:22:00.000000+00:00",
        "updated_at": "2021-11-08T05:22:00.000000+00:00",
        "archived": false,
        "archived_at": null,
        "name": "State Tax",
        "default": false
      },
      "relationships": {
        "tax_rates": {
          "data": [
            {
              "type": "tax_rates",
              "id": "a9588059-d21e-4093-8059-b130c575b763"
            }
          ]
        }
      }
    },
    "included": [
      {
        "id": "a9588059-d21e-4093-8059-b130c575b763",
        "type": "tax_rates",
        "attributes": {
          "created_at": "2021-11-08T05:22:00.000000+00:00",
          "updated_at": "2021-11-08T05:22:00.000000+00:00",
          "name": "VAT",
          "value": 9.0,
          "position": 2,
          "owner_id": "e3d7ddaf-e57a-47bb-8eef-839b7f1a4bfd",
          "owner_type": "tax_categories"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/tax_categories/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[tax_categories]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=tax_rates

Request body

This request accepts the following body:

Name Description
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][name] string
Name of the tax category.
data[attributes][tax_rates_attributes][] array
The tax rates to associate.

Includes

This request accepts the following includes:

tax_rates

Delete a tax category

How to delete a tax category with tax rates:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/tax_categories/c7095ef4-6e5b-42f7-8675-6fd1e233106f'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "c7095ef4-6e5b-42f7-8675-6fd1e233106f",
      "type": "tax_categories",
      "attributes": {
        "created_at": "2027-06-16T04:31:07.000000+00:00",
        "updated_at": "2027-06-16T04:31:07.000000+00:00",
        "archived": true,
        "archived_at": "2027-06-16T04:31:07.000000+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 separated fields to include instead of the default fields. ?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.

Relationships

Name Description
owner Tax category, Tax region required
The TaxRegion or TaxCategory this TaxRate is part of.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
created_at datetime readonly
When the resource was created.
id uuid readonly
Primary key.
name string
The name of the tax rate.
owner_id uuid
The TaxRegion or TaxCategory this TaxRate is part of.
owner_type string
The resource type of the owner.
position integer readonly
Position of the tax rate.
updated_at datetime readonly
When the resource was last updated.
value float
The percentage value of the rate.

List tax rates

How to fetch a list of tax rates:

  curl --get 'https://example.booqable.com/api/boomerang/tax_rates'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "d39e7448-db31-4b79-82da-4e0c59539ac4",
        "type": "tax_rates",
        "attributes": {
          "created_at": "2016-01-22T07:05:01.000000+00:00",
          "updated_at": "2016-01-22T07:05:01.000000+00:00",
          "name": "VAT",
          "value": 21.0,
          "position": 1,
          "owner_id": "c0ac16c6-1011-4d0d-8a6d-20b0b13763cd",
          "owner_type": "tax_regions"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET api/boomerang/tax_rates

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[tax_rates]=created_at,updated_at,name
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=owner
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
owner_id uuid
eq, not_eq
owner_type string
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request accepts the following includes:

owner

Fetch a tax rate

How to fetch a tax rate:

  curl --get 'https://example.booqable.com/api/boomerang/tax_rates/4315e7db-350a-4786-848a-27333157f531'
       --header 'content-type: application/json'
       --data-urlencode 'include=owner'

A 200 status response looks like this:

  {
    "data": {
      "id": "4315e7db-350a-4786-848a-27333157f531",
      "type": "tax_rates",
      "attributes": {
        "created_at": "2028-12-26T07:19:00.000000+00:00",
        "updated_at": "2028-12-26T07:19:00.000000+00:00",
        "name": "VAT",
        "value": 21.0,
        "position": 1,
        "owner_id": "bed7a8b1-0fc6-401d-818a-374b416dbbd5",
        "owner_type": "tax_regions"
      },
      "relationships": {
        "owner": {
          "data": {
            "type": "tax_regions",
            "id": "bed7a8b1-0fc6-401d-818a-374b416dbbd5"
          }
        }
      }
    },
    "included": [
      {
        "id": "bed7a8b1-0fc6-401d-818a-374b416dbbd5",
        "type": "tax_regions",
        "attributes": {
          "created_at": "2028-12-26T07:19:00.000000+00:00",
          "updated_at": "2028-12-26T07:19:00.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[tax_rates]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=owner

Includes

This request accepts the following includes:

owner

Create 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": "12188347-ab4b-416c-8b2d-44bf5802abbc",
             "owner_type": "tax_regions"
           }
         },
         "include": "owner"
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "87122383-0cc0-4126-8013-a213d1fbb19d",
      "type": "tax_rates",
      "attributes": {
        "created_at": "2021-02-16T04:50:00.000000+00:00",
        "updated_at": "2021-02-16T04:50:00.000000+00:00",
        "name": "VAT",
        "value": 21.0,
        "position": 1,
        "owner_id": "12188347-ab4b-416c-8b2d-44bf5802abbc",
        "owner_type": "tax_regions"
      },
      "relationships": {
        "owner": {
          "data": {
            "type": "tax_regions",
            "id": "12188347-ab4b-416c-8b2d-44bf5802abbc"
          }
        }
      }
    },
    "included": [
      {
        "id": "12188347-ab4b-416c-8b2d-44bf5802abbc",
        "type": "tax_regions",
        "attributes": {
          "created_at": "2021-02-16T04:50:00.000000+00:00",
          "updated_at": "2021-02-16T04:50:00.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[tax_rates]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=owner

Request body

This request accepts the following body:

Name Description
data[attributes][name] string
The name of the tax rate.
data[attributes][owner_id] uuid
The TaxRegion or TaxCategory this TaxRate is part of.
data[attributes][owner_type] string
The resource type of the owner.
data[attributes][value] float
The percentage value of the rate.

Includes

This request accepts the following includes:

owner

Update a tax rate

How to update a tax rate:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/tax_rates/85ba8a31-4370-484d-86f2-4da1726975ff'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "85ba8a31-4370-484d-86f2-4da1726975ff",
           "type": "tax_rates",
           "attributes": {
             "value": 9
           }
         },
         "include": "owner"
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "85ba8a31-4370-484d-86f2-4da1726975ff",
      "type": "tax_rates",
      "attributes": {
        "created_at": "2020-08-24T18:48:00.000000+00:00",
        "updated_at": "2020-08-24T18:48:00.000000+00:00",
        "name": "Vat",
        "value": 9.0,
        "position": 1,
        "owner_id": "309c4936-b8c0-4af3-80c5-1659745b4375",
        "owner_type": "tax_categories"
      },
      "relationships": {
        "owner": {
          "data": {
            "type": "tax_categories",
            "id": "309c4936-b8c0-4af3-80c5-1659745b4375"
          }
        }
      }
    },
    "included": [
      {
        "id": "309c4936-b8c0-4af3-80c5-1659745b4375",
        "type": "tax_categories",
        "attributes": {
          "created_at": "2020-08-24T18:48:00.000000+00:00",
          "updated_at": "2020-08-24T18:48:00.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[tax_rates]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=owner

Request body

This request accepts the following body:

Name Description
data[attributes][name] string
The name of the tax rate.
data[attributes][owner_id] uuid
The TaxRegion or TaxCategory this TaxRate is part of.
data[attributes][owner_type] string
The resource type of the owner.
data[attributes][value] float
The percentage value of the rate.

Includes

This request accepts the following includes:

owner

Delete a tax rate

How to delete a tax rate:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/tax_rates/b018f5dc-4f78-414a-8728-22d47be42893'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "b018f5dc-4f78-414a-8728-22d47be42893",
      "type": "tax_rates",
      "attributes": {
        "created_at": "2026-11-02T15:14:02.000000+00:00",
        "updated_at": "2026-11-02T15:14:02.000000+00:00",
        "name": "VAT",
        "value": 21.0,
        "position": 1,
        "owner_id": "6af038f1-d8e7-4001-8ce9-f365ecd2b6e1",
        "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 separated fields to include instead of the default fields. ?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:

Relationships

Name Description
tax_rates Tax rates hasmany
The different rates that need to be charged.
Rates can be created/updated through the TaxRegion resource by writing the tax_rates_attributes attrinute.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
archived boolean readonly
Whether tax region is archived.
archived_at datetime readonly nullable
When the tax region was archived.
created_at datetime readonly
When the resource was created.
default boolean
Whether this is the default tax region. Setting this value to true will set other tax regions to false.
id uuid readonly
Primary key.
name string
Name of the tax region.
strategy enum
The strategy to apply.
One of: add_to, replace, compound.
tax_rates_attributes array writeonly
The tax rates to associate.
updated_at datetime readonly
When the resource was last updated.

List tax regions

How to fetch a list of tax regions:

  curl --get 'https://example.booqable.com/api/boomerang/tax_regions'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "00e98201-6b1e-49d8-8bf0-02d5617ef164",
        "created_at": "2016-02-27T03:13:02.000000+00:00",
        "updated_at": "2016-02-27T03:13:02.000000+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
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[tax_regions]=created_at,updated_at,archived
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=tax_rates
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
archived boolean
eq
archived_at datetime
eq, not_eq, gt, gte, lt, lte
created_at datetime
eq, not_eq, gt, gte, lt, lte
default boolean
eq
id uuid
eq, not_eq
name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
strategy string_enum
eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request accepts the following includes:

tax_rates

Fetch a tax region

How to fetch a tax regions with it's tax rates:

  curl --get 'https://example.booqable.com/api/boomerang/tax_regions/d6cde3c4-b601-40af-8657-a4f48cf21302'
       --header 'content-type: application/json'
       --data-urlencode 'include=tax_rates'

A 200 status response looks like this:

  {
    "data": {
      "id": "d6cde3c4-b601-40af-8657-a4f48cf21302",
      "created_at": "2026-01-16T23:41:03.000000+00:00",
      "updated_at": "2026-01-16T23:41:03.000000+00:00",
      "archived": false,
      "archived_at": null,
      "name": "Sales Tax",
      "strategy": "add_to",
      "default": false,
      "tax_rates": [
        {
          "id": "b78c7a18-26c4-4611-8323-3396afeafcb3",
          "created_at": "2026-01-16T23:41:03.000000+00:00",
          "updated_at": "2026-01-16T23:41:03.000000+00:00",
          "name": "VAT",
          "value": 21.0,
          "position": 1,
          "owner_id": "d6cde3c4-b601-40af-8657-a4f48cf21302",
          "owner_type": "tax_regions"
        }
      ]
    }
  }

HTTP Request

GET /api/boomerang/tax_regions/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[tax_regions]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=tax_rates

Includes

This request accepts the following includes:

tax_rates

Create 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": "c7843334-9eec-427e-8fb1-5c2602357d6c",
      "type": "tax_regions",
      "attributes": {
        "created_at": "2023-02-08T01:43:00.000000+00:00",
        "updated_at": "2023-02-08T01:43:00.000000+00:00",
        "archived": false,
        "archived_at": null,
        "name": "Sales Tax",
        "strategy": "compound",
        "default": false
      },
      "relationships": {
        "tax_rates": {
          "data": [
            {
              "type": "tax_rates",
              "id": "1efc8ba7-d52e-4ca0-8c8a-bca0577db390"
            }
          ]
        }
      }
    },
    "included": [
      {
        "id": "1efc8ba7-d52e-4ca0-8c8a-bca0577db390",
        "type": "tax_rates",
        "attributes": {
          "created_at": "2023-02-08T01:43:00.000000+00:00",
          "updated_at": "2023-02-08T01:43:00.000000+00:00",
          "name": "VAT",
          "value": 21.0,
          "position": 1,
          "owner_id": "c7843334-9eec-427e-8fb1-5c2602357d6c",
          "owner_type": "tax_regions"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

POST /api/boomerang/tax_regions

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[tax_regions]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=tax_rates

Request body

This request accepts the following body:

Name Description
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][name] string
Name of the tax region.
data[attributes][strategy] enum
The strategy to apply.
One of: add_to, replace, compound.
data[attributes][tax_rates_attributes][] array
The tax rates to associate.

Includes

This request accepts the following includes:

tax_rates

Update a tax region

How to update a tax region with tax rates:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/tax_regions/88245673-247e-4ecb-80c3-8d7cb31b5e27'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "88245673-247e-4ecb-80c3-8d7cb31b5e27",
           "type": "tax_regions",
           "attributes": {
             "name": "State Tax",
             "tax_rates_attributes": [
               {
                 "name": "VAT",
                 "value": 9
               },
               {
                 "id": "7da9f478-a463-4ff7-847a-e00d08c59d05",
                 "_destroy": true
               }
             ]
           }
         },
         "include": "tax_rates"
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "88245673-247e-4ecb-80c3-8d7cb31b5e27",
      "type": "tax_regions",
      "attributes": {
        "created_at": "2016-06-23T04:51:02.000000+00:00",
        "updated_at": "2016-06-23T04:51:02.000000+00:00",
        "archived": false,
        "archived_at": null,
        "name": "State Tax",
        "strategy": "add_to",
        "default": false
      },
      "relationships": {
        "tax_rates": {
          "data": [
            {
              "type": "tax_rates",
              "id": "a5b06e94-dc8d-4b81-81e6-f2ef5d7de6ed"
            }
          ]
        }
      }
    },
    "included": [
      {
        "id": "a5b06e94-dc8d-4b81-81e6-f2ef5d7de6ed",
        "type": "tax_rates",
        "attributes": {
          "created_at": "2016-06-23T04:51:02.000000+00:00",
          "updated_at": "2016-06-23T04:51:02.000000+00:00",
          "name": "VAT",
          "value": 9.0,
          "position": 2,
          "owner_id": "88245673-247e-4ecb-80c3-8d7cb31b5e27",
          "owner_type": "tax_regions"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/tax_regions/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[tax_regions]=created_at,updated_at,archived
include string
List of comma seperated relationships to sideload. ?include=tax_rates

Request body

This request accepts the following body:

Name Description
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][name] string
Name of the tax region.
data[attributes][strategy] enum
The strategy to apply.
One of: add_to, replace, compound.
data[attributes][tax_rates_attributes][] array
The tax rates to associate.

Includes

This request accepts the following includes:

tax_rates

Delete a tax region

How to delete a tax region:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/tax_regions/68a1ae1a-245f-45d0-8494-0502c65f562e'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "68a1ae1a-245f-45d0-8494-0502c65f562e",
      "type": "tax_regions",
      "attributes": {
        "created_at": "2021-03-28T15:14:00.000000+00:00",
        "updated_at": "2021-03-28T15:14:00.000000+00:00",
        "archived": true,
        "archived_at": "2021-03-28T15:14:00.000000+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 separated fields to include instead of the default fields. ?fields[tax_regions]=created_at,updated_at,archived

Includes

This request does not accept any includes

Tax values

Tax values are generated automatically by price calculations for Orders and Carts. They hold information about the amount taxed for a specific rate.

Relationships

Name Description
owner Order required
The order or cart.
tax_rate Tax rate required
The rate used to calculated this tax.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
created_at datetime readonly
When the resource was created.
id uuid readonly
Primary key.
name string readonly
Name of the tax rate.
owner_id uuid readonly
The order or cart.
owner_type string readonly
The resource type of the owner.
percentage float readonly
The percentage taxed.
tax_rate_id uuid readonly
The rate used to calculated this tax.
updated_at datetime readonly
When the resource was last updated.
value_in_cents integer readonly
Amount of tax in cents.

List tax values

How to fetch a list of tax values:

  curl --get 'https://example.booqable.com/api/boomerang/tax_values'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "806d7c35-3f4c-4c1b-8766-11c9f012e6f2",
        "type": "tax_values",
        "attributes": {
          "created_at": "2018-04-23T02:36:00.000000+00:00",
          "updated_at": "2018-04-23T02:36:00.000000+00:00",
          "name": "VAT 19%",
          "percentage": 19.0,
          "value_in_cents": 13800,
          "tax_rate_id": "67d4d696-b147-4a30-8f26-413641077ca6",
          "owner_id": "bc39e751-ea2e-4f5c-879d-4bc23d403698",
          "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 separated fields to include instead of the default fields. ?fields[tax_values]=created_at,updated_at,name
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
name 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
percentage float
eq, not_eq, gt, gte, lt, lte
tax_rate_id uuid
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte
value_in_cents integer
eq, not_eq, gt, gte, lt, lte

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

Fetch a tax value

How to fetch a tax value:

  curl --get 'https://example.booqable.com/api/boomerang/tax_values/af3a48e5-050f-4556-89e6-e863b75c268a'
       --header 'content-type: application/json'
       --data-urlencode 'include=owner'

A 200 status response looks like this:

  {
    "data": {
      "id": "af3a48e5-050f-4556-89e6-e863b75c268a",
      "type": "tax_values",
      "attributes": {
        "created_at": "2018-02-01T17:33:00.000000+00:00",
        "updated_at": "2018-02-01T17:33:00.000000+00:00",
        "name": "VAT 19%",
        "percentage": 19.0,
        "value_in_cents": 13800,
        "tax_rate_id": "badc9624-dce0-4222-87c1-62dd12ef84f4",
        "owner_id": "fb0af3c4-01e8-4dce-8fa4-b5e184c08a33",
        "owner_type": "orders"
      },
      "relationships": {
        "owner": {
          "data": {
            "type": "orders",
            "id": "fb0af3c4-01e8-4dce-8fa4-b5e184c08a33"
          }
        }
      }
    },
    "included": [
      {
        "id": "fb0af3c4-01e8-4dce-8fa4-b5e184c08a33",
        "type": "orders",
        "attributes": {
          "created_at": "2018-02-01T17:33:00.000000+00:00",
          "updated_at": "2018-02-01T17:33:00.000000+00:00",
          "number": null,
          "status": "new",
          "statuses": [
            "new"
          ],
          "status_counts": {
            "new": 0,
            "concept": 0,
            "reserved": 0,
            "started": 0,
            "stopped": 0
          },
          "starts_at": "2018-01-30T17:20:00.000000+00:00",
          "stops_at": "2018-02-03T17:20: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,
          "delivery_address_property_id": null,
          "fulfillment_type": "pickup",
          "customer_id": null,
          "tax_region_id": null,
          "coupon_id": null,
          "start_location_id": "85f56930-46f4-40f6-8df3-e14cb405b347",
          "stop_location_id": "85f56930-46f4-40f6-8df3-e14cb405b347"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/tax_values/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[tax_values]=created_at,updated_at,name
include string
List of comma seperated relationships to sideload. ?include=owner

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.

Relationships

Name Description
destination_location Location required
Location to which the product need to be transfered to.
item Item required
The product that needs to be transferred.
order Order required
The order for which the product is required.
source_location Location required
Location from which the product needs to be transfered.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
available_at datetime
Date when item should be available at destination location.
created_at datetime readonly
When the resource was created.
destination_location_id uuid
Location to which the product need to be transfered to.
finalized boolean
Whether or not the transfer has completed.
id uuid readonly
Primary key.
item_id uuid
The product that needs to be transferred.
order_id uuid
The order for which the product is required.
quantity integer
Quantity of items being transfered.
source_location_id uuid
Location from which the product needs to be transfered.
updated_at datetime readonly
When the resource was last updated.

List transfers

How to fetch a list of transfers:

  curl --get 'https://example.booqable.com/api/boomerang/transfers'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "6f5d421b-37d1-4f12-8170-d8bb4b8ce0b8",
        "type": "transfers",
        "attributes": {
          "created_at": "2028-08-08T18:28:00.000000+00:00",
          "updated_at": "2028-08-08T18:28:00.000000+00:00",
          "quantity": 1,
          "available_at": "2028-08-06T18:15:00.000000+00:00",
          "finalized": false,
          "item_id": "672d6735-92fa-4198-8145-116e1191847d",
          "order_id": "058a8f0f-d1ac-4363-8778-a6c4476ee292",
          "source_location_id": "1773d662-6eb3-4dae-8736-31948f79df75",
          "destination_location_id": "1773d662-6eb3-4dae-8736-31948f79df75"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/transfers

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[transfers]=created_at,updated_at,quantity
filter hash
The filters to apply ?filter[attribute][eq]=value
include string
List of comma seperated relationships to sideload. ?include=order,item,source_location
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
available_at datetime
eq, not_eq, gt, gte, lt, lte
created_at datetime
eq, not_eq, gt, gte, lt, lte
destination_location_id uuid
eq, not_eq
finalized boolean
eq
id uuid
eq, not_eq
item_id uuid
eq, not_eq
order_id uuid
eq, not_eq
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
source_location_id uuid
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

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

User invitations

Creating a user will send an invitation to the user. If that email message is lost or deleted, use this to resend the invitation email so the user can confirm their email before the account is active.

Relationships

Name Description
user User required
The user to send the invitation to.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
id uuid readonly
Primary key.
user_id uuid
The user to send the invitation to.

Re-invite a user

How to re-invite a user:

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/user_invitations'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "user_invitations",
           "attributes": {
             "user_id": "c8075239-a5b3-4523-8ca2-84e0023813d1"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "32dbf20f-66cb-4977-88ec-8ec42fbddc6a",
      "type": "user_invitations",
      "attributes": {
        "user_id": "c8075239-a5b3-4523-8ca2-84e0023813d1"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/user_invitations

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[user_invitations]=user_id

Request body

This request accepts the following body:

Name Description
data[attributes][user_id] uuid
The user to send the invitation to.

Includes

This request does not accept any includes

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)

Relationships

Name Description
customer Customer required
Customer who owns this account.
notes Notes hasmany
Notes about this user.

Check matching attributes under Fields to see which relations can be written.
Check each individual operation to see which relations can be included as a sideload.

Fields

Name Description
created_at datetime readonly
When the resource was created.
customer_id uuid readonly-after-create
Customer who owns this account.
disabled boolean writeonly
When a user is disabled they cannot log into their account or create orders.
email string readonly-after-create
The email of the user.
first_name string
The first name of the user.
id uuid readonly
Primary key.
last_name string
The last name of the user.
name string
The full name of the user (first_name + last_name).
status enum readonly
Status.
One of: disabled, active, invited, unconfirmed.
updated_at datetime readonly
When the resource was last updated.

List users

How to fetch a list of users:

  curl --get 'https://example.booqable.com/api/boomerang/users'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "ca08d52a-c5d9-433f-8774-bd964a456f31",
        "type": "users",
        "attributes": {
          "created_at": "2028-10-16T13:17:01.000000+00:00",
          "updated_at": "2028-10-16T13:17:01.000000+00:00",
          "first_name": "John",
          "last_name": "Doe",
          "name": "John Doe",
          "email": "[email protected]",
          "status": "active",
          "customer_id": "7e745c70-f3c2-47be-8ac6-3f11e3ce374b"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

How to find users belonging to a customer:

  curl --get 'https://example.booqable.com/api/boomerang/users'
       --header 'content-type: application/json'
       --data-urlencode 'filter[customer_id]=fe7b81ca-a0ac-425d-8618-2e1929b46bc8'
       --data-urlencode 'include=customer'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "dbbce813-8d54-47d6-8b4d-eec5b28c878c",
        "type": "users",
        "attributes": {
          "created_at": "2023-08-23T07:33:01.000000+00:00",
          "updated_at": "2023-08-23T07:33:01.000000+00:00",
          "first_name": "John",
          "last_name": "Doe",
          "name": "John Doe",
          "email": "[email protected]",
          "status": "active",
          "customer_id": "fe7b81ca-a0ac-425d-8618-2e1929b46bc8"
        },
        "relationships": {}
      }
    ],
    "meta": {}
  }

HTTP Request

GET /api/boomerang/users

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[users]=created_at,updated_at,first_name
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
created_at datetime
eq, not_eq, gt, gte, lt, lte
customer_id uuid
eq, not_eq
email string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
first_name string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match
id uuid
eq, not_eq
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
status string_enum
eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request does not accept any includes

Fetch a user

How to fetch a user:

  curl --get 'https://example.booqable.com/api/boomerang/users/c92780ab-5df7-4cbd-8435-a2c09cee05e8'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "c92780ab-5df7-4cbd-8435-a2c09cee05e8",
      "type": "users",
      "attributes": {
        "created_at": "2023-09-28T12:54:04.000000+00:00",
        "updated_at": "2023-09-28T12:54:04.000000+00:00",
        "first_name": "John",
        "last_name": "Doe",
        "name": "John Doe",
        "email": "[email protected]",
        "status": "active",
        "customer_id": "d51b343c-b9f4-4080-8923-80d182b6de87"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

GET /api/boomerang/users/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[users]=created_at,updated_at,first_name
include string
List of comma seperated relationships to sideload. ?include=customer,disabled_by,notes

Includes

This request accepts the following includes:

customer

disabled_by

notes

Invite 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": "dbc90081-f163-4c62-8cb3-5b1ecbb19235"
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "75e1d103-6838-433a-8f0d-62737c7a8761",
      "type": "users",
      "attributes": {
        "created_at": "2017-06-05T11:04:00.000000+00:00",
        "updated_at": "2017-06-05T11:04:00.000000+00:00",
        "first_name": "Bob",
        "last_name": "Bobsen",
        "name": "Bob Bobsen",
        "email": "[email protected]",
        "status": "invited",
        "customer_id": "dbc90081-f163-4c62-8cb3-5b1ecbb19235"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/users

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[users]=created_at,updated_at,first_name
include string
List of comma seperated relationships to sideload. ?include=customer,disabled_by,notes

Request body

This request accepts the following body:

Name Description
data[attributes][customer_id] uuid
Customer who owns this account.
data[attributes][disabled] boolean
When a user is disabled they cannot log into their account or create orders.
data[attributes][email] string
The email of the user.
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).

Includes

This request accepts the following includes:

customer

disabled_by

notes

Update a user

How to update a user:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/users/c7e240ef-31fa-4e38-8cb7-cafd7719304c'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "c7e240ef-31fa-4e38-8cb7-cafd7719304c",
           "type": "users",
           "attributes": {
             "first_name": "Bobba"
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "c7e240ef-31fa-4e38-8cb7-cafd7719304c",
      "type": "users",
      "attributes": {
        "created_at": "2021-01-03T08:52:01.000000+00:00",
        "updated_at": "2021-01-03T08:52:01.000000+00:00",
        "first_name": "Bobba",
        "last_name": "Doe",
        "name": "Bobba Doe",
        "email": "[email protected]",
        "status": "active",
        "customer_id": "947c2a92-d6bf-4637-860d-17e82c6dbf1b"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/users/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[users]=created_at,updated_at,first_name
include string
List of comma seperated relationships to sideload. ?include=customer,disabled_by,notes

Request body

This request accepts the following body:

Name Description
data[attributes][customer_id] uuid
Customer who owns this account.
data[attributes][disabled] boolean
When a user is disabled they cannot log into their account or create orders.
data[attributes][email] string
The email of the user.
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).

Includes

This request accepts the following includes:

customer

disabled_by

notes

Enable a user

How to enable a user:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/users/b20174a8-b59e-4d8b-8ae1-af97052ceaae'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "b20174a8-b59e-4d8b-8ae1-af97052ceaae",
           "type": "users",
           "attributes": {
             "disabled": false
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "b20174a8-b59e-4d8b-8ae1-af97052ceaae",
      "type": "users",
      "attributes": {
        "created_at": "2025-07-19T12:22:01.000000+00:00",
        "updated_at": "2025-07-19T12:22:01.000000+00:00",
        "first_name": "John",
        "last_name": "Doe",
        "name": "John Doe",
        "email": "[email protected]",
        "status": "active",
        "customer_id": "a6d008aa-b06a-4337-84f0-23b4ce2148a9"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/users/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[users]=created_at,updated_at,first_name
include string
List of comma seperated relationships to sideload. ?include=customer,disabled_by,notes

Request body

This request accepts the following body:

Name Description
data[attributes][customer_id] uuid
Customer who owns this account.
data[attributes][disabled] boolean
When a user is disabled they cannot log into their account or create orders.
data[attributes][email] string
The email of the user.
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).

Includes

This request accepts the following includes:

customer

disabled_by

notes

Disable a user

How to disable a user:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/users/bf3a537d-192a-4df8-8a92-594008521fef'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "id": "bf3a537d-192a-4df8-8a92-594008521fef",
           "type": "users",
           "attributes": {
             "disabled": true
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "bf3a537d-192a-4df8-8a92-594008521fef",
      "type": "users",
      "attributes": {
        "created_at": "2022-03-25T21:54:00.000000+00:00",
        "updated_at": "2022-03-25T21:54:00.000000+00:00",
        "first_name": "John",
        "last_name": "Doe",
        "name": "John Doe",
        "email": "[email protected]",
        "status": "disabled",
        "customer_id": "79211c5b-e26c-49e8-8199-74af44f213df"
      },
      "relationships": {}
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/users/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[users]=created_at,updated_at,first_name
include string
List of comma seperated relationships to sideload. ?include=customer,disabled_by,notes

Request body

This request accepts the following body:

Name Description
data[attributes][customer_id] uuid
Customer who owns this account.
data[attributes][disabled] boolean
When a user is disabled they cannot log into their account or create orders.
data[attributes][email] string
The email of the user.
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).

Includes

This request accepts the following includes:

customer

disabled_by

notes

Webhook endpoints

Webhook endpoints are used to notify your application when certain events occur in your Booqable account. You can use these events to trigger actions in your application, such as sending an email, updating a record, or creating a new record.

Fields

Name Description
created_at datetime readonly
When the webhook endpoint was first registered.
events array[string]
The events that will trigger the webhook.
One or more from: customer.created, customer.updated, customer.archived, product_group.created, product_group.updated, product_group.archived, product.created, invoice.created, invoice.finalized, invoice.updated, invoice.revised, invoice.archived, contract.created, contract.signed, contract.confirmed, contract.updated, contract.archived, quote.created, quote.signed, quote.confirmed, quote.updated, quote.archived, order.updated, order.saved_as_concept, order.reserved, order.started, order.stopped, payment.completed, cart.completed_checkout, app.installed, app.configured, app.plan_changed, app.uninstalled'.
id uuid readonly
Primary key.
updated_at datetime readonly
When the webhook endpoint was last updated.
url string
The URL that will receive the webhook payload.

List webhook endpoints

How to fetch a list of webhook endpoints:

  curl --get 'https://example.booqable.com/api/boomerang/webhook_endpoints'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": [
      {
        "id": "cb0a7fbd-01d5-485d-82a4-11c5eae2e486",
        "created_at": "2020-05-19T04:30:06.000000+00:00",
        "updated_at": "2020-05-19T04:30:06.000000+00:00",
        "url": "https://example.com/hooks",
        "events": [
          "invoice.finalized"
        ]
      }
    ]
  }

HTTP Request

GET /api/boomerang/webhook_endpoints

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[webhook_endpoints]=created_at,updated_at,url
filter hash
The filters to apply ?filter[attribute][eq]=value
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.
sort string
How to sort the data. ?sort=attribute1,-attribute2

Filters

This request can be filtered on:

Name Description
created_at datetime
eq, not_eq, gt, gte, lt, lte
id uuid
eq, not_eq
updated_at datetime
eq, not_eq, gt, gte, lt, lte
url string
eq, not_eq, eql, not_eql, prefix, not_prefix, suffix, not_suffix, match, not_match

Meta

Results can be aggregated on:

Name Description
total array
count

Includes

This request does not accept any includes

Subscribe to webhook events

How to subscribe to webhook events:

  curl --request POST
       --url 'https://example.booqable.com/api/boomerang/webhook_endpoints'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "webhook_endpoints",
           "attributes": {
             "url": "https://example.com/hooks",
             "events": [
               "customer.created",
               "customer.updated"
             ]
           }
         }
       }'

A 201 status response looks like this:

  {
    "data": {
      "id": "f4855386-6094-4340-8096-0c6911a116cb",
      "type": "webhook_endpoints",
      "attributes": {
        "created_at": "2027-08-01T20:14:01.000000+00:00",
        "updated_at": "2027-08-01T20:14:01.000000+00:00",
        "url": "https://example.com/hooks",
        "events": [
          "customer.created",
          "customer.updated"
        ]
      }
    },
    "meta": {}
  }

HTTP Request

POST /api/boomerang/webhook_endpoints

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[webhook_endpoints]=created_at,updated_at,url

Request body

This request accepts the following body:

Name Description
data[attributes][events] array[string]
The events that will trigger the webhook.
One or more from: customer.created, customer.updated, customer.archived, product_group.created, product_group.updated, product_group.archived, product.created, invoice.created, invoice.finalized, invoice.updated, invoice.revised, invoice.archived, contract.created, contract.signed, contract.confirmed, contract.updated, contract.archived, quote.created, quote.signed, quote.confirmed, quote.updated, quote.archived, order.updated, order.saved_as_concept, order.reserved, order.started, order.stopped, payment.completed, cart.completed_checkout, app.installed, app.configured, app.plan_changed, app.uninstalled'.
data[attributes][url] string
The URL that will receive the webhook payload.

Includes

This request does not accept any includes

Update webhook events

How to update webhook events:

  curl --request PUT
       --url 'https://example.booqable.com/api/boomerang/webhook_endpoints/a2f71717-53b5-45ba-85c6-3eadcf6cb09f'
       --header 'content-type: application/json'
       --data '{
         "data": {
           "type": "webhook_endpoints",
           "id": "a2f71717-53b5-45ba-85c6-3eadcf6cb09f",
           "attributes": {
             "url": "https://example.com/hooks",
             "events": [
               "customer.created"
             ]
           }
         }
       }'

A 200 status response looks like this:

  {
    "data": {
      "id": "a2f71717-53b5-45ba-85c6-3eadcf6cb09f",
      "type": "webhook_endpoints",
      "attributes": {
        "created_at": "2019-07-11T19:29:00.000000+00:00",
        "updated_at": "2019-07-11T19:29:00.000000+00:00",
        "url": "https://example.com/hooks",
        "events": [
          "customer.created"
        ]
      }
    },
    "meta": {}
  }

HTTP Request

PUT /api/boomerang/webhook_endpoints/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[webhook_endpoints]=created_at,updated_at,url

Request body

This request accepts the following body:

Name Description
data[attributes][events] array[string]
The events that will trigger the webhook.
One or more from: customer.created, customer.updated, customer.archived, product_group.created, product_group.updated, product_group.archived, product.created, invoice.created, invoice.finalized, invoice.updated, invoice.revised, invoice.archived, contract.created, contract.signed, contract.confirmed, contract.updated, contract.archived, quote.created, quote.signed, quote.confirmed, quote.updated, quote.archived, order.updated, order.saved_as_concept, order.reserved, order.started, order.stopped, payment.completed, cart.completed_checkout, app.installed, app.configured, app.plan_changed, app.uninstalled'.
data[attributes][url] string
The URL that will receive the webhook payload.

Includes

This request does not accept any includes

Unsubscrib from webhook events

How to unsubscribe from webhook events:

  curl --request DELETE
       --url 'https://example.booqable.com/api/boomerang/webhook_endpoints/fd2f4709-67d8-441e-8206-213a900ef683'
       --header 'content-type: application/json'

A 200 status response looks like this:

  {
    "data": {
      "id": "fd2f4709-67d8-441e-8206-213a900ef683",
      "type": "webhook_endpoints",
      "attributes": {
        "created_at": "2020-12-01T19:32:01.000000+00:00",
        "updated_at": "2020-12-01T19:32:01.000000+00:00",
        "url": "https://example.com/hooks",
        "events": []
      }
    },
    "meta": {}
  }

HTTP Request

DELETE /api/boomerang/webhook_endpoints/{id}

Request params

This request accepts the following parameters:

Name Description
fields[] array
List of comma separated fields to include instead of the default fields. ?fields[webhook_endpoints]=created_at,updated_at,url

Includes

This request does not accept any includes