Facilities & Units API
Organize your assets with a hierarchical location structure. Define facilities (buildings, plants) and units (production lines, cells, areas) to group machines and track assets by location.
11 FeaturesLocation HierarchyAsset Organization
Overview
Hierarchy
Organization
└── Facility (Building/Plant)
└── Unit (Line/Cell/Area)
└── MachineUse Cases
- • Group machines by building
- • Filter assets by production line
- • Generate location-based reports
- • Navigate physical layout
Facilities
Facilities represent physical locations like buildings, plants, or sites where your equipment is located.
GET
/v1/facilitiesAuth RequiredList Facilities
Get all facilities in the organization.
Parameters
include_unitsbooleanInclude nested units
include_machine_countbooleanInclude machine counts
Response
Responsejson
{
"facilities": [
{
"id": "fac_001",
"name": "Main Plant",
"description": "Primary manufacturing facility",
"address": "123 Industrial Drive, City, State 12345",
"coordinates": {
"latitude": 40.7128,
"longitude": -74.0060
},
"units_count": 5,
"machines_count": 25,
"created_at": "2024-01-15T10:00:00Z"
},
{
"id": "fac_002",
"name": "West Building",
"description": "Assembly and testing area",
"address": "125 Industrial Drive, City, State 12345",
"units_count": 3,
"machines_count": 12,
"created_at": "2024-02-20T14:30:00Z"
}
],
"total": 2
}Try it out
cURLbash
curl -X GET "https://sapienstream.com/api/v1/facilities" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"POST
/v1/facilitiesAuth RequiredCreate Facility
Create a new facility location.
Request Body
Requestjson
{
"name": "East Campus",
"description": "New expansion facility",
"address": "500 Technology Parkway, City, State 12345",
"coordinates": {
"latitude": 40.7200,
"longitude": -74.0100
},
"metadata": {
"square_footage": 50000,
"year_built": 2024
}
}Response
Responsejson
{
"id": "fac_003",
"name": "East Campus",
"description": "New expansion facility",
"address": "500 Technology Parkway, City, State 12345",
"coordinates": {
"latitude": 40.7200,
"longitude": -74.0100
},
"metadata": {
"square_footage": 50000,
"year_built": 2024
},
"created_at": "2024-08-26T15:30:00Z"
}Try it out
cURLbash
curl -X POST "https://sapienstream.com/api/v1/facilities" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"GET
/v1/facilities/{facility_id}Auth RequiredGet Facility
Get a specific facility with its units and machines.
Parameters
facility_idstringRequiredFacility identifier
Response
Responsejson
{
"id": "fac_001",
"name": "Main Plant",
"description": "Primary manufacturing facility",
"address": "123 Industrial Drive, City, State 12345",
"units": [
{
"id": "unit_001",
"name": "Production Line A",
"machines_count": 8
},
{
"id": "unit_002",
"name": "Production Line B",
"machines_count": 10
}
],
"total_machines": 25,
"created_at": "2024-01-15T10:00:00Z",
"updated_at": "2024-08-20T12:00:00Z"
}Try it out
cURLbash
curl -X GET "https://sapienstream.com/api/v1/facilities/{facility_id}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"PUT
/v1/facilities/{facility_id}Auth RequiredUpdate Facility
Update facility information.
Parameters
facility_idstringRequiredFacility identifier
Request Body
Requestjson
{
"name": "Main Plant - Building A",
"description": "Updated description",
"metadata": {
"shift_count": 3
}
}Response
Responsejson
{
"id": "fac_001",
"name": "Main Plant - Building A",
"description": "Updated description",
"updated_at": "2024-08-26T16:00:00Z"
}Try it out
cURLbash
curl -X PUT "https://sapienstream.com/api/v1/facilities/{facility_id}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"DELETE
/v1/facilities/{facility_id}Auth RequiredDelete Facility
Delete a facility. Fails if facility contains units with machines.
Parameters
facility_idstringRequiredFacility identifier
Response
Responsejson
{
"deleted": true,
"facility_id": "fac_003"
}Try it out
cURLbash
curl -X DELETE "https://sapienstream.com/api/v1/facilities/{facility_id}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"Units
Units are subdivisions within facilities, such as production lines, work cells, or areas.
GET
/v1/unitsAuth RequiredList Units
Get all units, optionally filtered by facility.
Parameters
facility_idstringFilter by facility
include_machinesbooleanInclude machine list
Response
Responsejson
{
"units": [
{
"id": "unit_001",
"name": "Production Line A",
"description": "High-volume CNC machining line",
"facility_id": "fac_001",
"facility_name": "Main Plant",
"machines_count": 8,
"created_at": "2024-01-20T10:00:00Z"
},
{
"id": "unit_002",
"name": "Production Line B",
"description": "Precision parts manufacturing",
"facility_id": "fac_001",
"facility_name": "Main Plant",
"machines_count": 10,
"created_at": "2024-01-22T14:00:00Z"
}
],
"total": 8
}Try it out
cURLbash
curl -X GET "https://sapienstream.com/api/v1/units" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"POST
/v1/unitsAuth RequiredCreate Unit
Create a new unit within a facility.
Request Body
Requestjson
{
"facility_id": "fac_001",
"name": "Assembly Cell C",
"description": "Final assembly and testing",
"metadata": {
"capacity": 5,
"cell_type": "assembly"
}
}Response
Responsejson
{
"id": "unit_new_001",
"facility_id": "fac_001",
"name": "Assembly Cell C",
"description": "Final assembly and testing",
"metadata": {
"capacity": 5,
"cell_type": "assembly"
},
"machines_count": 0,
"created_at": "2024-08-26T15:30:00Z"
}Try it out
cURLbash
curl -X POST "https://sapienstream.com/api/v1/units" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"GET
/v1/units/{unit_id}Auth RequiredGet Unit
Get a specific unit with its machines.
Parameters
unit_idstringRequiredUnit identifier
Response
Responsejson
{
"id": "unit_001",
"name": "Production Line A",
"description": "High-volume CNC machining line",
"facility": {
"id": "fac_001",
"name": "Main Plant"
},
"machines": [
{
"id": "mach_001",
"name": "CNC Mill #1",
"model": "VMC-850"
},
{
"id": "mach_002",
"name": "CNC Mill #2",
"model": "VMC-850"
}
],
"machines_count": 8,
"created_at": "2024-01-20T10:00:00Z"
}Try it out
cURLbash
curl -X GET "https://sapienstream.com/api/v1/units/{unit_id}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"PUT
/v1/units/{unit_id}Auth RequiredUpdate Unit
Update unit information.
Parameters
unit_idstringRequiredUnit identifier
Request Body
Requestjson
{
"name": "Production Line A - High Speed",
"description": "Updated: High-speed CNC machining line"
}Response
Responsejson
{
"id": "unit_001",
"name": "Production Line A - High Speed",
"updated_at": "2024-08-26T16:00:00Z"
}Try it out
cURLbash
curl -X PUT "https://sapienstream.com/api/v1/units/{unit_id}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"DELETE
/v1/units/{unit_id}Auth RequiredDelete Unit
Delete a unit. Machines must be reassigned first.
Parameters
unit_idstringRequiredUnit identifier
Response
Responsejson
{
"deleted": true,
"unit_id": "unit_003"
}Try it out
cURLbash
curl -X DELETE "https://sapienstream.com/api/v1/units/{unit_id}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"Machine Location Assignment
PUT
/v1/machines/{machine_id}/locationAuth RequiredAssign Machine Location
Assign or move a machine to a facility/unit.
Parameters
machine_idstringRequiredMachine identifier
Request Body
Requestjson
{
"facility_id": "fac_001",
"unit_id": "unit_001"
}Response
Responsejson
{
"machine_id": "mach_001",
"location": {
"facility_id": "fac_001",
"facility_name": "Main Plant",
"unit_id": "unit_001",
"unit_name": "Production Line A"
},
"previous_location": {
"facility_id": "fac_002",
"unit_id": "unit_005"
},
"updated_at": "2024-08-26T15:30:00Z"
}Try it out
cURLbash
curl -X PUT "https://sapienstream.com/api/v1/machines/{machine_id}/location" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"Location Hierarchy Example
// Build location tree for facility selector
async function buildLocationTree() {
const facilities = await fetch('/api/facilities?include_units=true')
.then(r => r.json());
return facilities.facilities.map(facility => ({
id: facility.id,
label: facility.name,
type: 'facility',
children: facility.units?.map(unit => ({
id: unit.id,
label: unit.name,
type: 'unit',
machineCount: unit.machines_count
})) || []
}));
}
// Result:
// [
// {
// id: 'fac_001',
// label: 'Main Plant',
// type: 'facility',
// children: [
// { id: 'unit_001', label: 'Production Line A', type: 'unit', machineCount: 8 },
// { id: 'unit_002', label: 'Production Line B', type: 'unit', machineCount: 10 }
// ]
// }
// ]