Skip to main content

Responses Proxy API reference

The hosted Responses Proxy service is:

https://agent-responses-proxy.svc.cloud.morph.so/

Responses-compatible clients should use:

https://agent-responses-proxy.svc.cloud.morph.so/v1

The live OpenAPI schema is available from the service:

GET /docs
GET /openapi.json

This page summarizes the route families. Use the live schema for exact request and response models.

Health

GET /healthz
GET /readyz

Expected responses:

{"status": "ok"}
{"status": "ready"}

Responses API proxy

POST /v1/responses
GET|POST|DELETE|PATCH /v1/responses/{relative_path}
WS /v1/responses

POST /v1/responses forwards the request body to the configured upstream base URL and selected OpenAI resource. Subpaths under /v1/responses/{relative_path} support follow-up operations and response affinity when a resp_* id is available.

Dashboard

GET /

Returns the live dashboard HTML page.

Live state and telemetry

GET /admin/state
GET /admin/events
POST /admin/health/check

/admin/state returns Redis-backed resource state, recent decisions, affinity count, queue depth, and current timestamp. /admin/events is a server-sent event stream with the same live state shape. /admin/health/check runs provider health checks immediately.

Current security note: these telemetry endpoints are not protected by PROXY_ADMIN_TOKEN; use network-level controls when exposing them.

Durable history

GET /admin/sessions?limit=100
GET /admin/requests?limit=100&session_id=...&resource_id=...
GET /admin/decisions?limit=100&session_id=...&resource_id=...&request_id=...

Query limits accept 1 through 500. Requests and decisions can be filtered by session or resource. Request and response bodies are captured in SQL for telemetry, but the current request history API returns metadata, token usage, status, latency, and error fields rather than full bodies.

Provider registry

Registry routes require bearer auth only when PROXY_ADMIN_TOKEN is set:

Authorization: Bearer <PROXY_ADMIN_TOKEN>

Provider routes:

GET /admin/providers?include_disabled=false
POST /admin/providers
GET /admin/providers/{provider_id}
PATCH /admin/providers/{provider_id}
DELETE /admin/providers/{provider_id}

Create example:

{
"id": "openai-main",
"name": "OpenAI Main",
"provider_type": "openai",
"base_url": "https://api.openai.com/v1",
"wire_api": "responses",
"auth_type": "bearer",
"credential_ref": "env:OPENAI_API_KEY"
}

Defaults include provider_type: "openai", wire_api: "responses", auth_type: "bearer", auth_header: "authorization", health_path: "models", and enabled: true.

Inline api_key values are write-only, encrypted when PROXY_SECRET_ENCRYPTION_KEY is set, and never returned in plaintext.

Model and agent registry

GET /admin/models?include_disabled=false
POST /admin/models
GET /admin/models/{alias}
PATCH /admin/models/{alias}
DELETE /admin/models/{alias}

Aliases can contain slashes because the route uses {alias:path}.

Create example:

{
"alias": "agents/research",
"display_name": "Research Agent",
"kind": "compound_agent",
"provider_id": "openai-main",
"upstream_id": "gpt-4.1-mini",
"route": {"type": "responses", "model": "gpt-4.1-mini"},
"capabilities": {"tools": true, "streaming": true}
}

Allowed kind values are model, agent, and compound_agent.

Current limit: registry entries do not change live routing yet. Runtime routing still uses the configured OpenAI resource environment variables.