Skip to content

Robot WebUI HTTP interface declarations

This source-derived index records handler signatures, explicit return values and errors. Detailed behavior guides supplement this index; delegated service results must be traced into their implementation.

GET /api/robot/config

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 57

robot_config(request: Request)

Handler results (source expressions):

{'robot': adapter_context_robot(), 'profile': await adapter(request).robot_profile(), 'storageRoot': str(storage_root()), 'configsDir': str(configs_dir()), 'available': configs_dir().exists()}

GET /api/robot/config/schema

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 74

robot_config_schema()

Handler results (source expressions):

read_structured(schema_path, default={'title': 'Robot Config', 'type': 'object', 'properties': {}, 'source': str(schema_path)})

GET /api/robot/config/{name}

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 85

robot_config_by_name(name: str)

Handler results (source expressions):

{'name': name, 'path': None, 'data': {}}
{'name': name, 'path': str(path), 'data': read_structured(path, default={})}

POST /api/robot/config/{name}

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 94

save_robot_config(name: str, payload: dict)

Handler results (source expressions):

{'ok': True, 'name': name, 'path': str(path)}

GET /api/virtual-project

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 101

virtual_project(request: Request)

Handler results (source expressions):

_virtual_project_payload(root, project, project_names, project_dir(project))
root / name
sophia_dir

GET /api/settings/nodes

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 189

settings_nodes(request: Request)

Handler results (source expressions):

await adapter(request).list_settings_nodes()

GET /api/settings/nodes/{node_name:path}/description

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 194

settings_node_description(request: Request, node_name: str)

Handler results (source expressions):

await adapter(request).describe_settings_node(node_name)

GET /api/settings/nodes/{node_name:path}/configuration

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 199

settings_node_configuration(request: Request, node_name: str)

Handler results (source expressions):

await adapter(request).get_settings_node_configuration(node_name)

POST /api/settings/nodes/{node_name:path}/configuration

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 204

save_settings_node_configuration(request: Request, node_name: str, payload: dict)

Handler results (source expressions):

await adapter(request).save_settings_node_configuration(node_name, payload)

POST /api/settings/nodes/{node_name:path}/save

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 209

save_settings_node_file(request: Request, node_name: str)

Handler results (source expressions):

await adapter(request).save_settings_node_file(node_name)

POST /api/settings/nodes/{node_name:path}/reset

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 214

reset_settings_node_configuration(request: Request, node_name: str)

Handler results (source expressions):

await adapter(request).reset_settings_node_configuration(node_name)

GET /api/settings/nodes/{node_name:path}/saved-file

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 219

settings_node_saved_file(request: Request, node_name: str)

Handler results (source expressions):

await adapter(request).settings_node_saved_file(node_name)

DELETE /api/settings/nodes/{node_name:path}/saved-file

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 224

delete_settings_node_saved_file(request: Request, node_name: str)

Handler results (source expressions):

await adapter(request).delete_settings_node_saved_file(node_name)

GET /api/settings/suggestions

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 229

settings_suggestions(request: Request)

Handler results (source expressions):

await adapter(request).settings_suggestions()

GET /api/monitor/status

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 234

monitor_status(request: Request)

Handler results (source expressions):

await adapter(request).monitor_status()

GET /api/faces

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 239

faces()

Handler results (source expressions):

{'faces': face_store.list_faces()}

GET /api/faces/recognition-settings

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 244

face_recognition_settings(request: Request)

Handler results (source expressions):

await adapter(request).face_recognition_settings()

POST /api/faces/recognition-settings

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 249

save_face_recognition_settings(request: Request, payload: dict)

Handler results (source expressions):

{**saved, **updated}

Explicit handler errors:

HTTPException(status_code=400, detail={'error': 'missing_threshold'})

POST /api/faces

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 259

save_face(payload: dict)

Handler results (source expressions):

{'ok': True, 'face': face}

DELETE /api/faces/{face_id}

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 270

delete_face(face_id: str)

Handler results (source expressions):

{'ok': face_store.delete_face(face_id), 'id': face_id}

GET /api/faces/images/{image_path:path}

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 275

face_image(image_path: str)

Handler results (source expressions):

FileResponse(path)

Explicit handler errors:

HTTPException(status_code=404, detail='Image not found')

POST /api/faces/{face_id}/images

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 286

add_face_image(request: Request, face_id: str, file: UploadFile=File(...))

