API Endpoint Reference
Interactive Documentation
Each service ships its own OpenAPI schema at /openapi.json and
Swagger / ReDoc UIs at /docs and /redoc. Browse the live schema
for your environment — the paths below use the production domain;
staging uses *.stg.iflow.intelliseq.com.
Admin Service
Base URL: https://admin.iflow.intelliseq.com/api/v1
Organizations
| Method |
Endpoint |
Description |
| GET |
/orgs |
List organizations |
Projects
| Method |
Endpoint |
Description |
| GET |
/projects |
List all projects |
| GET |
/projects/{id} |
Get project details |
| GET |
/projects/{id}/credentials |
Get project credentials (for file service) |
Users
| Method |
Endpoint |
Description |
| GET |
/users/me/default-context |
Get user's default project |
| PUT |
/users/me/default-context |
Set user's default project |
Compute Service
Base URL: https://compute.iflow.intelliseq.com/api/v1
Pipelines
| Method |
Endpoint |
Description |
| GET |
/pipelines |
List all pipelines |
| POST |
/pipelines |
Create new pipeline |
| GET |
/pipelines/{id} |
Get pipeline by ID |
| GET |
/pipelines/slug/{slug} |
Get pipeline by slug (latest version) |
| GET |
/pipelines/slug/{slug}?version=1.0.0 |
Get specific version |
| GET |
/pipelines/slug/{slug}/versions |
List all versions |
Runs
| Method |
Endpoint |
Description |
| GET |
/runs |
List runs for project |
| POST |
/runs |
Submit new run |
| GET |
/runs/{id} |
Get run details |
| GET |
/runs/{id}/outputs |
Get run output files |
| DELETE |
/runs/{id} |
Cancel run |
| GET |
/runs/by-order/{order_id} |
List runs for an order |
Miner Service
Base URL: https://miner.iflow.intelliseq.com/api/v1
Subjects
| Method |
Endpoint |
Description |
| GET |
/subjects |
List subjects |
| POST |
/subjects |
Create subject |
| GET |
/subjects/{id} |
Get subject details |
| PATCH |
/subjects/{id} |
Update subject |
| DELETE |
/subjects/{id} |
Delete subject (cascades to samples) |
Samples
| Method |
Endpoint |
Description |
| GET |
/samples |
List samples |
| POST |
/samples |
Create sample |
| GET |
/samples/{id} |
Get sample details |
| PATCH |
/samples/{id} |
Update sample |
| DELETE |
/samples/{id} |
Delete sample |
| GET |
/samples/{id}/sampleinfo |
Generate pipeline-ready JSON |
Orders
| Method |
Endpoint |
Description |
| GET |
/orders |
List orders (filter by status, priority, assignee) |
| POST |
/orders |
Create order |
| GET |
/orders/{id} |
Get order details |
| PUT |
/orders/{id} |
Update order |
| DELETE |
/orders/{id} |
Delete order (only for non-signed orders) |
| POST |
/orders/{id}/transition |
Transition order status (body {"to": "<status>"}) |
| GET |
/orders/{id}/samplesheet |
Generate nf-core samplesheet CSV |
| GET |
/orders/{id}/samples |
List samples in order |
| POST |
/orders/{id}/samples/{sample_id} |
Add sample to order (body {"role": "proband"}) |
| DELETE |
/orders/{id}/samples/{sample_id} |
Remove sample from order |
| GET |
/orders/{id}/labflow |
Get current labflow state (stage, assignee, available transitions) |
Labflows
| Method |
Endpoint |
Description |
| GET |
/labflows |
List labflow definitions visible to the project |
| GET |
/labflows/{id} |
Get labflow definition including stages and transitions |
Variants (read-only)
| Method |
Endpoint |
Description |
| GET |
/variants |
List variants in the catalogue (filter by region, gene) |
| GET |
/variants/{id} |
Variant detail |
| GET |
/samples/{id}/variants |
Sample-level variants |
Files Service
Base URL: https://files.iflow.intelliseq.com/api/v1
Files
| Method |
Endpoint |
Description |
| GET |
/files?project_id=ID&path=/ |
List files in path |
| GET |
/files/download-url?project_id=ID&path=file.txt |
Get signed download URL |
| POST |
/files/upload-url?project_id=ID |
Get signed upload URL |
| POST |
/files/copy?project_id=ID |
Copy file within bucket |
| POST |
/files/move?project_id=ID |
Move/rename file within bucket |
| DELETE |
/files?project_id=ID&path=file.txt |
Delete file |
File Download (Two-Step)
Downloading a file is a two-step process: first get a signed URL, then download from it.
# Step 1: Get signed download URL (valid 15 minutes)
curl -s "https://files.iflow.intelliseq.com/api/v1/files/download-url?project_id=$PROJECT_ID&path=client-resources/report_template.docx" \
-H "Authorization: Bearer $TOKEN" | jq .
# Response:
# {"url": "https://storage.googleapis.com/bucket/...", "expires_in_seconds": 900}
# Step 2: Download file from signed URL (no auth needed)
SIGNED_URL=$(curl -s "https://files.iflow.intelliseq.com/api/v1/files/download-url?project_id=$PROJECT_ID&path=client-resources/report_template.docx" \
-H "Authorization: Bearer $TOKEN" | jq -r .url)
curl -o report_template.docx "$SIGNED_URL"
File Upload (Two-Step)
Uploading is also two-step: get a signed URL, then PUT the file.
# Step 1: Get signed upload URL
curl -s -X POST "https://files.iflow.intelliseq.com/api/v1/files/upload-url?project_id=$PROJECT_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"path": "samples/S1/uploads/sample.vcf.gz", "content_type": "application/gzip"}' | jq .
# Response:
# {"url": "https://storage.googleapis.com/bucket/...", "expires_in_seconds": 900}
# Step 2: Upload file to signed URL (no auth needed)
curl -X PUT "$SIGNED_URL" \
-H "Content-Type: application/gzip" \
--data-binary @sample.vcf.gz
List Files
curl -s "https://files.iflow.intelliseq.com/api/v1/files?project_id=$PROJECT_ID&path=client-resources/" \
-H "Authorization: Bearer $TOKEN" | jq .
Report Service
Base URL: https://report.iflow.intelliseq.com/api/v1
Reports
| Method |
Endpoint |
Description |
| GET |
/reports |
List reports (filter by order_id, status, template_type) |
| POST |
/reports |
Create a report for an order |
| GET |
/reports/{id} |
Get report detail |
| PATCH |
/reports/{id} |
Update draft report (summary, notes, template_type) |
| DELETE |
/reports/{id} |
Delete a draft report (not allowed once signed) |
Variant associations
| Method |
Endpoint |
Description |
| GET |
/reports/{id}/variants |
List variants on the report |
| POST |
/reports/{id}/variants |
Add a variant with optional overrides |
| PATCH |
/reports/{id}/variants/{variant_id} |
Update per-report overrides |
| DELETE |
/reports/{id}/variants/{variant_id} |
Remove variant from report |
| Method |
Endpoint |
Description |
| GET |
/reports/{id}/comments |
List comments (filter by type) |
| POST |
/reports/{id}/comments |
Post a comment (body {"comment": "...", "type": "review"}) |
| PATCH |
/reports/{id}/comments/{comment_id} |
Edit or resolve |
| GET |
/reports/{id}/snapshots |
List snapshots |
| POST |
/reports/{id}/snapshots |
Create a snapshot |
Sign-off (UI-driven)
The sign-off confirmation flow is HTMX-driven and lives at
/{report_id}/signoff/* — see Sign-off PDF
for the endpoint list. These endpoints are not intended for direct API
consumers; the atomic Approve-and-Sign must run through the web UI.
VCF Service
Base URL: https://vcf.iflow.intelliseq.com/api/v1
| Method |
Endpoint |
Description |
| GET |
/orders/{order_id}/variants |
Paginated variant list for an order |
| GET |
/orders/{order_id}/variants/{variant_id} |
Single variant detail |
| GET |
/orders/{order_id}/status |
Build / ingestion status for the order's VCF cache |
Audit Service
Base URL: https://audit.iflow.intelliseq.com/api/v1
| Method |
Endpoint |
Description |
| GET |
/events |
Query audit events (filter by entity, action, date range) |
| GET |
/events/{id} |
Audit event detail |
All API requests require:
Authorization: Bearer <access_token>
Content-Type: application/json
Project-scoped endpoints (miner, compute, files) also require:
X-Project-ID: <project_uuid>
X-Project-ID is the UUID of your project, obtained from GET /api/v1/projects on admin-service.
Admin-service endpoints do not require this header.
See Authentication for details.
Error Responses
| Status |
Description |
| 400 |
Bad request - invalid parameters |
| 401 |
Unauthorized - missing or invalid token |
| 403 |
Forbidden - insufficient permissions |
| 404 |
Not found - resource doesn't exist |
| 409 |
Conflict - resource already exists |
| 500 |
Server error |
Example error response:
{
"detail": "Pipeline 'hereditary-mock' version '1.0.0' already exists. Use force=True to overwrite."
}