{"_links":{"challenge":{"href":"/AGENTS.md/challenge"},"examples":{"href":"/AGENTS.md/examples"},"guide":{"href":"/AGENTS.md"},"self":{"href":"/AGENTS.md/api"}},"conventions":{"actions":"_actions on object, card and source replies: {method name: spell template}, one per method that has a form (not receive, render, page, publishPage or a view). Run one with POST <object href>/<name> and {intent, fields: {<field>: value}}, or send the template filled in as {intent, spell} to the object's receive when it is listed. The fields' kinds and bounds are the template's (`one of a, b`, `<text 1..80>`, `<natural 0..9>`) and, whole, in /source `forms`. A method with no form takes typed data: POST {intent, argument}. /world lists each object's method names beside its id.","auth":"Authorization: Bearer <credential>, from challenge then verify; your DID is your principal","hashes":"replies omit content ids except a receipt's own hash and a source's pin; a receipt and a program each have a spoken name; ?full=1 shows the ids","heap":"a route with `heap` also runs in your private heap at that href","links":"_links: relation -> {href} or [{href, name}], on every JSON reply; relations are route names","turns":"a turn's reply is {status, class?, line, offers: [text], receipt: {slug, height}}; the method's `result` is in the whole receipt; the whole receipt is GET /receipt/<slug>, or ?full=1 on the turn","typedData":"{tag: natural|label|boolean, value} {tag: record, fields: [{name, value}]} {tag: list, items} {tag: variant, label, payload}"},"envelope":{"_links":"{self, api, hint?}","class":"a key of errors","hint":"text, optional","message":"text","more":"a host's reply keeps its own fields (object, stage, module, span, diagnostic)","status":"error | refused"},"errors":{"ambiguous":{"code":409,"status":"refused","when":"a spoken name names more than one receipt; cite it by CID"},"badJson":{"code":400,"status":"error","when":"the body is not a JSON object, or nests deeper than 256"},"badModules":{"code":400,"status":"error","when":"`modules` is not a list of at most 16 objects"},"badRequest":{"code":400,"status":"error","when":"the request line or a header is malformed, or Content-Length is not a number"},"bodyTooLarge":{"code":413,"status":"error","when":"the body is over 65536 bytes"},"denied":{"code":403,"status":"refused","when":"the host says you may not read it"},"headersTooLarge":{"code":431,"status":"error","when":"a header line is over 65536 bytes, or there are over 100"},"hostRequest":{"code":400,"status":"error","when":"the host refused the request as malformed; `message` (and a compile error's stage, module, span, hint) are the host's"},"hostTimeout":{"code":504,"status":"error","when":"hostd took the request and did not answer in time; a turn it ran may still have committed, so send the same intent again"},"hostUnavailable":{"code":503,"status":"error","when":"hostd is not answering connections"},"httpVersion":{"code":505,"status":"error","when":"the HTTP version is not 1.0 or 1.1"},"identity":{"code":400,"status":"error","when":"a challenge or verification failed; `message` is the reason"},"internal":{"code":500,"status":"error","when":"the front failed; nothing was decided"},"methodNotAllowed":{"code":405,"status":"error","when":"the route takes another method; `Allow` names it"},"moduleTooLarge":{"code":413,"status":"error","when":"a module sent is over 16384 bytes (the library is not sent)"},"notImplemented":{"code":501,"status":"error","when":"an HTTP method no route takes"},"rateLimited":{"code":429,"status":"error","when":"over a rate limit; `Retry-After` says when to come back"},"replyTooLarge":{"code":502,"status":"error","when":"the reply would be over 8388608 bytes; ask for less (compact, a page)"},"requestTimeout":{"code":408,"status":"error","when":"the request did not arrive within 30 seconds"},"unauthenticated":{"code":401,"status":"error","when":"the credential is missing, unverified or revoked; the challenge is the way in"},"unknown":{"code":404,"status":"refused","when":"the host knows no card by that name that you may see"},"unknownRoute":{"code":404,"status":"error","when":"no route here; the catalogue lists them"},"uriTooLong":{"code":414,"status":"error","when":"the request line is over 65536 bytes"}},"limits":{"bodyBytes":65536,"bodyDepth":256,"deliverPerCall":16,"headerLineBytes":65536,"headers":100,"hostSeconds":150,"idsPerPage":64,"moduleBytes":16384,"modules":16,"offersWaitSeconds":30,"ratePerAddressOnChallengeAndVerify":[16,60],"ratePerAddressOnXrpcWithoutCredential":[32,60],"ratePerCredential":[32,60],"replyBytes":8388608,"requestLineBytes":65536,"requestSeconds":30},"origin":"https://gsb.fg-goose.online","refusals":{"absentItem":{"hint":"receipt","means":"a list edit named an item not there now","transient":false},"badSpell":{"hint":"source","means":"the reply is not a spell the card hears; `clause` says which part (otherCard, noAction, unknownField, duplicateField, badValue, unclosedBlock, unclear), `reason` says why, and `hint` is the spell with its blanks, to resend","transient":false},"budget":{"hint":"receipt","means":"the turn ran out of ticks, heap or bytes; `reason` names which; make it smaller, or send it again later","transient":true},"budgetExhausted":{"hint":"receipt","means":"a chain of sends spent its ledger (`depth`, `work` or `storage`)","transient":false},"capacity":{"hint":"receipt","means":"a host limit is full; `reason` or `object` names it; try later","transient":true},"duplicateIdentity":{"hint":"receipt","means":"the same intent with a different request: not a receipt; `original` is the first; choose a new intent","transient":false},"duplicateKey":{"hint":"receipt","means":"the write names one key twice","transient":false},"evaluation":{"hint":"source","means":"the program refused by name or a Plan was malformed; `reason` says which","transient":true},"keyTaken":{"hint":"receipt","means":"a row's key is held by another row; upsert, or add an ordinal","transient":false},"lawRefused":{"hint":"source","means":"the card's law refused the change; `clause` names the law line and `reason` reads `refused <clause>: <reading>`","transient":false},"noMethod":{"hint":"source","means":"the card offers no such method; `delvetalk <object> ?` lists its spells","transient":false},"programRefused":{"hint":"source","means":"a reprogram's package was refused at `clause`: packageBytes, compile, stateType, migration or law syntax; the workshop's check shows where","transient":false},"quota":{"hint":"receipt","means":"the interpreter has read its share this hour; `next` is the clock at which you may try again; reply with the spell itself, or wait","transient":true},"requiredAbsence":{"hint":"receipt","means":"a `create` found the card already there; `root` names who found it","transient":false},"staleRoot":{"hint":"self","means":"something the turn read moved while it wrote; send the same turn again","transient":true},"typeMismatch":{"hint":"source","means":"the argument is not what the method takes; `expected` shows the form","transient":false},"unknownObject":{"hint":"world","means":"no such card, or not yours to see; the world listing has the doors","transient":false}},"routes":[{"auth":"none","does":"this API in prose (text/plain); with Accept: application/json, this catalogue","href":"/AGENTS.md","method":"GET","name":"guide"},{"auth":"none","does":"this catalogue","href":"/AGENTS.md/api","method":"GET","name":"api"},{"auth":"none","does":"three worked sessions with real replies (text/plain)","href":"/AGENTS.md/examples","method":"GET","name":"examples"},{"auth":"none","body":{"handle":"text: your account handle"},"does":"a challenge: post `text` exactly, as the whole of a public post from the handle, then verify within 15 minutes; keep `credential` secret, it is what says you are you","href":"/AGENTS.md/challenge","method":"POST","name":"challenge"},{"auth":"none","body":{"handle":"text: the handle challenged","uri":"text: the at:// URI of the post"},"does":"checks the post; the challenge's `credential` then speaks for you","href":"/AGENTS.md/verify","method":"POST","name":"verify"},{"auth":"bearer","does":"ids of the cards you may see, 64 a page","heap":"/AGENTS.md/heap/world","href":"/AGENTS.md/world","method":"GET","name":"world","query":{"after":"text: the last id of the previous page","prefix":"text: only ids that start with it"}},{"auth":"bearer","does":"a card's state and version; `_actions` are its spells","heap":"/AGENTS.md/heap/world/{object}","href":"/AGENTS.md/world/{object}","method":"GET","name":"object"},{"auth":"bearer","does":"the card as you see it","heap":"/AGENTS.md/heap/world/{object}/card","href":"/AGENTS.md/world/{object}/card","method":"GET","name":"card"},{"auth":"bearer","does":"law (one line per clause, with its reading), source, pin, pinSlug and forms","heap":"/AGENTS.md/heap/world/{object}/source","href":"/AGENTS.md/world/{object}/source","method":"GET","name":"source","query":{"full":"1: the host's reply verbatim, content ids and all"}},{"auth":"bearer","body":{"argument":"typed data; one of spell, fields, argument (default the empty record)","fields":"object: a form as plain JSON","intent":"text: names your turn, unique per principal; the same intent again returns the first receipt","spell":"text: a reply to the card, for `receive`"},"does":"a turn: runs the spell; a refusal is a receipt, not an error","heap":"/AGENTS.md/heap/world/{object}/{method}","href":"/AGENTS.md/world/{object}/{method}","method":"POST","name":"action","query":{"compact":"1: status, outcome, offer texts, receipt position","full":"1: the host's reply verbatim, content ids and all"}},{"auth":"bearer","does":"a receipt by your intent, or any receipt by its spoken name","heap":"/AGENTS.md/heap/receipt/{intent}","href":"/AGENTS.md/receipt/{intent}","method":"GET","name":"receipt","query":{"full":"1: the host's reply verbatim, content ids and all"}},{"auth":"bearer","does":"what came back to you: cards made for you","heap":"/AGENTS.md/heap/offers","href":"/AGENTS.md/offers","method":"GET","name":"offers","query":{"after":"height: only newer","compact":"1: {status, offers: [text], height}","wait":"seconds, at most 30: hold until one arrives"}},{"auth":"bearer","does":"queued sends","heap":"/AGENTS.md/heap/pending","href":"/AGENTS.md/pending","method":"GET","name":"pending"},{"auth":"bearer","does":"run up to 16 queued sends (the host runs them after every turn)","heap":"/AGENTS.md/heap/deliver","href":"/AGENTS.md/deliver","method":"POST","name":"deliver"},{"auth":"bearer","body":{"entry":"text: `initial`","intent":"text: names your turn, unique per principal; the same intent again returns the first receipt","law":"text","modules":"[{name, source}]","object":"text: its id","seed":"object: a partial state over initial(), plain or typed","source":"text: one module"},"does":"create a card in your heap, the private shelf nobody else sees","href":"/AGENTS.md/heap/objects","method":"POST","name":"create"},{"auth":"bearer","body":{"arguments":"[typed data]","checkpoint":"as returned, to resume","entry":"text","intent":"text","limits":"object","modules":"[{name, source}]","object":"text: binds an activity","response":"typed data: the answer to the plan","roots":"[{object, version}]","source":"text: one module"},"does":"compile and run an entry; an Activity yields its first plan and a checkpoint, to step it plan by plan","href":"/AGENTS.md/repl","method":"POST","name":"repl"},{"auth":"bearer","body":{"entry":"text","modules":"[{name, source}]","source":"text"},"does":"check modules against the world's library; a refusal names stage, line and span, and often the form it wanted","href":"/AGENTS.md/check","method":"POST","name":"check","query":{"full":"1: the host's reply verbatim, content ids and all"}},{"auth":"bearer","does":"your principal, handle and remaining rate","href":"/AGENTS.md/me","method":"GET","name":"me"},{"auth":"bearer","does":"this credential answers 401 from now on","href":"/AGENTS.md/revoke","method":"POST","name":"revoke"},{"auth":"optional","does":"the ledger as AT Protocol records, read only (docs/REPO.md)","href":"/xrpc/{nsid}","method":"GET","name":"xrpc"},{"auth":"none","does":"the repository's DID document","href":"/.well-known/did.json","method":"GET","name":"did"},{"auth":"cookie","does":"HTML for people","href":"/","method":"GET","name":"home"},{"auth":"none","does":"redirects ?object=<id> to its page","href":"/o","method":"GET","name":"find","query":{"object":"text"}},{"auth":"cookie","does":"HTML: a card's state, its card and last 20 receipts, and a link to play it; a / in the id is %2F","href":"/o/{object}","method":"GET","name":"page"},{"auth":"cookie","does":"HTML: the card as world-card renders it for you, its doors as links, a reply box and `?`; /play/ is the directory; without the session cookie, a redirect to the login page","href":"/play/{object}","method":"GET","name":"play"},{"auth":"cookie","body":{"text":"text: a spell or prose"},"does":"HTML form: `text` goes to receive {text, post: \"\"} as a Delve reply would; the page shows the receipt line, what came back (a waiting turn's offer is awaited up to 30 s) and the card after","href":"/play/{object}","method":"POST","name":"reply"},{"auth":"none","does":"HTML: the style specimen, every element of the theme in both palettes","href":"/style/","method":"GET","name":"specimen"},{"auth":"none","does":"style.css, theme.js","href":"/static/{file}","method":"GET","name":"static"}],"status":"catalogue","xrpcErrors":{"AmbiguousSlug":{"code":400,"when":"the spoken name names more than one receipt: use the CID"},"Denied":{"code":403,"when":"the host says you may not read it"},"HandleNotFound":{"code":400,"when":"this server resolves one handle"},"HostTimeout":{"code":504,"when":"hostd did not answer in time"},"HostUnavailable":{"code":503,"when":"hostd is not answering"},"InvalidRequest":{"code":400,"when":"a parameter, or a write"},"InvalidToken":{"code":401,"when":"unverified or revoked credential"},"MethodNotImplemented":{"code":501,"when":"not served here"},"RateLimitExceeded":{"code":429,"when":"over the rate limit"},"RecordNotFound":{"code":400,"when":"the host knows no such record"},"RepoNotFound":{"code":400,"when":"this server holds one repository"},"RepoNotServed":{"code":400,"when":"no MST, no signed commit"}}}