Quickstart

Create an API key and run your first cloud coding agent.

1. Get an API key

Create an account at app.epho.io, open the API keys page, and create a team key. Copy the plain-text key immediately; it is only shown when created.

Keep these two credentials separate:

  • The Epho API key authenticates requests to Epho.
  • The provider API key lets the selected harness call OpenAI, Anthropic, or OpenCode Zen.

2. Start a streaming run

This request creates a new chat and streams the turn until it finishes:

curl -N https://app.epho.io/api/v1/chat \
  -H "Authorization: Bearer $EPHO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Create a small HTTP health endpoint and add a test.",
    "harness": "codex",
    "model": "gpt-5.5",
    "provider_api_key": "'"$OPENAI_API_KEY"'"
  }'

-N disables curl's output buffering so SSE frames appear immediately.

The first frame contains the identifiers you need for later reads:

data: {"type":"chat","chat_id":"01K...","turn_id":"01K..."}

Lifecycle and agent events follow:

data: {"type":"event","event":{"type":"status","phase":"provisioning","message":"Creating a new sandbox…"}}
data: {"type":"event","event":{"type":"status","phase":"starting","message":"Starting the agent…"}}

The stream ends with one done frame:

data: {"type":"done","status":"completed","output":"Added /health and its test.","error":null,"artifacts":[]}

3. Queue work instead

For jobs that should survive a client disconnect, use the asynchronous endpoint:

curl https://app.epho.io/api/v1/chat/async \
  -H "Authorization: Bearer $EPHO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Create a small HTTP health endpoint and add a test.",
    "harness": "codex",
    "model": "gpt-5.5",
    "provider_api_key": "'"$OPENAI_API_KEY"'"
  }'

It returns immediately with 202 Accepted:

{
  "chat_id": "01K...",
  "turn_id": "01K..."
}

Read that turn later:

curl https://app.epho.io/api/v1/chat/$CHAT_ID/turns/$TURN_ID/response \
  -H "Authorization: Bearer $EPHO_API_KEY"

Or reconnect to its event stream:

curl -N https://app.epho.io/api/v1/chat/$CHAT_ID/events/subscribe \
  -H "Authorization: Bearer $EPHO_API_KEY"

4. Continue the conversation

Pass the returned chat_id with a new prompt. The chat keeps its harness, model, system prompt, MCP configuration, and sandbox size:

curl -N https://app.epho.io/api/v1/chat \
  -H "Authorization: Bearer $EPHO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "chat_id": "'"$CHAT_ID"'",
    "prompt": "Now add a readiness endpoint.",
    "provider_api_key": "'"$OPENAI_API_KEY"'"
  }'

Only one turn may be active in a chat at a time. Use separate chats for work that needs to run concurrently.