The Interloom API provides programmatic access to every entity in the platform. All operations available in the UI are also available via the API.
Currently live: This reference is published ahead of general availability, and only a small set of endpoints is callable today. Browse the preview API reference to see what’s live, or point your agents at the OpenAPI spec.
Authentication
All requests require a bearer token in the Authorization header:
Authorization: Bearer YOUR_API_KEY
API keys are scoped to an organization. Contact your administrator to generate a key, or create one under Settings → Personal Access Tokens if you have admin access.
Base URL
https://app.interloom.com/api/v1/public
If your organization is on a dedicated instance, swap the host for your instance domain:
https://YOUR_INSTANCE.interloom.com/api/v1/public
Response Format
Successful responses return the resource payload at the top level. Metadata is returned in response headers.
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Northwest Claims Intake",
"created_at": "2025-01-15T09:30:00Z"
}
X-Request-Id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
X-Response-Timestamp: 2025-01-15T09:30:00Z
List endpoints use cursor pagination and return results in a data envelope with pagination metadata:
{
"data": [
...
],
"next_cursor": "eyJjcmVhdGVkX2F0IjoiLi4uIiwiaWQiOiIuLi4ifQ",
"has_more": true
}
Paginated endpoints accept:
| Parameter | Type | Description |
|---|---|---|
limit | integer | Maximum number of items to return, capped at a server-enforced maximum. |
cursor | string | Opaque cursor from the previous response’s next_cursor. |
sort | string | Field to sort by. Supported fields vary by endpoint; common fields include created_at and updated_at. |
direction | string | Sort direction: asc or desc. |
GET /cases?limit=50&cursor=eyJjcmVhdGVkX2F0IjoiLi4uIiwiaWQiOiIuLi4ifQ
When has_more is false, you have reached the last page. Ordering is stable: results are sorted by the selected sort field with id as a tie-breaker, and the cursor encodes both.
List endpoints that support sorting use sort for the field and direction for the order. The default is endpoint-specific; when unspecified, results are normally ordered by newest created item first.
GET /cases?sort=updated_at&direction=desc
Spaces
| Method | Endpoint | Description |
|---|---|---|
| GET | /spaces | List spaces in the organization |
| POST | /spaces | Create a new space |
| GET | /spaces/{id} | Get a space by ID |
| PATCH | /spaces/{id} | Update a space |
| GET | /spaces/{id}/members | List space memberships |
| POST | /spaces/{id}/members | Add a member to a space |
Cases
| Method | Endpoint | Description |
|---|---|---|
| GET | /cases | List cases (filterable by space, phase, motion, priority) |
| POST | /cases | Create a new case |
| GET | /cases/{id} | Get a case by ID |
| PATCH | /cases/{id} | Update a case (title, description, priority, assignment) |
| POST | /cases/{id}/commence | Transition from intake to active |
| POST | /cases/{id}/resolve | Transition to resolved |
| POST | /cases/{id}/reopen | Reopen a resolved case (requires reason) |
| POST | /cases/{id}/close | Transition to closed (terminal) |
| PATCH | /cases/{id}/motion | Set motion (working, waiting, blocked, paused) |
| GET | /cases/{id}/subcases | List subcases of a case |
Filtering Cases
The GET /cases endpoint supports query parameters:
| Parameter | Type | Example |
|---|---|---|
space_id | uuid | Filter by space |
phase | enum | active, intake, resolved, closed |
motion | enum | working, waiting, blocked, paused, idle |
priority | enum | critical, high, medium, low |
assigned_actor_id | uuid | Filter by assigned actor |
procedure_id | uuid | Filter by procedure |
Stages
| Method | Endpoint | Description |
|---|---|---|
| GET | /cases/{id}/stages | List stages for a case |
| GET | /stages/{id} | Get a stage by ID |
| PATCH | /stages/{id} | Update a stage (assignment, motion) |
| POST | /stages/{id}/complete | Mark stage as completed |
| POST | /stages/{id}/skip | Mark stage as skipped |
| POST | /stages/{id}/spawn-subcase | Spawn a subcase from this stage |
Instructions
| Method | Endpoint | Description |
|---|---|---|
| GET | /stages/{id}/instructions | List instructions for a stage |
| POST | /stages/{id}/instructions | Add an instruction to a stage |
| PATCH | /instructions/{id} | Update an instruction |
| POST | /instructions/{id}/complete | Mark instruction as completed |
Procedures
| Method | Endpoint | Description |
|---|---|---|
| GET | /procedures | List procedures (filterable by space) |
| POST | /procedures | Create a new procedure |
| GET | /procedures/{id} | Get a procedure by ID |
| PATCH | /procedures/{id} | Update a procedure |
| GET | /procedures/{id}/stages | List procedure stage templates |
| POST | /procedures/{id}/stages | Add a stage template to a procedure |
| POST | /cases/{id}/apply-procedure | Apply a procedure to an existing case |
Actors
| Method | Endpoint | Description |
|---|---|---|
| GET | /actors | List actors in the organization |
| POST | /actors | Create an actor (human or AI) |
| GET | /actors/{id} | Get an actor by ID |
| PATCH | /actors/{id} | Update an actor |
AI Actor Configuration
When creating an AI actor, include the agent configuration:
{
"type": "ai",
"name": "Claims Triage Agent",
"model_id": "claude-sonnet-4-5-20250929",
"system_prompt": "You are a claims triage specialist...",
"capabilities": ["triage", "document-review", "correspondence"]
}
Threads
| Method | Endpoint | Description |
|---|---|---|
| GET | /threads | List threads (filterable by space, case) |
| POST | /threads | Create a standalone thread |
| GET | /threads/{id} | Get a thread by ID |
| GET | /threads/{id}/activities | List activities in a thread |
| POST | /threads/{id}/activities | Post an activity to a thread |
Activity Types
When posting an activity, specify the type:
{
"type": "comment",
"content": "Reviewed the police report — liability is clear.",
"visibility": "public"
}
Valid types: comment, status_change, stage_transition, tool_call, note_edit, system_event.
Artifacts
| Method | Endpoint | Description |
|---|---|---|
| GET | /artifacts | List artifacts (filterable by case, thread, space) |
| POST | /artifacts | Upload an artifact |
| GET | /artifacts/{id} | Get artifact metadata |
| GET | /artifacts/{id}/download | Download artifact content |
| DELETE | /artifacts/{id} | Remove an artifact |
DataTables
| Method | Endpoint | Description |
|---|---|---|
| GET | /datatables | List data tables |
| POST | /datatables | Create a data table |
| GET | /datatables/{id} | Get data table metadata and schema |
| GET | /datatables/{id}/rows | Query rows (supports filtering, sorting, pagination) |
EmailMessages
| Method | Endpoint | Description |
|---|---|---|
| GET | /emails | List email messages |
| POST | /emails | Create a draft email |
| GET | /emails/{id} | Get an email by ID |
| PATCH | /emails/{id} | Update a draft email |
| POST | /emails/{id}/send | Queue an email for sending |
Tools
| Method | Endpoint | Description |
|---|---|---|
| GET | /spaces/{id}/tools | List tools available in a space |
| POST | /spaces/{id}/tools | Register a tool in a space |
| POST | /tools/{id}/attach | Attach a tool to an actor |
Labels
| Method | Endpoint | Description |
|---|---|---|
| GET | /spaces/{id}/labels | List labels in a space |
| POST | /spaces/{id}/labels | Create a label |
| POST | /cases/{id}/labels | Apply a label to a case |
| DELETE | /cases/{id}/labels/{label_id} | Remove a label from a case |
Rate Limits
API requests are limited to 1,000 requests per minute per API key. Rate limit headers are included in all responses:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 947
X-RateLimit-Reset: 1705312800
Errors
Errors use a structured envelope. code is a stable, machine-readable reason: use the HTTP status for status-class behavior and code for specific error handling.
{
"error": {
"code": "case_not_found",
"message": "Case not found."
}
}
Validation errors include a fields array describing each problem:
{
"error": {
"code": "validation_error",
"message": "The request body is invalid.",
"fields": [
{
"path": "parent_case_id",
"message": "Cannot be set together with space_id.",
"type": "mutually_exclusive"
}
]
}
}
Resources you cannot access return 404 with the resource-specific code (e.g. case_not_found), never 403. A missing resource and one outside your organization look the same.
Need Help?
For API support, contact us at hello@interloom.com.