Handler results (source expressions):

{'ok': True, 'embedded': True, 'face': face_store.find_face(face['id']), 'image': image, 'embedding': {key: value for key, value in stored_embedding.items() if key != 'embedding'}}
{'ok': True, 'embedded': False, 'embedding_error': embedding_error, 'face': face_store.find_face(face['id']), 'image': image}

POST /api/faces/{face_id}/regenerate

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 408

regenerate_face_embeddings(request: Request, face_id: str)

Handler results (source expressions):

await _regenerate_face_embeddings(request, face_ids=[face_id])

Explicit handler errors:

HTTPException(status_code=404, detail='Face not found')

POST /api/faces/regenerate

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 415

regenerate_all_face_embeddings(request: Request)

Handler results (source expressions):

await _regenerate_face_embeddings(request)

POST /api/faces/search

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 420

search_face(request: Request, payload: dict)

Handler results (source expressions):

face_store.search_embedding(embedding, threshold=_face_recognition_threshold(threshold), model=payload.get('model'))

Explicit handler errors:

HTTPException(status_code=400, detail='Missing embedding')

GET /api/faces/live-candidates

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 435

face_live_candidates(request: Request)

Handler results (source expressions):

await adapter(request).face_live_candidates()

GET /api/teleops/state

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 440

teleops_state(request: Request)

Handler results (source expressions):

await adapter(request).teleops_state()

GET /api/teleops/catalog

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 445

teleops_catalog(request: Request)

Handler results (source expressions):

await adapter(request).teleops_catalog()

GET /api/teleops/settings

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 450

teleops_settings(request: Request)

Handler results (source expressions):

await adapter(request).teleops_settings()

POST /api/teleops/command

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 455

teleops_command(request: Request, payload: dict)

Handler results (source expressions):

await adapter(request).handle_command(message)

POST /api/settings/trees/{tree_name:path}

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 462

save_tree(tree_name: str, payload: dict)

Handler results (source expressions):

{'ok': True, 'path': str(path)}

GET /api/settings/trees/{tree_name:path}

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 469

get_tree(tree_name: str)

Handler results (source expressions):

{'path': str(path), 'data': read_structured(path, default={})}

DELETE /api/settings/trees/{tree_name:path}

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 475

remove_tree(tree_name: str)

Handler results (source expressions):

{'ok': True, 'path': str(path)}

GET /api/motors

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 483

motors(request: Request)

Handler results (source expressions):

await adapter(request).list_motors()

GET /api/motors/states

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 488

motor_states(request: Request)

Handler results (source expressions):

await adapter(request).motor_states()

POST /api/motors/control

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 493

motor_control(request: Request, payload: dict)

Handler results (source expressions):

await adapter(request).set_motor_control(payload)

POST /api/motors/command

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 498

motor_command(request: Request, payload: dict)

Handler results (source expressions):

await adapter(request).send_motor_command(payload)

POST /api/motors/torque

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 503

motor_torque(request: Request, payload: dict)

Handler results (source expressions):

await adapter(request).set_motor_torque(payload)

GET /api/motors/config

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 508

motors_config(request: Request)

Handler results (source expressions):

{'configsDir': str(configs_dir()), 'files': list_files(configs_dir(), suffixes={'.yaml', '.yml', '.json'}), **config}

POST /api/motors/config

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 518

save_motors_config(request: Request, payload: dict)

Handler results (source expressions):

result
{'ok': True, 'path': str(path)}

GET /api/navigation/locations

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 528

navigation_locations()

Handler results (source expressions):

{'ok': False, 'locations': [], 'error': 'Navigation is unsupported in the ROS2 WebUI adapter.'}

POST /api/navigation/go-to

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 533

navigation_go_to(payload: dict)

Handler results (source expressions):

{'ok': False, 'error': 'Navigation is unsupported in the ROS2 WebUI adapter.', 'received': payload}

POST /api/navigation/go-to-position

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 538

navigation_go_to_position(payload: dict)

Handler results (source expressions):

{'ok': False, 'error': 'Navigation is unsupported in the ROS2 WebUI adapter.', 'received': payload}

POST /api/navigation/stop

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 543

navigation_stop(payload: dict)

Handler results (source expressions):

{'ok': False, 'error': 'Navigation is unsupported in the ROS2 WebUI adapter.', 'received': payload}

GET /api/performances

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 548

