These endpoints do not need an API key. Pass a company id (company_…, or the id without that prefix). Products with Publicly Viewable turned off are left out of every browse call.
Building this into a website? Use the prebuilt components unless you need a custom flow.
Browse times are Unix milliseconds, UTC. Checkout dates are ISO 8601 strings.
| Use | Method | URL |
|---|---|---|
| List products | GET |
https://dash.lockii.app/api/v1/browse/products |
| List locations | GET |
https://dash.lockii.app/api/v1/browse/locations |
| Check a cart | POST |
https://dash.lockii.app/api/v1/browse/availability |
| List time slots | GET |
https://dash.lockii.app/api/v1/browse/time-slots |
| Start checkout | POST |
https://dash.lockii.app/api/customer/checkout |
| Customer checkout page | GET |
https://book.lockii.app |
Typical order: list products and locations, sample time slots for the date picker, check the cart, then create checkout and send the customer to the checkout page.
GET https://dash.lockii.app/api/v1/browse/products
| Query | Required | Details |
|---|---|---|
company_id |
Yes | Company to list |
start_time |
No | Window start, Unix ms UTC. Send with end_time, or send neither |
end_time |
No | Window end, Unix ms UTC |
Without a window, each product includes id, name, description, category, and locations (id, name, openingHours).
With both times, each location also includes hasAvailability, and the product can include priceInCents (integer cents, tax included) and priceFormatted for one unit over that window.
GET https://dash.lockii.app/api/v1/browse/locations
| Query | Required | Details |
|---|---|---|
company_id |
Yes | Company to list |
archived |
No | true returns only archived locations. Omit it for active locations |
The response is { "locations": [ … ] }. Each location includes id, name, and archived.
POST https://dash.lockii.app/api/v1/browse/availability
Content-Type: application/json
| Field | Required | Details |
|---|---|---|
company_id |
Yes | Company id |
location_id |
Yes | Pickup and return location |
start_time |
Yes | Window start, Unix ms UTC |
end_time |
Yes | Window end, Unix ms UTC |
cart |
Yes | Lines of product_id and quantity |
The response includes available, total_price_cents (tax included, same rules as Lockii checkout), and lines. Each line has product_id, quantity, unit_period_price_cents, and line_subtotal_cents.
This does not reserve stock. Creating checkout is the booking.
GET https://dash.lockii.app/api/v1/browse/time-slots
| Query | Required | Details |
|---|---|---|
company_id |
Yes | Company id |
product_id |
Yes | Product to sample |
location_id |
Yes | Location to sample |
start_time |
Yes | Window start, Unix ms UTC |
end_time |
Yes | Window end, Unix ms UTC |
interval |
No | 15m (default) or day |
interval=15m allows up to 48 hours. interval=day allows up to 7 days.
The response is { "slots": [ { "start_ms": …, "available_count": … } ] }, sorted by start_ms. available_count is how many units are free at that slot.
POST https://dash.lockii.app/api/customer/checkout
Content-Type: application/json
Creates the order and returns { "id": "…" }. No API key.
| Field | Required | Details |
|---|---|---|
companyId |
Yes | Company id |
locationId |
Yes | Pickup and return location |
lineItems |
Yes | Lines of productID and quantity |
fromDate |
Yes | Start, ISO 8601 |
toDate |
Yes | End, ISO 8601. Must be after fromDate and in the future |
stockId |
No | Book one specific unit. Single-item bookings only |
Send the customer to the checkout page. {company} is the company id with the company_ prefix removed:
https://book.lockii.app/{company}/checkout?order={id}
Lockii collects customer details and payment on that page.
| Status | Meaning |
|---|---|
| 400 | Missing or invalid parameters, or the product or location was not found |
| 404 | Company id is missing, unknown, or the company is not active |
| 500 | Server error |
Browse errors look like { "error": "Bad request", "message": "company_id is required" }.