[{"data":1,"prerenderedAt":520},["ShallowReactive",2],{"docs-page:\u002Fdocs\u002Fquickstart":3,"docs-navigation-links":488},{"id":4,"title":5,"body":6,"description":480,"extension":481,"meta":482,"navigation":483,"path":484,"seo":485,"stem":486,"__hash__":487},"docs\u002Fdocs\u002Fquickstart.md","Quickstart",{"type":7,"value":8,"toc":474},"minimark",[9,14,26,29,47,51,54,157,163,166,174,177,183,190,196,200,203,267,274,315,318,355,358,388,392,399,467,470],[10,11,13],"h2",{"id":12},"_1-get-an-api-key","1. Get an API key",[15,16,17,18,25],"p",{},"Create an account at ",[19,20,24],"a",{"href":21,"rel":22},"https:\u002F\u002Fapp.epho.io",[23],"nofollow","app.epho.io",", open the API keys page,\nand create a team key. Copy the plain-text key immediately; it is only shown\nwhen created.",[15,27,28],{},"Keep these two credentials separate:",[30,31,32,41],"ul",{},[33,34,35,36,40],"li",{},"The ",[37,38,39],"strong",{},"Epho API key"," authenticates requests to Epho.",[33,42,35,43,46],{},[37,44,45],{},"provider API key"," lets the selected harness call OpenAI, Anthropic, or OpenCode Zen.",[10,48,50],{"id":49},"_2-start-a-streaming-run","2. Start a streaming run",[15,52,53],{},"This request creates a new chat and streams the turn until it finishes:",[55,56,61],"pre",{"className":57,"code":58,"language":59,"meta":60,"style":60},"language-bash shiki shiki-themes github-dark","curl -N https:\u002F\u002Fapp.epho.io\u002Fapi\u002Fv1\u002Fchat \\\n  -H \"Authorization: Bearer $EPHO_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"prompt\": \"Create a small HTTP health endpoint and add a test.\",\n    \"harness\": \"codex\",\n    \"model\": \"gpt-5.5\",\n    \"provider_api_key\": \"'\"$OPENAI_API_KEY\"'\"\n  }'\n","bash","",[62,63,64,84,102,112,121,127,133,139,151],"code",{"__ignoreMap":60},[65,66,69,73,77,81],"span",{"class":67,"line":68},"line",1,[65,70,72],{"class":71},"svObZ","curl",[65,74,76],{"class":75},"sDLfK"," -N",[65,78,80],{"class":79},"sU2Wk"," https:\u002F\u002Fapp.epho.io\u002Fapi\u002Fv1\u002Fchat",[65,82,83],{"class":75}," \\\n",[65,85,87,90,93,97,100],{"class":67,"line":86},2,[65,88,89],{"class":75},"  -H",[65,91,92],{"class":79}," \"Authorization: Bearer ",[65,94,96],{"class":95},"s95oV","$EPHO_API_KEY",[65,98,99],{"class":79},"\"",[65,101,83],{"class":75},[65,103,105,107,110],{"class":67,"line":104},3,[65,106,89],{"class":75},[65,108,109],{"class":79}," \"Content-Type: application\u002Fjson\"",[65,111,83],{"class":75},[65,113,115,118],{"class":67,"line":114},4,[65,116,117],{"class":75},"  -d",[65,119,120],{"class":79}," '{\n",[65,122,124],{"class":67,"line":123},5,[65,125,126],{"class":79},"    \"prompt\": \"Create a small HTTP health endpoint and add a test.\",\n",[65,128,130],{"class":67,"line":129},6,[65,131,132],{"class":79},"    \"harness\": \"codex\",\n",[65,134,136],{"class":67,"line":135},7,[65,137,138],{"class":79},"    \"model\": \"gpt-5.5\",\n",[65,140,142,145,148],{"class":67,"line":141},8,[65,143,144],{"class":79},"    \"provider_api_key\": \"'\"",[65,146,147],{"class":95},"$OPENAI_API_KEY",[65,149,150],{"class":79},"\"'\"\n",[65,152,154],{"class":67,"line":153},9,[65,155,156],{"class":79},"  }'\n",[15,158,159,162],{},[62,160,161],{},"-N"," disables curl's output buffering so SSE frames appear immediately.",[15,164,165],{},"The first frame contains the identifiers you need for later reads:",[55,167,172],{"className":168,"code":170,"language":171,"meta":60},[169],"language-text","data: {\"type\":\"chat\",\"chat_id\":\"01K...\",\"turn_id\":\"01K...\"}\n","text",[62,173,170],{"__ignoreMap":60},[15,175,176],{},"Lifecycle and agent events follow:",[55,178,181],{"className":179,"code":180,"language":171,"meta":60},[169],"data: {\"type\":\"event\",\"event\":{\"type\":\"status\",\"phase\":\"provisioning\",\"message\":\"Creating a new sandbox…\"}}\ndata: {\"type\":\"event\",\"event\":{\"type\":\"status\",\"phase\":\"starting\",\"message\":\"Starting the agent…\"}}\n",[62,182,180],{"__ignoreMap":60},[15,184,185,186,189],{},"The stream ends with one ",[62,187,188],{},"done"," frame:",[55,191,194],{"className":192,"code":193,"language":171,"meta":60},[169],"data: {\"type\":\"done\",\"status\":\"completed\",\"output\":\"Added \u002Fhealth and its test.\",\"error\":null,\"artifacts\":[]}\n",[62,195,193],{"__ignoreMap":60},[10,197,199],{"id":198},"_3-queue-work-instead","3. Queue work instead",[15,201,202],{},"For jobs that should survive a client disconnect, use the asynchronous endpoint:",[55,204,206],{"className":57,"code":205,"language":59,"meta":60,"style":60},"curl https:\u002F\u002Fapp.epho.io\u002Fapi\u002Fv1\u002Fchat\u002Fasync \\\n  -H \"Authorization: Bearer $EPHO_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"prompt\": \"Create a small HTTP health endpoint and add a test.\",\n    \"harness\": \"codex\",\n    \"model\": \"gpt-5.5\",\n    \"provider_api_key\": \"'\"$OPENAI_API_KEY\"'\"\n  }'\n",[62,207,208,217,229,237,243,247,251,255,263],{"__ignoreMap":60},[65,209,210,212,215],{"class":67,"line":68},[65,211,72],{"class":71},[65,213,214],{"class":79}," https:\u002F\u002Fapp.epho.io\u002Fapi\u002Fv1\u002Fchat\u002Fasync",[65,216,83],{"class":75},[65,218,219,221,223,225,227],{"class":67,"line":86},[65,220,89],{"class":75},[65,222,92],{"class":79},[65,224,96],{"class":95},[65,226,99],{"class":79},[65,228,83],{"class":75},[65,230,231,233,235],{"class":67,"line":104},[65,232,89],{"class":75},[65,234,109],{"class":79},[65,236,83],{"class":75},[65,238,239,241],{"class":67,"line":114},[65,240,117],{"class":75},[65,242,120],{"class":79},[65,244,245],{"class":67,"line":123},[65,246,126],{"class":79},[65,248,249],{"class":67,"line":129},[65,250,132],{"class":79},[65,252,253],{"class":67,"line":135},[65,254,138],{"class":79},[65,256,257,259,261],{"class":67,"line":141},[65,258,144],{"class":79},[65,260,147],{"class":95},[65,262,150],{"class":79},[65,264,265],{"class":67,"line":153},[65,266,156],{"class":79},[15,268,269,270,273],{},"It returns immediately with ",[62,271,272],{},"202 Accepted",":",[55,275,279],{"className":276,"code":277,"language":278,"meta":60,"style":60},"language-json shiki shiki-themes github-dark","{\n  \"chat_id\": \"01K...\",\n  \"turn_id\": \"01K...\"\n}\n","json",[62,280,281,286,300,310],{"__ignoreMap":60},[65,282,283],{"class":67,"line":68},[65,284,285],{"class":95},"{\n",[65,287,288,291,294,297],{"class":67,"line":86},[65,289,290],{"class":75},"  \"chat_id\"",[65,292,293],{"class":95},": ",[65,295,296],{"class":79},"\"01K...\"",[65,298,299],{"class":95},",\n",[65,301,302,305,307],{"class":67,"line":104},[65,303,304],{"class":75},"  \"turn_id\"",[65,306,293],{"class":95},[65,308,309],{"class":79},"\"01K...\"\n",[65,311,312],{"class":67,"line":114},[65,313,314],{"class":95},"}\n",[15,316,317],{},"Read that turn later:",[55,319,321],{"className":57,"code":320,"language":59,"meta":60,"style":60},"curl https:\u002F\u002Fapp.epho.io\u002Fapi\u002Fv1\u002Fchat\u002F$CHAT_ID\u002Fturns\u002F$TURN_ID\u002Fresponse \\\n  -H \"Authorization: Bearer $EPHO_API_KEY\"\n",[62,322,323,344],{"__ignoreMap":60},[65,324,325,327,330,333,336,339,342],{"class":67,"line":68},[65,326,72],{"class":71},[65,328,329],{"class":79}," https:\u002F\u002Fapp.epho.io\u002Fapi\u002Fv1\u002Fchat\u002F",[65,331,332],{"class":95},"$CHAT_ID",[65,334,335],{"class":79},"\u002Fturns\u002F",[65,337,338],{"class":95},"$TURN_ID",[65,340,341],{"class":79},"\u002Fresponse",[65,343,83],{"class":75},[65,345,346,348,350,352],{"class":67,"line":86},[65,347,89],{"class":75},[65,349,92],{"class":79},[65,351,96],{"class":95},[65,353,354],{"class":79},"\"\n",[15,356,357],{},"Or reconnect to its event stream:",[55,359,361],{"className":57,"code":360,"language":59,"meta":60,"style":60},"curl -N https:\u002F\u002Fapp.epho.io\u002Fapi\u002Fv1\u002Fchat\u002F$CHAT_ID\u002Fevents\u002Fsubscribe \\\n  -H \"Authorization: Bearer $EPHO_API_KEY\"\n",[62,362,363,378],{"__ignoreMap":60},[65,364,365,367,369,371,373,376],{"class":67,"line":68},[65,366,72],{"class":71},[65,368,76],{"class":75},[65,370,329],{"class":79},[65,372,332],{"class":95},[65,374,375],{"class":79},"\u002Fevents\u002Fsubscribe",[65,377,83],{"class":75},[65,379,380,382,384,386],{"class":67,"line":86},[65,381,89],{"class":75},[65,383,92],{"class":79},[65,385,96],{"class":95},[65,387,354],{"class":79},[10,389,391],{"id":390},"_4-continue-the-conversation","4. Continue the conversation",[15,393,394,395,398],{},"Pass the returned ",[62,396,397],{},"chat_id"," with a new prompt. The chat keeps its harness, model,\nsystem prompt, MCP configuration, and sandbox size:",[55,400,402],{"className":57,"code":401,"language":59,"meta":60,"style":60},"curl -N https:\u002F\u002Fapp.epho.io\u002Fapi\u002Fv1\u002Fchat \\\n  -H \"Authorization: Bearer $EPHO_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"chat_id\": \"'\"$CHAT_ID\"'\",\n    \"prompt\": \"Now add a readiness endpoint.\",\n    \"provider_api_key\": \"'\"$OPENAI_API_KEY\"'\"\n  }'\n",[62,403,404,414,426,434,440,450,455,463],{"__ignoreMap":60},[65,405,406,408,410,412],{"class":67,"line":68},[65,407,72],{"class":71},[65,409,76],{"class":75},[65,411,80],{"class":79},[65,413,83],{"class":75},[65,415,416,418,420,422,424],{"class":67,"line":86},[65,417,89],{"class":75},[65,419,92],{"class":79},[65,421,96],{"class":95},[65,423,99],{"class":79},[65,425,83],{"class":75},[65,427,428,430,432],{"class":67,"line":104},[65,429,89],{"class":75},[65,431,109],{"class":79},[65,433,83],{"class":75},[65,435,436,438],{"class":67,"line":114},[65,437,117],{"class":75},[65,439,120],{"class":79},[65,441,442,445,447],{"class":67,"line":123},[65,443,444],{"class":79},"    \"chat_id\": \"'\"",[65,446,332],{"class":95},[65,448,449],{"class":79},"\"'\",\n",[65,451,452],{"class":67,"line":129},[65,453,454],{"class":79},"    \"prompt\": \"Now add a readiness endpoint.\",\n",[65,456,457,459,461],{"class":67,"line":135},[65,458,144],{"class":79},[65,460,147],{"class":95},[65,462,150],{"class":79},[65,464,465],{"class":67,"line":141},[65,466,156],{"class":79},[15,468,469],{},"Only one turn may be active in a chat at a time. Use separate chats for work\nthat needs to run concurrently.",[471,472,473],"style",{},"html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}",{"title":60,"searchDepth":86,"depth":86,"links":475},[476,477,478,479],{"id":12,"depth":86,"text":13},{"id":49,"depth":86,"text":50},{"id":198,"depth":86,"text":199},{"id":390,"depth":86,"text":391},"Create an API key and run your first cloud coding agent.","md",{},true,"\u002Fdocs\u002Fquickstart",{"title":5,"description":480},"docs\u002Fquickstart","nrf6TeFe1syQsn7yxez1jmfvP3cVM4svsgrU0ojI8-w",[489,492,495,498,501,504,507,510,511,514,517],{"path":490,"title":491},"\u002Fdocs","Overview",{"path":493,"title":494},"\u002Fdocs\u002Fauthentication","Authentication",{"path":496,"title":497},"\u002Fdocs\u002Fchats-and-turns","Chats and turns",{"path":499,"title":500},"\u002Fdocs\u002Ferrors","Errors and statuses",{"path":502,"title":503},"\u002Fdocs\u002Ffiles-and-repositories","Files and repositories",{"path":505,"title":506},"\u002Fdocs\u002Fharnesses-and-models","Harnesses and models",{"path":508,"title":509},"\u002Fdocs\u002Fmcp-and-environment","MCP and environment",{"path":484,"title":5},{"path":512,"title":513},"\u002Fdocs\u002Fresources-and-billing","Resources and billing",{"path":515,"title":516},"\u002Fdocs\u002Fresuming-chats","Resuming chats",{"path":518,"title":519},"\u002Fdocs\u002Frunning-agents","Running agents",1785310516452]