performances(request: Request, tree: bool=False)

Handler results (source expressions):

{'root': str(performances_dir()), 'items': list_files(performances_dir(), suffixes={'.yaml', '.yml', '.json', '.properties'})}
performance_tree(robot_name)

GET /api/performances/current

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 559

current_performance_payload(request: Request)

Handler results (source expressions):

await adapter(request).performance_current_payload()

GET /api/performances/{item_path:path}

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 564

performance_item(request: Request, item_path: str)

Handler results (source expressions):

load_performance(adapter(request).robot_name, item_path)

Explicit handler errors:

HTTPException(status_code=400, detail=str(error))

POST /api/performances/{item_path:path}

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 572

save_performance_item(request: Request, item_path: str, payload: dict)

Handler results (source expressions):

save_performance(adapter(request).robot_name, item_path, payload)

Explicit handler errors:

HTTPException(status_code=409, detail={'error': 'Performance changed since it was loaded', 'id': error.item_id, 'currentRevision': error.current_revision})
HTTPException(status_code=400, detail=str(error))

DELETE /api/performances/{item_path:path}

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 589

delete_performance_item(request: Request, item_path: str)

Handler results (source expressions):

delete_performance(adapter(request).robot_name, item_path)

Explicit handler errors:

HTTPException(status_code=400, detail=str(error))

POST /api/performance-folders/{folder_path:path}

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 597

create_performance_folder(request: Request, folder_path: str)

Handler results (source expressions):

create_folder(adapter(request).robot_name, folder_path)

Explicit handler errors:

HTTPException(status_code=400, detail=str(error))

POST /api/performance-move/{item_path:path}

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 605

move_performance_item(request: Request, item_path: str, payload: dict)

Handler results (source expressions):

move_performance(adapter(request).robot_name, item_path, payload)

Explicit handler errors:

HTTPException(status_code=400, detail=str(error))

GET /api/performance-properties

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 613

root_performance_properties(request: Request)

Handler results (source expressions):

read_properties(adapter(request).robot_name)

GET /api/performance-properties/{property_path:path}

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 618

performance_properties(request: Request, property_path: str)

Handler results (source expressions):

read_properties(adapter(request).robot_name, property_path)

Explicit handler errors:

HTTPException(status_code=400, detail=str(error))

POST /api/performance-properties/{property_path:path}

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 626

save_performance_properties(request: Request, property_path: str, payload: dict)

Handler results (source expressions):

write_properties(adapter(request).robot_name, property_path, payload)

Explicit handler errors:

HTTPException(status_code=400, detail=str(error))

GET /api/performance-catalog

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 634

performance_catalog(request: Request)

Handler results (source expressions):

await adapter(request).performance_catalog()

POST /api/performance-runtime/speech-length

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 639

performance_speech_length(request: Request, payload: dict)

Handler results (source expressions):

await adapter(request).performance_speech_length(payload)

POST /api/performance-runtime/animation-length

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 644

performance_animation_length(request: Request, payload: dict)

Handler results (source expressions):

await adapter(request).performance_animation_length(payload)

POST /api/performance-runtime/arm-animation-length

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 649

performance_arm_animation_length(request: Request, payload: dict)

Handler results (source expressions):

await adapter(request).performance_arm_animation_length(payload)

POST /api/performance-runtime/tts-preview

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 654

performance_tts_preview(request: Request, payload: dict)

Handler results (source expressions):

await adapter(request).performance_tts_preview(payload)

POST /api/performance-runtime/preview

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 659

performance_preview(request: Request, payload: dict)

Handler results (source expressions):

await adapter(request).performance_preview(payload)

GET /api/performance-runtime/autopause

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 664

performance_autopause(request: Request)

Handler results (source expressions):

await adapter(request).performance_autopause()

GET /api/compat/legacy-routes

Source: head-ros-nodes/ros/webui/api/webui_api/api_routes.py, line 670

legacy_routes()

Handler results (source expressions):

{'routes': [{'legacy': '#/teleops', 'modern': '#/teleops'}, {'legacy': '#/performances', 'modern': '#/performances'}, {'legacy': '#/motors', 'modern': '#/motors'}, {'legacy': '#/settings', 'modern': '#/settings'}, {'legacy': '#/virtual', 'modern': '#/virtual'}, {'legacy': '#/admin/motors', 'modern': '#/admin/motors'}]}

GET /api/health

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 360

