Create, list, and update sites using the same OAuth client credentials (API key) used for Employee Sync and Asset Sync. All operations are scoped to your organization.
All endpoints require the same API key (Bearer token or Basic auth) you use for Employee Sync and Asset Sync. See Authentication for how to obtain and use credentials.
Returns all sites in your organization. Use activeOnly=true to exclude inactive sites (e.g. for assignment pickers).
GET /api/v1/sites
Authorization: Bearer <your_token>
# Optional: only active sites
GET /api/v1/sites?activeOnly=trueHTTP/1.1 200 OK
Content-Type: application/json
[
{
"id": "site_123",
"name": "Warehouse North",
"code": "WH-N",
"qrSlug": "org-1-site-123",
"organizationId": "org_1",
"isActive": true,
"address": "100 Industrial Blvd",
"addressLine1": "100 Industrial Blvd",
"addressLine2": "Suite 2",
"city": "Chicago",
"country": "USA",
"createdAt": "2026-01-10T09:15:32.000Z",
"updatedAt": "2026-01-10T09:15:32.000Z"
}
]Returns a single site by ID. The site must belong to your organization.
GET /api/v1/sites/{siteId}
Authorization: Bearer <your_token>HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "site_123",
"name": "Warehouse North",
"code": "WH-N",
"qrSlug": "org-1-site-123",
"organizationId": "org_1",
"isActive": true,
"address": "100 Industrial Blvd",
"addressLine1": "100 Industrial Blvd",
"addressLine2": "Suite 2",
"city": "Chicago",
"country": "USA",
"createdAt": "2026-01-10T09:15:32.000Z",
"updatedAt": "2026-01-10T09:15:32.000Z"
}name is required. code, addressLine1, addressLine2, city, and country are optional. New sites are created as active.
POST /api/v1/sites
Authorization: Bearer <your_token>
Content-Type: application/json
{
"name": "Warehouse North",
"code": "WH-N",
"addressLine1": "100 Industrial Blvd",
"addressLine2": "Suite 2",
"city": "Chicago",
"country": "USA"
}HTTP/1.1 201 Created
Content-Type: application/json
{
"id": "site_123",
"name": "Warehouse North",
"code": "WH-N",
"qrSlug": "org-1-site-123",
"organizationId": "org_1",
"isActive": true,
"address": "100 Industrial Blvd",
"addressLine1": "100 Industrial Blvd",
"addressLine2": "Suite 2",
"city": "Chicago",
"country": "USA",
"createdAt": "2026-01-10T09:15:32.000Z",
"updatedAt": "2026-01-10T09:15:32.000Z"
}PUT updates the full site (send all fields you want to keep). PATCH updates only the fields you send (e.g. { "isActive": false } to mark a site inactive). Inactive sites are hidden from assignment pickers but assets and users keep their assignment.
PUT /api/v1/sites/{siteId}
Authorization: Bearer <your_token>
Content-Type: application/json
{
"name": "Warehouse North (Updated)",
"code": "WH-N",
"addressLine1": "100 Industrial Blvd",
"city": "Chicago",
"country": "USA",
"isActive": true
}HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "site_123",
"name": "Warehouse North (Updated)",
"code": "WH-N",
"qrSlug": "org-1-site-123",
"organizationId": "org_1",
"isActive": true,
"address": "100 Industrial Blvd",
"addressLine1": "100 Industrial Blvd",
"addressLine2": "Suite 2",
"city": "Chicago",
"country": "USA",
"createdAt": "2026-01-10T09:15:32.000Z",
"updatedAt": "2026-01-10T10:00:00.000Z"
}Each site object includes: id, name, code, qrSlug, organizationId, isActive, address, addressLine1, addressLine2, city, country, createdAt, updatedAt.
Same as other v1 APIs (per API key). See Error Handling for details.