Warehouses
CRUD endpoints for warehouse locations — the anchor for stock, documents, and warehouse scoping.
Warehouses API
CRUD endpoints for managing warehouses — the physical or virtual locations that own stock, documents, and numbering sequences. Every financial and inventory entity carries a warehouse_id, so warehouses are the anchor for warehouse scoping across the platform.
Endpoints
| Method | URL | Description |
|---|---|---|
| GET | /api/v1/warehouses |
List warehouses |
| GET | /api/v1/warehouses/{id} |
Show a warehouse |
| POST | /api/v1/warehouses |
Create a warehouse |
| PUT/PATCH | /api/v1/warehouses/{id} |
Update a warehouse |
| DELETE | /api/v1/warehouses/{id} |
Delete a warehouse |
Authentication
Requires a Sanctum bearer token with warehouses:read (GET) or warehouses:write (POST/PUT/PATCH/DELETE) ability, plus the settings.view (read) or settings.manage (write) permission.
List Warehouses
GET /api/v1/warehouses
Filters
Ransack-compatible predicates on the q parameter. id is always filterable.
| Parameter | Description |
|---|---|
q[name_cont]=warehouse |
Name contains |
q[name_eq]=Main Warehouse |
Name equals |
q[id_eq]=3 |
Filter by id |
q[city_eq]=London |
City equals |
q[country_code_eq]=GB |
Country code equals |
q[country_id_eq]=1 |
Filter by country |
q[tax_zone_id_eq]=2 |
Filter by tax zone |
q[is_default_true]=1 |
Only the default warehouse |
Sorts
| Parameter | Description |
|---|---|
sort=name |
Sort by name (ascending) |
sort=-name |
Sort by name (descending) |
sort=city |
Sort by city |
sort=created_at |
Sort by creation date |
Includes
Eager-load relationships with ?include=country,taxZone,customFieldValues. customFieldValues is always loaded so custom_fields is present in every response.
Response
{
"warehouses": [
{
"id": 1,
"name": "Main Warehouse",
"street": "12 Depot Road",
"city": "London",
"county": "Greater London",
"postcode": "E1 6AN",
"country_code": "GB",
"country_id": 1,
"tax_zone_id": 1,
"phone": "+44 20 7946 0000",
"email": "warehouse@example.com",
"timezone": "Europe/London",
"is_default": true,
"is_virtual": false,
"include_in_default_queries": true,
"tag_list": ["primary"],
"custom_fields": {},
"created_at": "2026-01-15T14:30:00.000Z",
"updated_at": "2026-01-15T14:30:00.000Z"
}
],
"meta": {
"total": 1,
"per_page": 20,
"page": 1
}
}
Show Warehouse
GET /api/v1/warehouses/{id}
Response with includes
Request: GET /api/v1/warehouses/1?include=country,taxZone
{
"warehouse": {
"id": 1,
"name": "Main Warehouse",
"country_id": 1,
"tax_zone_id": 1,
"custom_fields": {},
"created_at": "2026-01-15T14:30:00.000Z",
"updated_at": "2026-01-15T14:30:00.000Z",
"country": {
"id": 1,
"name": "United Kingdom"
},
"tax_zone": {
"id": 1,
"name": "UK"
}
}
}
country and tax_zone are omitted from the response unless the matching include is requested. When the include is requested but the warehouse has no country / tax zone set, the key is present with a null value.
Create Warehouse
POST /api/v1/warehouses
{
"name": "North Depot",
"street": "5 Industrial Way",
"city": "Manchester",
"postcode": "M1 1AA",
"country_code": "GB",
"country_id": 1,
"email": "north@example.com"
}
Returns 201 Created.
The first warehouse created is automatically flagged as the default (is_default: true) so warehouse scoping always resolves. Pass is_default: true explicitly to promote a later warehouse to default.
Update Warehouse
PUT/PATCH /api/v1/warehouses/{id}
Standard update pattern — returns 200 OK with the updated warehouse in a warehouse key.
Clearing nullable fields: Omitting a field or sending
nullleaves it unchanged. Only non-null fields in the update payload are applied.
Delete Warehouse
DELETE /api/v1/warehouses/{id}
Standard delete pattern — returns 204 No Content.
Default warehouse guard: The default warehouse cannot be deleted.
DELETEagainst it returns422 Unprocessable Entity:{ "message": "The default warehouse cannot be deleted.", "errors": { "warehouse": ["The default warehouse cannot be deleted."] } }
Webhooks
Warehouse lifecycle events (warehouse.created, warehouse.updated, warehouse.deleted) are dispatched to subscribed endpoints — see Webhooks.
Warehouse scoping
Warehouse-restricted API tokens only ever return warehouse-owned rows for the warehouses their user can access. The warehouses catalogue itself is not warehouse-scoped; see Warehouses for the warehouse-scoping model.