health()

Handler results (source expressions):

{'ok': True, 'service': 'webui', 'uptimeSec': round(time.time() - app.state.started_at, 3), 'clients': len(app.state.event_hub.clients), 'adapter': adapter_health}

GET /api/version

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 371

version()

Handler results (source expressions):

{'name': 'webui', 'version': '0.1.0', 'protocolVersion': 1}

GET /api/status

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 379

status()

Handler results (source expressions):

{'latest': app.state.event_hub.latest, 'clients': len(app.state.event_hub.clients)}

GET /api/video/fov.mjpg

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 386

fov_mjpeg(frames: int | None=None)

Handler results (source expressions):

StreamingResponse(stream_frames(), media_type=f'multipart/x-mixed-replace; boundary={boundary}', headers={**NO_STORE_HEADERS, 'X-Accel-Buffering': 'no'})
f'--{boundary}\r\nContent-Type: {content_type}\r\nContent-Length: {len(data)}\r\n\r\n'.encode('ascii') + data + b'\r\n'

Explicit handler errors:

HTTPException(status_code=503, detail='No FOV image frame is available yet.')

GET /api/video/fov.jpg

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 437

fov_jpeg(after: int | None=None, timeout: float=0.5)

Handler results (source expressions):

Response(content=data, media_type=frame.get('content_type') or 'image/jpeg', headers=headers)
_camera_unavailable_response()
Response(status_code=204, headers=NO_STORE_HEADERS)

GET /api/tts/files

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 469

tts_files(path: str='')

Handler results (source expressions):

_tts_directory_metadata(tts_static_dir, requested)

Explicit handler errors:

HTTPException(status_code=404, detail='TTS path not found.')

GET /api/asr/files

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 479

asr_files(path: str='')

Handler results (source expressions):

_audio_directory_metadata(asr_static_dir, requested, 'asr')

Explicit handler errors:

HTTPException(status_code=404, detail='ASR path not found.')

GET/POST/PUT/PATCH/DELETE /api/{path:path}

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 489

unknown_api_route(path: str)

Explicit handler errors:

HTTPException(status_code=404, detail=f'Unknown API route: /api/{path}')

GET /monitor/status

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 493

legacy_monitor_status()

Handler results (source expressions):

await app.state.robot_adapter.monitor_status()

GET /robot_config_schema

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 497

legacy_robot_config_schema()

Handler results (source expressions):

await robot_config_schema()

GET /robot_config/{name}

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 502

legacy_robot_config(name: str)

Handler results (source expressions):

await robot_config_by_name(name)

GET /motors/get/{name}

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 507

legacy_motors(name: str)

Handler results (source expressions):

data

GET /attention_regions/{name}

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 513

removed_legacy_attention_regions(name: str)

Explicit handler errors:

HTTPException(status_code=404, detail='Attention regions are removed from the API.')

WEBSOCKET /ws

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 517

websocket_endpoint(websocket: WebSocket)

WEBSOCKET /ws/audio

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 590

audio_websocket_endpoint(websocket: WebSocket)

GET /tts

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 611

tts_root()

Handler results (source expressions):

RedirectResponse(url='/#/tts')

GET /tts/

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 611

tts_root()

Handler results (source expressions):

RedirectResponse(url='/#/tts')

GET /tts/{path:path}

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 615

tts_file(path: str)

Handler results (source expressions):

_not_found_redirect(f'/tts/{path}')
FileResponse(requested)
RedirectResponse(url=_tts_hash_path(_relative_tts_path(tts_static_dir, requested)))

GET /asr

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 628

asr_root()

Handler results (source expressions):

RedirectResponse(url='/#/asr')

GET /asr/

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 628

asr_root()

Handler results (source expressions):

RedirectResponse(url='/#/asr')

GET /asr/{path:path}

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 632

asr_file(path: str)

Handler results (source expressions):

_not_found_redirect(f'/asr/{path}')
FileResponse(requested)
RedirectResponse(url=_asr_hash_path(relative))

GET /

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 649

index()

Handler results (source expressions):

_not_found_redirect('/')
FileResponse(static_dir / 'index.html', headers=NO_STORE_HEADERS)

GET /{path:path}

Source: head-ros-nodes/ros/webui/api/webui_api/main.py, line 655

spa_fallback(path: str)

Handler results (source expressions):

_not_found_redirect(f'/{path}')
FileResponse(requested)