[{"data":1,"prerenderedAt":1115},["ShallowReactive",2],{"navigation":3,"\u002Freference\u002Fgateway-api":169,"\u002Freference\u002Fgateway-api-surround":1110},[4,28,85,127,157],{"title":5,"path":6,"stem":7,"children":8,"icon":27},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,12,17,22],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-house",{"title":13,"path":14,"stem":15,"icon":16},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":23,"path":24,"stem":25,"icon":26},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F4.architecture","i-lucide-layers","i-lucide-rocket",{"title":29,"icon":30,"path":31,"stem":32,"children":33,"page":84},"Concepts","i-lucide-lightbulb","\u002Fconcepts","2.concepts",[34,39,44,49,54,59,64,69,74,79],{"title":35,"path":36,"stem":37,"icon":38},"Durable agents","\u002Fconcepts\u002Fdurable-agents","2.concepts\u002F1.durable-agents","i-lucide-infinity",{"title":40,"path":41,"stem":42,"icon":43},"Glossary","\u002Fconcepts\u002Fglossary","2.concepts\u002F10.glossary","i-lucide-book-a",{"title":45,"path":46,"stem":47,"icon":48},"Restate in five minutes","\u002Fconcepts\u002Frestate-primer","2.concepts\u002F2.restate-primer","i-lucide-cpu",{"title":50,"path":51,"stem":52,"icon":53},"Entities & addressing","\u002Fconcepts\u002Fentities-addressing","2.concepts\u002F3.entities-addressing","i-lucide-at-sign",{"title":55,"path":56,"stem":57,"icon":58},"Timelines & events","\u002Fconcepts\u002Ftimelines-events","2.concepts\u002F4.timelines-events","i-lucide-list-ordered",{"title":60,"path":61,"stem":62,"icon":63},"Projections & the catalog","\u002Fconcepts\u002Fprojections-catalog","2.concepts\u002F5.projections-catalog","i-lucide-database",{"title":65,"path":66,"stem":67,"icon":68},"Workspaces & execution","\u002Fconcepts\u002Fworkspaces","2.concepts\u002F6.workspaces","i-lucide-terminal",{"title":70,"path":71,"stem":72,"icon":73},"Harnesses","\u002Fconcepts\u002Fharnesses","2.concepts\u002F7.harnesses","i-lucide-plug",{"title":75,"path":76,"stem":77,"icon":78},"Multi-agent patterns","\u002Fconcepts\u002Fmulti-agent","2.concepts\u002F8.multi-agent","i-lucide-network",{"title":80,"path":81,"stem":82,"icon":83},"Lifecycle & control","\u002Fconcepts\u002Flifecycle","2.concepts\u002F9.lifecycle","i-lucide-sliders-horizontal",false,{"title":86,"icon":87,"path":88,"stem":89,"children":90,"page":84},"Guides","i-lucide-book-open","\u002Fguides","3.guides",[91,106],{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":84},"Agents","i-lucide-bot","\u002Fguides\u002Fagents","3.guides\u002F1.agents",[97,101],{"title":98,"path":99,"stem":100,"icon":93},"Building agents","\u002Fguides\u002Fagents\u002Fbuilding-agents","3.guides\u002F1.agents\u002F1.building-agents",{"title":102,"path":103,"stem":104,"icon":105},"Frontend integration","\u002Fguides\u002Fagents\u002Ffrontend-integration","3.guides\u002F1.agents\u002F2.frontend-integration","i-lucide-monitor",{"title":107,"icon":108,"path":109,"stem":110,"children":111,"page":84},"Operations","i-lucide-server-cog","\u002Fguides\u002Foperations","3.guides\u002F2.operations",[112,117,122],{"title":113,"path":114,"stem":115,"icon":116},"Self-hosting","\u002Fguides\u002Foperations\u002Fself-hosting","3.guides\u002F2.operations\u002F1.self-hosting","i-lucide-server",{"title":118,"path":119,"stem":120,"icon":121},"Auth & API keys","\u002Fguides\u002Foperations\u002Fauth-api-keys","3.guides\u002F2.operations\u002F2.auth-api-keys","i-lucide-key-round",{"title":123,"path":124,"stem":125,"icon":126},"Backup & restore","\u002Fguides\u002Foperations\u002Fbackup-restore","3.guides\u002F2.operations\u002F3.backup-restore","i-lucide-database-backup",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":84},"Reference","i-lucide-book-marked","\u002Freference","4.reference",[133,138,143,148,153],{"title":134,"path":135,"stem":136,"icon":137},"Event schema","\u002Freference\u002Fevents","4.reference\u002F1.events","i-lucide-list-tree",{"title":139,"path":140,"stem":141,"icon":142},"Addressing","\u002Freference\u002Faddressing","4.reference\u002F2.addressing","i-lucide-map-pin",{"title":144,"path":145,"stem":146,"icon":147},"Gateway HTTP API","\u002Freference\u002Fgateway-api","4.reference\u002F3.gateway-api","i-lucide-webhook",{"title":149,"path":150,"stem":151,"icon":152},"CLI","\u002Freference\u002Fcli","4.reference\u002F4.cli","i-lucide-square-terminal",{"title":154,"path":155,"stem":156,"icon":83},"Configuration","\u002Freference\u002Fconfiguration","4.reference\u002F5.configuration",{"title":158,"path":159,"stem":160,"children":161,"icon":163},"Contributing","\u002Fcontributing","5.contributing\u002F1.index",[162,164],{"title":158,"path":159,"stem":160,"icon":163},"i-lucide-git-pull-request",{"title":165,"path":166,"stem":167,"icon":168},"The package map","\u002Fcontributing\u002Fpackage-map","5.contributing\u002F2.package-map","i-lucide-boxes",{"id":170,"title":144,"body":171,"description":1103,"extension":1104,"links":1105,"meta":1106,"navigation":1107,"path":145,"seo":1108,"stem":146,"__hash__":1109},"docs\u002F4.reference\u002F3.gateway-api.md",{"type":172,"value":173,"toc":1088},"minimark",[174,183,188,205,215,221,225,348,359,363,370,497,502,508,570,606,633,637,647,670,674,680,740,763,767,774,801,805,825,828,862,875,879,901,905,916,940,944,1054,1058,1084],[175,176,177,178,182],"p",{},"The ",[179,180,181],"a",{"href":14},"gateway"," is the single front door: your app, your UI, and the CLI reach teaspill only through it. The frontend SDK's actions client wraps this API, but the HTTP surface is public and stable — you can call it directly.",[184,185,187],"h2",{"id":186},"base-url-and-auth","Base URL and auth",[175,189,190,191,195,196,200,201,204],{},"The gateway listens on port ",[192,193,194],"strong",{},"8787"," by default (",[197,198,199],"code",{},"http:\u002F\u002Flocalhost:8787"," in local dev). Every route except ",[197,202,203],{},"GET \u002Fhealth"," requires an API key:",[206,207,212],"pre",{"className":208,"code":210,"language":211},[209],"language-text","Authorization: Bearer \u003Capi-key>\n","text",[197,213,210],{"__ignoreMap":214},"",[175,216,217,218,220],{},"See ",[179,219,118],{"href":119}," for minting keys and the optional browser read-token path.",[184,222,224],{"id":223},"routes","Routes",[226,227,228,244],"table",{},[229,230,231],"thead",{},[232,233,234,238,241],"tr",{},[235,236,237],"th",{},"Route",[235,239,240],{},"Method",[235,242,243],{},"Purpose",[245,246,247,261,274,286,302,318,335],"tbody",{},[232,248,249,255,258],{},[250,251,252],"td",{},[197,253,254],{},"\u002Fhealth",[250,256,257],{},"GET",[250,259,260],{},"Liveness. Public — no auth.",[232,262,263,268,271],{},[250,264,265],{},[197,266,267],{},"\u002Fapi\u002Fspawn",[250,269,270],{},"POST",[250,272,273],{},"Spawn an entity.",[232,275,276,281,283],{},[250,277,278],{},[197,279,280],{},"\u002Fapi\u002Fa\u002F:type\u002F:id\u002Fsend",[250,282,270],{},[250,284,285],{},"Send a message wake to an entity.",[232,287,288,293,295],{},[250,289,290],{},[197,291,292],{},"\u002Fapi\u002Fa\u002F:type\u002F:id\u002Fcontrol",[250,294,270],{},[250,296,297,298,301],{},"Apply a ",[179,299,300],{"href":81},"control verb",".",[232,303,304,309,312],{},[250,305,306],{},[197,307,308],{},"\u002Fstreams\u002F*",[250,310,311],{},"GET, HEAD, PUT, POST, DELETE",[250,313,314,315,317],{},"Proxy to the history store. Consumers read timelines and deltas with ",[197,316,257],{},"; the write methods carry the durable-streams append protocol.",[232,319,320,325,328],{},[250,321,322],{},[197,323,324],{},"\u002Fshapes\u002F*",[250,326,327],{},"GET, HEAD",[250,329,330,331,334],{},"Proxy to Electric (live ",[179,332,333],{"href":61},"catalog"," queries).",[232,336,337,342,345],{},[250,338,339],{},[197,340,341],{},"\u002Fregistry\u002F*",[250,343,344],{},"GET, POST, PUT, DELETE, PATCH",[250,346,347],{},"Deployment registration.",[175,349,350,351,354,355,358],{},"Commands (",[197,352,353],{},"\u002Fapi\u002F*",") also accept the fully-qualified form with an explicit tenant, for example ",[197,356,357],{},"POST \u002Fapi\u002Ft\u002F:tenant\u002Fa\u002F:type\u002F:id\u002Fsend",", accepted only for this deployment's own tenant.",[184,360,362],{"id":361},"commands","Commands",[175,364,365,366,369],{},"All three command endpoints are one-way durable sends. The response is ",[192,367,368],{},"202 Accepted"," with the entity URL and its timeline stream, so a caller immediately knows where to watch:",[206,371,375],{"className":372,"code":373,"language":374,"meta":214,"style":214},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"url\": \"\u002Ft\u002Fdefault\u002Fa\u002Fresearcher\u002F01j9z8k3q…\",\n  \"streamPath\": \"\u002Ft\u002Fdefault\u002Fagents\u002Fresearcher\u002F01j9z8k3q…\u002Ftimeline\",\n  \"streamUrl\": \"\u002Fstreams\u002Ft\u002Fdefault\u002Fagents\u002Fresearcher\u002F01j9z8k3q…\u002Ftimeline\",\n  \"restate\": { \"invocationId\": \"inv_…\" }\n}\n","json",[197,376,377,386,414,435,456,491],{"__ignoreMap":214},[378,379,382],"span",{"class":380,"line":381},"line",1,[378,383,385],{"class":384},"sMK4o","{\n",[378,387,389,392,396,399,402,405,409,411],{"class":380,"line":388},2,[378,390,391],{"class":384},"  \"",[378,393,395],{"class":394},"spNyl","url",[378,397,398],{"class":384},"\"",[378,400,401],{"class":384},":",[378,403,404],{"class":384}," \"",[378,406,408],{"class":407},"sfazB","\u002Ft\u002Fdefault\u002Fa\u002Fresearcher\u002F01j9z8k3q…",[378,410,398],{"class":384},[378,412,413],{"class":384},",\n",[378,415,417,419,422,424,426,428,431,433],{"class":380,"line":416},3,[378,418,391],{"class":384},[378,420,421],{"class":394},"streamPath",[378,423,398],{"class":384},[378,425,401],{"class":384},[378,427,404],{"class":384},[378,429,430],{"class":407},"\u002Ft\u002Fdefault\u002Fagents\u002Fresearcher\u002F01j9z8k3q…\u002Ftimeline",[378,432,398],{"class":384},[378,434,413],{"class":384},[378,436,438,440,443,445,447,449,452,454],{"class":380,"line":437},4,[378,439,391],{"class":384},[378,441,442],{"class":394},"streamUrl",[378,444,398],{"class":384},[378,446,401],{"class":384},[378,448,404],{"class":384},[378,450,451],{"class":407},"\u002Fstreams\u002Ft\u002Fdefault\u002Fagents\u002Fresearcher\u002F01j9z8k3q…\u002Ftimeline",[378,453,398],{"class":384},[378,455,413],{"class":384},[378,457,459,461,464,466,468,471,473,477,479,481,483,486,488],{"class":380,"line":458},5,[378,460,391],{"class":384},[378,462,463],{"class":394},"restate",[378,465,398],{"class":384},[378,467,401],{"class":384},[378,469,470],{"class":384}," {",[378,472,404],{"class":384},[378,474,476],{"class":475},"sBMFI","invocationId",[378,478,398],{"class":384},[378,480,401],{"class":384},[378,482,404],{"class":384},[378,484,485],{"class":407},"inv_…",[378,487,398],{"class":384},[378,489,490],{"class":384}," }\n",[378,492,494],{"class":380,"line":493},6,[378,495,496],{"class":384},"}\n",[498,499,501],"h3",{"id":500},"spawn","Spawn",[175,503,504,507],{},[197,505,506],{},"POST \u002Fapi\u002Fspawn"," with a JSON body:",[206,509,513],{"className":510,"code":511,"language":512,"meta":214,"style":214},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{ type: string, id?: string, args?: Json, parent?: string, workspaceRef?: string }\n","ts",[197,514,515],{"__ignoreMap":214},[378,516,517,520,523,525,529,532,535,538,540,542,545,547,550,552,555,557,559,561,564,566,568],{"class":380,"line":381},[378,518,519],{"class":384},"{",[378,521,522],{"class":475}," type",[378,524,401],{"class":384},[378,526,528],{"class":527},"sTEyZ"," string",[378,530,531],{"class":384},",",[378,533,534],{"class":527}," id",[378,536,537],{"class":384},"?:",[378,539,528],{"class":527},[378,541,531],{"class":384},[378,543,544],{"class":527}," args",[378,546,537],{"class":384},[378,548,549],{"class":527}," Json",[378,551,531],{"class":384},[378,553,554],{"class":527}," parent",[378,556,537],{"class":384},[378,558,528],{"class":527},[378,560,531],{"class":384},[378,562,563],{"class":527}," workspaceRef",[378,565,537],{"class":384},[378,567,528],{"class":527},[378,569,490],{"class":384},[175,571,572,575,576,580,581,584,585,588,589,592,593,597,598,601,602,605],{},[197,573,574],{},"id"," defaults to a fresh lowercase ULID; supply one for ",[179,577,579],{"href":578},"\u002Freference\u002Faddressing#instance-ids","deterministic spawn",". ",[197,582,583],{},"args"," is validated by the agent's spawn schema. ",[197,586,587],{},"parent"," is the parent entity URL. ",[197,590,591],{},"workspaceRef"," is an optional ",[179,594,596],{"href":595},"\u002Freference\u002Faddressing#workspace-keys","workspace key"," (",[197,599,600],{},"\u003Ctenant>\u002F\u003Cname>",") placing the new agent in a chosen — typically shared — ",[179,603,604],{"href":66},"workspace","; omit it and the agent gets its own private workspace.",[206,607,611],{"className":608,"code":609,"language":610,"meta":214,"style":214},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -X POST http:\u002F\u002Flocalhost:8787\u002Fapi\u002Fspawn \\\n  -H \"Authorization: Bearer $TEASPILL_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"type\":\"researcher\",\"args\":{\"topic\":\"the history of tea\"}}'\n","sh",[197,612,613,618,623,628],{"__ignoreMap":214},[378,614,615],{"class":380,"line":381},[378,616,617],{},"curl -X POST http:\u002F\u002Flocalhost:8787\u002Fapi\u002Fspawn \\\n",[378,619,620],{"class":380,"line":388},[378,621,622],{},"  -H \"Authorization: Bearer $TEASPILL_API_KEY\" \\\n",[378,624,625],{"class":380,"line":416},[378,626,627],{},"  -H \"Content-Type: application\u002Fjson\" \\\n",[378,629,630],{"class":380,"line":437},[378,631,632],{},"  -d '{\"type\":\"researcher\",\"args\":{\"topic\":\"the history of tea\"}}'\n",[498,634,636],{"id":635},"send","Send",[175,638,639,642,643,646],{},[197,640,641],{},"POST \u002Fapi\u002Fa\u002F:type\u002F:id\u002Fsend",". The body is the message, forwarded verbatim as a wake — the gateway never rewrites it, so use the canonical message shape unless your deployment normalizes shorthand (",[179,644,98],{"href":645},"\u002Fguides\u002Fagents\u002Fbuilding-agents#inboxschemas"," covers both).",[206,648,650],{"className":608,"code":649,"language":610,"meta":214,"style":214},"curl -X POST http:\u002F\u002Flocalhost:8787\u002Fapi\u002Fa\u002Fresearcher\u002Fr1\u002Fsend \\\n  -H \"Authorization: Bearer $TEASPILL_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"kind\":\"message\",\"content\":[{\"type\":\"text\",\"text\":\"add a section on green tea\"}]}'\n",[197,651,652,657,661,665],{"__ignoreMap":214},[378,653,654],{"class":380,"line":381},[378,655,656],{},"curl -X POST http:\u002F\u002Flocalhost:8787\u002Fapi\u002Fa\u002Fresearcher\u002Fr1\u002Fsend \\\n",[378,658,659],{"class":380,"line":388},[378,660,622],{},[378,662,663],{"class":380,"line":416},[378,664,627],{},[378,666,667],{"class":380,"line":437},[378,668,669],{},"  -d '{\"kind\":\"message\",\"content\":[{\"type\":\"text\",\"text\":\"add a section on green tea\"}]}'\n",[498,671,673],{"id":672},"control","Control",[175,675,676,679],{},[197,677,678],{},"POST \u002Fapi\u002Fa\u002F:type\u002F:id\u002Fcontrol"," with a verb:",[206,681,683],{"className":510,"code":682,"language":512,"meta":214,"style":214},"{ verb: \"interrupt\" | \"pause\" | \"resume\" | \"archive\", reason?: string }\n",[197,684,685],{"__ignoreMap":214},[378,686,687,689,692,694,696,699,701,704,706,709,711,713,715,718,720,722,724,727,729,731,734,736,738],{"class":380,"line":381},[378,688,519],{"class":384},[378,690,691],{"class":475}," verb",[378,693,401],{"class":384},[378,695,404],{"class":384},[378,697,698],{"class":407},"interrupt",[378,700,398],{"class":384},[378,702,703],{"class":384}," |",[378,705,404],{"class":384},[378,707,708],{"class":407},"pause",[378,710,398],{"class":384},[378,712,703],{"class":384},[378,714,404],{"class":384},[378,716,717],{"class":407},"resume",[378,719,398],{"class":384},[378,721,703],{"class":384},[378,723,404],{"class":384},[378,725,726],{"class":407},"archive",[378,728,398],{"class":384},[378,730,531],{"class":384},[378,732,733],{"class":527}," reason",[378,735,537],{"class":384},[378,737,528],{"class":527},[378,739,490],{"class":384},[206,741,743],{"className":608,"code":742,"language":610,"meta":214,"style":214},"curl -X POST http:\u002F\u002Flocalhost:8787\u002Fapi\u002Fa\u002Fresearcher\u002Fr1\u002Fcontrol \\\n  -H \"Authorization: Bearer $TEASPILL_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"verb\":\"interrupt\",\"reason\":\"user cancelled\"}'\n",[197,744,745,750,754,758],{"__ignoreMap":214},[378,746,747],{"class":380,"line":381},[378,748,749],{},"curl -X POST http:\u002F\u002Flocalhost:8787\u002Fapi\u002Fa\u002Fresearcher\u002Fr1\u002Fcontrol \\\n",[378,751,752],{"class":380,"line":388},[378,753,622],{},[378,755,756],{"class":380,"line":416},[378,757,627],{},[378,759,760],{"class":380,"line":437},[378,761,762],{},"  -d '{\"verb\":\"interrupt\",\"reason\":\"user cancelled\"}'\n",[498,764,766],{"id":765},"idempotency","Idempotency",[175,768,769,770,773],{},"Send an ",[197,771,772],{},"Idempotency-Key"," header on any command and the gateway forwards it verbatim, so a retried request is deduplicated within the retention window (default 24 h) instead of spawning or sending twice.",[206,775,777],{"className":608,"code":776,"language":610,"meta":214,"style":214},"curl -X POST http:\u002F\u002Flocalhost:8787\u002Fapi\u002Fspawn \\\n  -H \"Authorization: Bearer $TEASPILL_API_KEY\" \\\n  -H \"Idempotency-Key: spawn-researcher-nightly-2026-07-19\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"type\":\"researcher\",\"id\":\"nightly\",\"args\":{\"topic\":\"tea\"}}'\n",[197,778,779,783,787,792,796],{"__ignoreMap":214},[378,780,781],{"class":380,"line":381},[378,782,617],{},[378,784,785],{"class":380,"line":388},[378,786,622],{},[378,788,789],{"class":380,"line":416},[378,790,791],{},"  -H \"Idempotency-Key: spawn-researcher-nightly-2026-07-19\" \\\n",[378,793,794],{"class":380,"line":437},[378,795,627],{},[378,797,798],{"class":380,"line":458},[378,799,800],{},"  -d '{\"type\":\"researcher\",\"id\":\"nightly\",\"args\":{\"topic\":\"tea\"}}'\n",[184,802,804],{"id":803},"reading-streams","Reading streams",[175,806,807,810,811,815,816,819,820,822,823,301],{},[197,808,809],{},"GET \u002Fstreams\u002F\u003Cpath>"," proxies the history store byte-for-byte. Use it to read an entity's timeline or deltas; the stream URL comes back in every command's 202 response, or derive it with the ",[179,812,814],{"href":813},"\u002Freference\u002Faddressing#stream-paths","addressing helpers",". The route also forwards the durable-streams write protocol (",[197,817,818],{},"PUT"," to create a stream, ",[197,821,270],{}," to append) so the projection path can publish through the same front door — as a consumer you only ever issue ",[197,824,257],{},[175,826,827],{},"The read protocol passes through untouched:",[829,830,831,838,848],"ul",{},[832,833,834,837],"li",{},[192,835,836],{},"Resumable."," Every response carries a next-offset header; reconnect from your last offset to continue exactly where you left off.",[832,839,840,843,844,847],{},[192,841,842],{},"Long-poll."," Request ",[197,845,846],{},"live"," to park the connection until new events arrive, instead of polling.",[832,849,850,853,854,857,858,861],{},[192,851,852],{},"Cacheable."," ",[197,855,856],{},"ETag"," and ",[197,859,860],{},"Cache-Control"," ride catch-up reads, so already-read history is cheap.",[175,863,864,865,868,869,872,873,301],{},"Reads are ordered by ",[197,866,867],{},"seq"," and gapless (see ",[179,870,134],{"href":871},"\u002Freference\u002Fevents#the-seq-guarantees","); a gap means drift, and the reducer in the frontend SDK surfaces it. Consuming and rendering a stream is covered in ",[179,874,102],{"href":103},[184,876,878],{"id":877},"shapes","Shapes",[175,880,881,884,885,887,888,891,892,891,895,891,897,900],{},[197,882,883],{},"GET \u002Fshapes\u002Fv1\u002Fshape?…"," proxies to Electric, which serves the ",[179,886,333],{"href":61}," as live-updating queries. Filter by scalar columns — ",[197,889,890],{},"type",", ",[197,893,894],{},"status",[197,896,587],{},[197,898,899],{},"tenant",". This is how lists and dashboards stay live; the frontend SDK's catalog client wraps it.",[184,902,904],{"id":903},"registry","Registry",[175,906,907,909,910,912,913,915],{},[197,908,341],{}," forwards deployment registration to Restate's admin API. Registration is how your agent-loop and executor services become reachable; the ",[179,911,149],{"href":150}," and the reference deployment drive it for you, and ",[179,914,113],{"href":114}," covers the networking rules.",[917,918,919],"warning",{},[175,920,177,921,924,925,928,929,932,933,939],{},[197,922,923],{},"uri"," you register is dialed directly by Restate from inside its container — that traffic does not pass through the gateway, and the gateway performs no URL rewriting. Register a compose-network service by its service name (",[197,926,927],{},"http:\u002F\u002Fagent-loop:9080",") and a host-run service as ",[197,930,931],{},"http:\u002F\u002Fhost.docker.internal:\u003Cport>"," — ",[192,934,935,936],{},"never ",[197,937,938],{},"localhost",", which resolves to the container itself and fails on the first invocation.",[184,941,943],{"id":942},"status-codes","Status codes",[226,945,946,956],{},[229,947,948],{},[232,949,950,953],{},[235,951,952],{},"Code",[235,954,955],{},"When",[245,957,958,977,989,1001,1011,1021,1031,1044],{},[232,959,960,965],{},[250,961,962],{},[197,963,964],{},"200",[250,966,967,968,891,971,891,974,976],{},"A successful read (",[197,969,970],{},"\u002Fstreams",[197,972,973],{},"\u002Fshapes",[197,975,254],{},").",[232,978,979,984],{},[250,980,981],{},[197,982,983],{},"202",[250,985,986,987,976],{},"A command was accepted (",[197,988,353],{},[232,990,991,996],{},[250,992,993],{},[197,994,995],{},"400",[250,997,998,999,301],{},"Malformed request — a bad entity id, an unknown control verb, an invalid ",[197,1000,890],{},[232,1002,1003,1008],{},[250,1004,1005],{},[197,1006,1007],{},"401",[250,1009,1010],{},"Missing or invalid credentials. On the read-token path, reconnect with a fresh token — the stream is resumable, so resume from your last offset.",[232,1012,1013,1018],{},[250,1014,1015],{},[197,1016,1017],{},"403",[250,1019,1020],{},"A read token whose prefix does not cover the requested path.",[232,1022,1023,1028],{},[250,1024,1025],{},[197,1026,1027],{},"404",[250,1029,1030],{},"Unknown route, missing stream path, or a command to an entity type Restate has not seen (register the deployment first).",[232,1032,1033,1038],{},[250,1034,1035],{},[197,1036,1037],{},"413",[250,1039,1040,1041,976],{},"Request body over the cap (1 MiB default, ",[197,1042,1043],{},"GATEWAY_MAX_BODY_BYTES",[232,1045,1046,1051],{},[250,1047,1048],{},[197,1049,1050],{},"502",[250,1052,1053],{},"The gateway could not reach an upstream service.",[184,1055,1057],{"id":1056},"cors","CORS",[175,1059,1060,1061,857,1063,1065,1066,1069,1070,1072,1073,1075,1076,1079,1080,1083],{},"Browsers read ",[197,1062,308],{},[197,1064,324],{}," cross-origin, so the gateway answers the preflight and sets response CORS headers ",[192,1067,1068],{},"for GET on those two route families only"," — never ",[197,1071,353],{}," or ",[197,1074,341],{},". Offset, cursor, and etag headers are exposed so a browser can read them, and CORS headers ride 401\u002F403 rejections too, so a browser can react. Set ",[197,1077,1078],{},"GATEWAY_CORS_ALLOW_ORIGINS"," to pin specific origins; the default ",[197,1081,1082],{},"*"," is safe because a read token still gates the actual read.",[1085,1086,1087],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":214,"searchDepth":381,"depth":388,"links":1089},[1090,1091,1092,1098,1099,1100,1101,1102],{"id":186,"depth":388,"text":187},{"id":223,"depth":388,"text":224},{"id":361,"depth":388,"text":362,"children":1093},[1094,1095,1096,1097],{"id":500,"depth":416,"text":501},{"id":635,"depth":416,"text":636},{"id":672,"depth":416,"text":673},{"id":765,"depth":416,"text":766},{"id":803,"depth":388,"text":804},{"id":877,"depth":388,"text":878},{"id":903,"depth":388,"text":904},{"id":942,"depth":388,"text":943},{"id":1056,"depth":388,"text":1057},"The gateway's public HTTP surface — command endpoints, stream and shape proxies, deployment registration, auth, idempotency, and status codes.","md",null,{},{"icon":147},{"title":144,"description":1103},"42bfg00VqjoGmgQ3_aI4WE52Kw7UNeW6k_GguHzZzzc",[1111,1113],{"title":139,"path":140,"stem":141,"description":1112,"icon":142,"children":-1},"Entity URLs, the gateway short form, stream paths, workspace keys, the segment grammar, and the addressing helpers in @teaspill\u002Fschema.",{"title":149,"path":150,"stem":151,"description":1114,"icon":152,"children":-1},"The teaspill command-line tool — global configuration and every command: dev, agents, spawn, send, control, logs, and keys.",1784473423546]