Download OpenAPI specification:
An account in Calira (formerly Clustermarket) represents an organisation, department, or lab. We have a hierarchical structure following these rules:
graph TD
org[Organisation]
org-->lab0[Lab]
dep1[Department]
dep2[Department]
org-->dep1
dep1-->lab1[Lab]
dep1-->lab2[Lab]
org-->dep2
dep2-->lab3[Lab]
il[Independent Lab]
All endpoints in the Calira (formerly Clustermarket) API support pagination to efficiently handle large datasets. The API uses a custom pagination system with header-based metadata.
page: The page number to retrieve (1-based indexing, default: 1)per_page: Number of records per page (1-100, default: 100, maximum: 100)The API provides pagination metadata in response headers:
X-Total-Records: Total number of records availableX-Current-Page: Current page numberX-Per-Page: Number of records per page# Get first page (default behavior)
GET /equipment?account=123
# Headers: X-Total-Records: 250, X-Current-Page: 1, X-Per-Page: 100
# Get first page with 50 records
GET /equipment?account=123&per_page=50
# Headers: X-Total-Records: 250, X-Current-Page: 1, X-Per-Page: 50
# Get second page with 50 records
GET /equipment?account=123&per_page=50&page=2
# Headers: X-Total-Records: 250, X-Current-Page: 2, X-Per-Page: 50
# Get third page with 25 records
GET /equipment?account=123&per_page=25&page=3
# Headers: X-Total-Records: 250, X-Current-Page: 3, X-Per-Page: 25
# Example: Get all equipment by iterating through pages
# Page 1: GET /equipment?account=123&per_page=100&page=1
# Page 2: GET /equipment?account=123&per_page=100&page=2
# Page 3: GET /equipment?account=123&per_page=100&page=3
# Continue until X-Current-Page * X-Per-Page >= X-Total-Records
Lists all accounts accessible through the integration. The application scope must include read_accounts.
Pagination: This endpoint supports pagination with a default limit of 100 records. Use page and per_page parameters to navigate through large datasets efficiently. Pagination metadata is provided in response headers (X-Total-Records, X-Current-Page, X-Per-Page).
| page | integer >= 1 Default: 1 Page number (1-based indexing, default: 1) |
| per_page | integer [ 1 .. 100 ] Default: 100 Number of records per page (1-100, default: 100, max: 100) |
[- {
- "id": 0,
- "name": "string",
- "account_type": "lab",
- "organisation": 0,
- "department": 0
}
]Get the full details of a specific account. The application scope must include read_accounts.
| id required | integer Account ID |
{- "id": 0,
- "name": "Cambridge Graphene Center",
- "account_type": "lab",
- "sector": "academia",
- "description": "string",
- "timezone": "Europe/London",
- "department": {
- "name": "string",
- "id": 0
}, - "organisation": {
- "name": "string",
- "id": 0
}, - "labs": [
- {
- "id": 0,
- "name": "string"
}
], - "departments": [
- {
- "id": 0,
- "name": "string"
}
]
}Return lists of bookings accessible to the user, optionally scopable to the providing lab account. The application scope must include read_bookings.
Pagination: This endpoint supports pagination with a default limit of 100 records. Use page and per_page parameters to navigate through large datasets efficiently. Pagination metadata is provided in response headers (X-Total-Records, X-Current-Page, X-Per-Page).
| provider_account | number The parent lab account ID. |
| page | integer >= 1 Default: 1 Page number (1-based indexing, default: 1) |
| per_page | integer [ 1 .. 100 ] Default: 100 Number of records per page (1-100, default: 100, max: 100) |
Example response showing multiple bookings
[- {
- "id": 12345,
- "start_time": "2024-01-15T09:00:00.000Z",
- "end_time": "2024-01-15T11:00:00.000Z",
- "status": "Confirmed",
- "booking_type": "internal",
- "equipment_id": 789,
- "user_id": 456,
- "equipment": {
- "name": "Advanced Microscope"
}, - "last_public_note": null
}, - {
- "id": 12346,
- "start_time": "2024-01-16T14:00:00.000Z",
- "end_time": "2024-01-16T16:30:00.000Z",
- "status": "Pending",
- "booking_type": "external",
- "equipment_id": 790,
- "user_id": 457,
- "equipment": {
- "name": "Spectrometer"
}, - "last_public_note": {
- "message": "External booking for research collaboration"
}
}, - {
- "id": 12347,
- "start_time": "2024-01-17T08:00:00.000Z",
- "end_time": "2024-01-17T10:00:00.000Z",
- "status": "Completed",
- "booking_type": "maintenance",
- "equipment_id": 791,
- "user_id": 458,
- "equipment": {
- "name": "Centrifuge"
}, - "last_public_note": null
}
]Return the details about a particular booking as defined by the database identifier. The application scope must include read_bookings.
| id required | integer Booking ID |
Example response showing all booking information
{- "id": 12345,
- "cost": "150.00",
- "currency": "USD",
- "charging_type": "Per Hour",
- "start_time": "2024-01-15T09:00:00.000Z",
- "end_time": "2024-01-15T11:00:00.000Z",
- "requested_at": "2024-01-10T14:30:00.000Z",
- "booking_type": "internal",
- "status": "Confirmed",
- "duration": 120,
- "add_ons": "Data analysis service included",
- "requester_group": {
- "name": "Research Team Alpha"
}, - "equipment": {
- "id": 789,
- "name": "Advanced Microscope"
}, - "parent_equipment": {
- "id": 780,
- "name": "Advanced Microscope (Parent Asset)"
}, - "requester_lab": {
- "id": 101,
- "name": "Materials Science Lab"
}, - "requester_organisation": {
- "id": 201,
- "name": "University of Cambridge"
}, - "provider_lab": {
- "id": 102,
- "name": "Equipment Sharing Lab"
}, - "provider_organisation": {
- "id": 202,
- "name": "Cambridge Research Institute"
}, - "creator": {
- "id": 301,
- "name": "Dr. Jane Smith"
}, - "requester": {
- "id": 456,
- "name": "Dr. John Doe",
- "email": "john.doe@university.edu",
- "sector": "academia"
}, - "custom_form_responses": [
- {
- "response_id": 9001,
- "custom_form_version_id": 1
}, - {
- "response_id": 9002,
- "custom_form_version_id": 2
}
], - "last_public_note": {
- "message": "Please handle with care"
}, - "projects": [
- {
- "id": 501,
- "name": "Graphene Study",
- "supervisor": "Dr. Ada Lovelace",
- "funding_codes": [
- {
- "code": "EPSRC-2026-01",
- "funder": "EPSRC",
- "amount": 5000,
- "currency": "GBP"
}, - {
- "code": "INDUSTRY-2026-02",
- "funder": "Example Industries",
- "amount": 2000,
- "currency": "GBP"
}
]
}, - {
- "id": 502,
- "name": "Nano Surface Analysis",
- "supervisor": "Dr. Alan Turing",
- "funding_codes": [
- {
- "code": "EU-H2020-77",
- "funder": "European Union",
- "amount": 7500,
- "currency": "EUR"
}
]
}
]
}Returns a submitted custom form response linked to a booking. Use this endpoint to retrieve the user-submitted answers for a booking's custom form. The application scope must include read_bookings.
Example request: GET /custom_form_response/16
| id required | integer Custom form response ID |
{- "custom_form_response_id": 16,
- "custom_form_id": 28,
- "custom_form_version_id": 1,
- "booking_reference_id": 2045426,
- "created_by": "Demo Admin",
- "created_at": "2026-04-08T14:13:27.602Z",
- "updated_at": "2026-04-08T14:13:28.075Z",
- "form_response": [
- {
- "type": "heading",
- "text": "Project details"
}, - {
- "type": "paragraph",
- "text": "Provide the requested project information for this booking."
}, - {
- "type": "shortText",
- "text": "Project code",
- "helperText": "Internal reference code",
- "validations": {
- "isRequired": true
}, - "value": "PRJ-2026-0042"
}, - {
- "type": "longText",
- "text": "Experiment summary",
- "helperText": "Brief description of the work",
- "validations": {
- "isRequired": false
}, - "value": "Surface analysis of graphene samples."
}, - {
- "type": "number",
- "text": "Estimated samples",
- "helperText": "Number of samples to be processed",
- "validations": {
- "allowDecimals": true,
- "isRequired": true,
- "minValue": 1,
- "maxValue": 100
}, - "value": 12
}, - {
- "type": "valueUnit",
- "text": "Target thickness",
- "helperText": "Value with nanometer unit",
- "validations": {
- "allowDecimals": true,
- "isRequired": true,
- "unitType": "nm"
}, - "value": 22.5
}, - {
- "type": "dateTime",
- "text": "Requested completion date",
- "helperText": "Date only",
- "validations": {
- "isRequired": false,
- "onlyDate": true
}, - "value": "2026-04-21T23:00:00.000Z"
}, - {
- "type": "radioButton",
- "text": "Sample condition",
- "helperText": "Choose one",
- "options": [
- "Option 1",
- "Option 2"
], - "validations": {
- "isRequired": true
}, - "value": "Option 2"
}, - {
- "type": "dropdown",
- "text": "Analysis method",
- "helperText": "Select the primary method",
- "options": [
- "Option 1",
- "Option 2"
], - "validations": {
- "isRequired": true
}, - "value": "Option 1"
}, - {
- "type": "checkboxGroup",
- "text": "Safety requirements",
- "helperText": "Select all that apply",
- "options": [
- "Option 1",
- "Option 2"
], - "validations": {
- "isRequired": true
}, - "value": [
- "Option 1",
- "Option 2"
]
}, - {
- "type": "fileUpload",
- "text": "Supporting documents",
- "helperText": "Upload any supporting files",
- "validations": {
- "isRequired": false
}, - "value": [
- {
- "signed_id": "eyJfcmFpbHMiOnsiZGF0YSI6MTE3OCwicHVyIjoiYmxvYl9pZCJ9fQ==--be9e4bfde0b70ddcbc4700f1a2ac0d4417af9b93",
- "filename": "project-summary.xlsx"
}
]
}, - {
- "type": "imageUpload",
- "text": "Sample images",
- "helperText": "Upload reference images",
- "validations": {
- "isRequired": false
}, - "value": [
- {
- "signed_id": "eyJfcmFpbHMiOnsiZGF0YSI6MTE3OSwicHVyIjoiYmxvYl9pZCJ9fQ==--6109b8c4568a1687e0b95fc25955d4c52cae4b4e",
- "filename": "sample-image.png"
}
]
}
]
}Lists all equipment under the specified lab. Requires read_equipment scope.
Pagination: This endpoint supports pagination with a default limit of 100 records. Use page and per_page parameters to navigate through large datasets efficiently. Pagination metadata is provided in response headers (X-Total-Records, X-Current-Page, X-Per-Page).
| account | number The target lab account ID |
| exclude_parents | boolean Default: false When true, only child equipment will be returned (no parent equipment) |
| page | integer >= 1 Default: 1 Page number (1-based indexing, default: 1) |
| per_page | integer [ 1 .. 100 ] Default: 100 Number of records per page (1-100, default: 100, max: 100) |
[- {
- "id": 1,
- "name": "William Optics RedCat 71 APO",
- "description": "Apochromatic telescope",
- "room": "Room 101",
- "availability_status": "Available",
- "model": "RedCat 71",
- "manufacturer": "William Optics",
- "sub_category": {
- "id": 1,
- "name": "Audiovisual & IT"
}, - "contact_person": {
- "id": 1,
- "name": "Lisa Millar"
}, - "parent_id": null,
- "parent_name": null
}, - {
- "id": 2,
- "name": "RedCat 71 Eyepiece Set",
- "description": "High-quality eyepiece collection",
- "room": "Room 101",
- "availability_status": "Available",
- "model": "RC71-EP",
- "manufacturer": "William Optics",
- "sub_category": {
- "id": 1,
- "name": "Audiovisual & IT"
}, - "contact_person": {
- "id": 1,
- "name": "Lisa Millar"
}, - "parent_id": 1,
- "parent_name": "William Optics RedCat 71 APO"
}
]Returns details about a particular piece of equipment. Requires the equipment ID, and the application scope must include read_equipment.
| id required | integer Equipment ID |
{- "id": 0,
- "name": "string",
- "room": "string",
- "manufacturer": "string",
- "model": "string",
- "city": "string",
- "country": "string",
- "currency": "string",
- "charging_type": "string",
- "description": "string",
- "category": {
- "name": "string"
}, - "lab": {
- "id": 0,
- "name": "string"
}, - "parent_id": 0,
- "parent_name": "string",
- "manufacturing_year": "string",
- "serial_number": "string"
}Returns bookings about a particular piece of equipment. Requires the equipment ID, and the application scope must include read_equipment.
Pagination: This endpoint supports pagination with a default limit of 100 records. Use page and per_page parameters to navigate through large datasets efficiently. Pagination metadata is provided in response headers (X-Total-Records, X-Current-Page, X-Per-Page).
| id required | integer Unique ID of the equipment |
| page | integer >= 1 Default: 1 Page number (1-based indexing, default: 1) |
| per_page | integer [ 1 .. 100 ] Default: 100 Number of records per page (1-100, default: 100, max: 100) |
[- {
- "id": 1,
- "asset_id": 1,
- "start_time": "2022-03-08T09:00:00.000+00:00",
- "end_time": "2022-03-08T11:00:00.000+00:00",
- "status": "Requested"
}
]Lists all projects under the specified account. Requires read_projects scope.
Pagination: This endpoint supports pagination with a default limit of 100 records. Use page and per_page parameters to navigate through large datasets efficiently. Pagination metadata is provided in response headers (X-Total-Records, X-Current-Page, X-Per-Page).
| account_id required | integer Account ID |
| page | integer >= 1 Default: 1 Page number (1-based indexing, default: 1) |
| per_page | integer [ 1 .. 100 ] Default: 100 Number of records per page (1-100, default: 100, max: 100) |
[- {
- "id": 0,
- "name": "string",
- "created_by": {
- "id": 0,
- "name": "string"
}, - "supervisor": "string",
- "funding_codes": [
- {
- "id": 0,
- "name": "string"
}
]
}
]Get the full details of a specific project. Requires read_projects scope.
| account_id required | integer Account ID |
| id required | integer Project ID |
{- "name": "Project 31",
- "supervisor": "Niklas",
- "additional_information": null,
- "funding_codes": [
- {
- "id": 914,
- "name": "CD60",
- "funder_name": "UKRI - AHRC",
- "funder_type": "research_council",
- "expiry_date": "2026-09-12",
- "allocated_amount": 0.2,
- "spent_amount": 0
}, - {
- "id": 915,
- "name": "CD61",
- "funder_name": "UKRI - AHRC",
- "funder_type": "research_council",
- "expiry_date": "2026-09-12",
- "allocated_amount": 0.2,
- "spent_amount": 0
}
], - "selected_users": [ ]
}Lists all groups under the specified lab. Requires read_accounts scope.
Pagination: This endpoint supports pagination with a default limit of 100 records. Use page and per_page parameters to navigate through large datasets efficiently. Pagination metadata is provided in response headers (X-Total-Records, X-Current-Page, X-Per-Page).
| account | number The target lab account ID |
| page | integer >= 1 Default: 1 Page number (1-based indexing, default: 1) |
| per_page | integer [ 1 .. 100 ] Default: 100 Number of records per page (1-100, default: 100, max: 100) |
[- {
- "id": 0,
- "name": "string"
}
]Get the full details of a specific group. The application scope must include read_accounts.
| id required | integer Group ID |
{- "id": 0,
- "name": "string",
- "equipment": [
- {
- "id": 0,
- "name": "string"
}
]
}