Platform API Reference
Complete REST API reference for CenterOS. 39 actions across 9 categories, JWT and PAT authentication, curl examples, error codes.
On this page
- Base URL
- Authentication
- Health Check
- Action Layer
- Datasets (6)
- Training (6)
- Models (4)
- Fleet (6)
- Annotations (4)
- Organizations (3)
- Stats (2)
- Error Codes
- Scopes Reference
Agent & Dev Access
Also see
API Reference REST + JSON
Complete REST API reference for CenterOS. 39 actions across 9 categories, all discoverable via a single endpoint.
Updated Apr 2026 39 actions JWT + PAT auth
Base URL
All API endpoints are relative to the production backend:
https://fearless-backend-533466225971.us-central1.run.app
For local development, the Vite dev server proxies /api to localhost:8000 automatically. You can also use the CENTEROS_API_URL environment variable to override the base URL in the CLI and MCP server.
Authentication
The API supports two authentication methods. All authenticated endpoints require a Bearer token in the Authorization header.
JWT (Session Token)
Obtained by logging in with username and password. Short-lived, suitable for interactive sessions.
shell Copy
# Login and get a JWT $ curl -X POST https://fearless-backend-533466225971.us-central1.run.app/api/auth/login \ -H "Content-Type: application/json" \ -d '{"username": "jerry", "password": "***"}'
# Response includes: {"access_token": "eyJ...", "user": {...}}
PAT (Personal Access Token)
Long-lived tokens for CI/CD pipelines, scripts, and agent workflows. PAT tokens start with the frl_ prefix. Create one via the CLI or the platform dashboard.
shell Copy
# Create a PAT via CLI $ centeros pat create --name "my-agent" --scopes "*" # PAT created: frl_abc123...
# Use the PAT in API calls $ curl https://fearless-backend-533466225971.us-central1.run.app/api/actions \ -H "Authorization: Bearer frl_abc123..."
Scoped tokens: PATs can be scoped to specific permissions (e.g. datasets:read,training:write). Use * for full access. The API filters visible actions based on your token's scopes.
Health Check
shell Copy
$ curl https://fearless-backend-533466225971.us-central1.run.app/api/health
# {"status": "ok", "version": "...", "database": "ok"}
No authentication required. Returns 200 when the backend is healthy.
Action Layer
The Action Layer is the unified API surface shared by the platform UI, CLI, MCP server, and AI agents. All 39 actions are discoverable via two endpoints:
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/actions |
List all available actions with input schemas. Optionally filter by ?category=datasets. |
| POST | /api/actions/{name} |
Execute an action by name. Body: {"params": {...}}. Requires Bearer token. |
Discover actions
shell Copy
# List all actions (public — no auth needed for discovery) $ curl https://fearless-backend-533466225971.us-central1.run.app/api/actions
# Filter by category $ curl "https://fearless-backend-533466225971.us-central1.run.app/api/actions?category=training"
Execute an action
shell Copy
$ curl -X POST https://fearless-backend-533466225971.us-central1.run.app/api/actions/list\_datasets \ -H "Authorization: Bearer frl_..." \ -H "Content-Type: application/json" \ -d '{"params": {"limit": 10}}'
# {"ok": true, "data": [...]}
Datasets
Manage robotics datasets — list, get details, upload, and delete. Scopes: datasets:read datasets:write
| Action | Description | Required Params | Scope |
|---|---|---|---|
list_datasets |
List datasets with optional search, file type, and pagination filters. | None | datasets:read |
get_dataset |
Get detailed information about a single dataset. | dataset_id |
datasets:read |
delete_dataset |
Delete a dataset and its associated file from storage. | dataset_id |
datasets:write |
upload_dataset |
Create a dataset record (metadata). For file upload, use get_upload_signed_url. |
name |
datasets:write |
get_upload_signed_url |
Generate a GCS signed URL for direct-to-cloud dataset upload. | filename, file_size |
datasets:write |
confirm_upload |
Confirm that a signed-URL upload completed. Marks the dataset as ready. | dataset_id |
datasets:write |
shell Copy
# List datasets with search filter $ curl -X POST .../api/actions/list_datasets \ -H "Authorization: Bearer frl_..." \ -H "Content-Type: application/json" \ -d '{"params": {"search": "grasp", "file_type": "hdf5", "limit": 20}}'
# Upload flow: get signed URL, upload file, confirm $ curl -X POST .../api/actions/get_upload_signed_url \ -H "Authorization: Bearer frl_..." \ -H "Content-Type: application/json" \ -d '{"params": {"filename": "episode_001.hdf5", "file_size": 52428800}}'
Training
Create and manage training and fine-tuning jobs. Scopes: training:read training:write
| Action | Description | Required Params | Scope |
|---|---|---|---|
list_training_jobs |
List training jobs with optional status and model type filters. | None | training:read |
create_training_job |
Create a new training or fine-tuning job from one or more datasets. | dataset_ids |
training:write |
get_training_status |
Get the current status and details of a training job. | job_id |
training:read |
launch_training |
Launch a pending training job (transition to running). | job_id |
training:write |
get_finetune_catalog |
List all supported fine-tuning base model providers and models. | None | training:read |
estimate_cost |
Estimate the cost of a training run based on datasets and infra. | None | training:read |
shell Copy
# Create a training job $ curl -X POST .../api/actions/create_training_job \ -H "Authorization: Bearer frl_..." \ -H "Content-Type: application/json" \ -d '{"params": {"name": "dp-v1", "model_type": "diffusion_policy", "dataset_ids": [1, 2], "mode": "finetune"}}'
# Launch a pending job $ curl -X POST .../api/actions/launch_training \ -H "Authorization: Bearer frl_..." \ -H "Content-Type: application/json" \ -d '{"params": {"job_id": "abc123def456"}}'
Models
Model registry with lifecycle management. Scopes: models:read models:write
| Action | Description | Required Params | Scope |
|---|---|---|---|
list_models |
List model versions with optional status and name filters. | None | models:read |
register_model |
Register a new model version in the model registry. | name |
models:write |
promote_model |
Promote a model through lifecycle stages: draft → validated → deployed → retired. | model_id, target_status |
models:write |
get_model_lineage |
Get full lineage: training job, datasets, deployments, evaluations. | model_id |
models:read |
shell Copy
# Register a model from a training run $ curl -X POST .../api/actions/register_model \ -H "Authorization: Bearer frl_..." \ -H "Content-Type: application/json" \ -d '{"params": {"name": "dp-v1", "artifact_uri": "gs://bucket/model.pt", "training_job_id": "abc123"}}'
# Promote to validated $ curl -X POST .../api/actions/promote_model \ -H "Authorization: Bearer frl_..." \ -H "Content-Type: application/json" \ -d '{"params": {"model_id": 5, "target_status": "validated"}}'
Fleet
Robot fleet management, deployment, and safety commands. Scopes: fleet:read fleet:write
| Action | Description | Required Params | Scope |
|---|---|---|---|
get_fleet_summary |
High-level fleet summary: counts by status, alerts, tickets. | None | fleet:read |
list_robots |
List robots with optional status, site, and search filters. | None | fleet:read |
get_robot_state |
Detailed state of a single robot: heartbeat, commands, alerts. | robot_id |
fleet:read |
register_robot |
Register a new robot in the fleet. | robot_id |
fleet:write |
deploy_model |
Deploy a validated model version to a specific robot. | robot_id, model_version_id |
fleet:write models:read |
emergency_stop |
Send an emergency stop (e-stop) command to a robot. Highest priority. | robot_id |
fleet:write |
shell Copy
# Register a robot $ curl -X POST .../api/actions/register_robot \ -H "Authorization: Bearer frl_..." \ -H "Content-Type: application/json" \ -d '{"params": {"robot_id": "arm-01", "name": "Lab Arm 1", "robot_type": "arm"}}'
# Deploy a model to a robot $ curl -X POST .../api/actions/deploy_model \ -H "Authorization: Bearer frl_..." \ -H "Content-Type: application/json" \ -d '{"params": {"robot_id": "arm-01", "model_version_id": 5, "strategy": "immediate"}}'
# Emergency stop $ curl -X POST .../api/actions/emergency_stop \ -H "Authorization: Bearer frl_..." \ -H "Content-Type: application/json" \ -d '{"params": {"robot_id": "arm-01", "reason": "safety_check"}}'
Annotations
Data annotation task management and quality metrics. Scopes: annotations:read annotations:write
| Action | Description | Required Params | Scope |
|---|---|---|---|
list_annotation_tasks |
List annotation tasks with optional status, assignee, and search filters. | None | annotations:read |
create_annotation_task |
Create a new annotation task, optionally linked to a dataset. | None (title recommended) | annotations:write |
get_annotation_metrics |
Aggregated quality metrics: pass rate, review counts, status distribution. | None | annotations:read |
submit_task |
Submit an annotation task for review (transition to in_review). | task_id |
annotations:write |
shell Copy
# Create an annotation task $ curl -X POST .../api/actions/create_annotation_task \ -H "Authorization: Bearer frl_..." \ -H "Content-Type: application/json" \ -d '{"params": {"title": "Label grasp episodes", "dataset_id": 42, "data_type": "video", "priority": "high"}}'
Organizations
Organization and team membership management. Scopes: orgs:read orgs:write
| Action | Description | Required Params | Scope |
|---|---|---|---|
list_orgs |
List organizations. Superadmins see all; others see only their org. | None | orgs:read |
list_org_members |
List members of an organization with their roles. | None (org_id optional) | orgs:read |
invite_member |
Invite a user to an organization. Creates the user if they do not exist. | org_id, email |
orgs:write |
Stats
Platform-wide statistics and system health checks. Scope: stats:read
| Action | Description | Required Params | Scope |
|---|---|---|---|
get_platform_stats |
Aggregated platform statistics: dataset counts, training jobs, robots, annotations. | None | stats:read |
get_system_health |
Check the health of backend systems: database, storage, overall status. | None | stats:read |
shell Copy
# Get platform stats $ curl -X POST .../api/actions/get_platform_stats \ -H "Authorization: Bearer frl_..." \ -H "Content-Type: application/json" \ -d '{"params": {}}'
# Check system health $ curl -X POST .../api/actions/get_system_health \ -H "Authorization: Bearer frl_..." \ -H "Content-Type: application/json" \ -d '{"params": {}}'
Error Codes
All action errors return a JSON body with {"ok": false, "detail": "..."} and the appropriate HTTP status code.
| Code | Meaning | Common Cause |
|---|---|---|
| 400 | Bad Request | Missing required parameter or invalid value. |
| 401 | Unauthorized | Missing or invalid Bearer token. |
| 403 | Forbidden | Token scopes do not include the required permission, or org isolation violation. |
| 404 | Not Found | Unknown action name, or resource (dataset, model, robot) does not exist. |
| 409 | Conflict | Duplicate resource (e.g. robot already registered, user already a member). |
| 413 | Payload Too Large | File exceeds the maximum upload size. |
| 500 | Internal Server Error | Unhandled exception in the action handler. |
Scopes Reference
Scopes control which actions a token can access. PATs can be created with specific scopes; JWTs derive scopes from the user's role.
| Scope | Actions Granted |
|---|---|
datasets:read |
list_datasets, get_dataset |
datasets:write |
delete_dataset, upload_dataset, get_upload_signed_url, confirm_upload |
training:read |
list_training_jobs, get_training_status, get_finetune_catalog, estimate_cost |
training:write |
create_training_job, launch_training |
models:read |
list_models, get_model_lineage |
models:write |
register_model, promote_model |
fleet:read |
get_fleet_summary, list_robots, get_robot_state |
fleet:write |
register_robot, deploy_model, emergency_stop |
annotations:read |
list_annotation_tasks, get_annotation_metrics |
annotations:write |
create_annotation_task, submit_task |
orgs:read |
list_orgs, list_org_members |
orgs:write |
invite_member |
stats:read |
get_platform_stats, get_system_health |
* |
All actions (wildcard) |
Role-to-Scope Mapping
| Role | Scopes |
|---|---|
| admin | All scopes |
| operator | datasets:*, training:*, models:read, fleet:*, annotations:*, stats:read |
| annotator | datasets:read, annotations:*, stats:read |
| viewer | All :read scopes |
Next steps
CLI Guide Use the CenterOS CLI for terminal-based workflows → MCP Integration Connect Claude, Cursor, or Windsurf to the platform → Agent Access Overview Three ways to access the platform programmatically → Open Platform Manage datasets, training, and fleet in the browser →







