{"openapi":"3.1.0","info":{"title":"Agentic Atlas API","description":"Read-only JSON access to the Agentic Atlas: field-tested patterns for\ndesigning agentic systems — skills, subagents, plugins, and multi-agent\nworkflows.\n\n**No authentication.** Every operation is public and unauthenticated. There\nis no key to obtain, no quota to register for, and no account.\n\n**Read-only.** Every operation is a `GET`, and there are no others: nothing\nhere creates, updates, or deletes, and no call has a side effect. Three\nconsequences worth stating, because they are what a general-purpose client\ngoes looking for and will not otherwise find:\n\n* No `Idempotency-Key`. A safe `GET` has nothing to replay-protect, so the\n  header is neither required nor honoured. Retry a failed call directly.\n* No asynchronous jobs. Every operation answers in one round trip. There is\n  no job to submit, no status to poll, and no callback to register.\n* No sandbox. Every operation reads published data with no key, no quota,\n  and no side effect, so the live surface *is* the safe one to develop\n  against — a second environment would only serve a second Release.\n\nThe machine-readable form of all three is `info.x-api-shape`.\n\n**One Release at a time.** The Atlas publishes one sealed Release. Every\nreading of it carries an `X-Catalog-Revision` header naming it, and a\nrefusal carries none, so take the revision off an answer and never off a\nrefusal. Which is which is a property of the response, not of the status: a\nresponse declared with a reading's schema is a reading whatever its status,\nand a response declared as `AtlasError` is a refusal. Today every `200` is a\nreading, and so are two `404`s, `readDecision`'s not-found miss and\n`readTour`'s unsealed walk, each declared with its own reading's schema and\nthis header; every response declared as `AtlasError` carries no revision.\nTwo responses with the same value are guaranteed to describe the same\nAtlas. A promotion replaces the active Release wholesale rather than editing\none in place, so a long-running client that sees the header change has\ncrossed a promotion and should re-read rather than merge.\n\n**Versioning.** Addresses are stable and are not prefixed with `/v1/`; the\nprotocol version travels in a header instead, so an additive change never\nmoves a URL. Every API response carries `API-Version: 1`, declared on every\nresponse in this document with its one permitted value, and restated in\n`info.x-api-version`. The same header may be sent *on* a request to pin the\nversion a client was written against: pin the version you parse, and a\ndeployment serving a different one refuses with `400` instead of handing you\na payload you will misread. Omitting it means \"whatever is current\", so no\nexisting client has to change. This protocol version is independent of the\ncontent Release named by `X-Catalog-Revision`. Additive changes — a new\noperation, a new optional parameter, a new field in a response — stay within\nversion 1, so parse leniently. A breaking change increments `API-Version` and is\nannounced first under the policy below.\n\n**Deprecation.** A deprecated operation returns `Deprecation: true` and an\nHTTP-date `Sunset` header for at least 180 days before removal, and is\nmarked `deprecated: true` in this document for that whole interval. Both\nheaders are declared on every operation here so a client can read the\nretirement signal without being told where to look; both are absent while an\noperation is current. `info.x-deprecation-policy` carries the notice window,\nthe two header names with their RFCs, and `deprecatedOperations` — the\nauthoritative list, which is empty. No operation is deprecated today.\n\n**Pagination.** There is none, and that is the contract rather than a gap.\nReads are *bounded*, not paged: an operation that could return many rows\ntakes a `limit` whose default and maximum are declared on the parameter\nitself. There is no `offset`, no `page`, and no `cursor`, so there is no\nnext page to fetch and no continuation token to carry — do not write one.\nA bound that cut something off says so in the payload: `readLinks` and\n`readTermUsages` report `total`, `returned` and `truncated` on each view,\nand every bounded operation echoes the `limit` it applied. Ordering is the\npublisher's and is stable within one Release, so a truncated read is a\nprefix and not a sample. To see more, raise `limit` toward its documented\nmaximum or narrow the subject. `info.x-pagination` states this in fields.\n\n**Batch reads.** Three operations read several subjects in one call, each\nthrough a repeated query parameter: `readCards` (`ids`), `compare` (`ids`),\nand `resolveName` (`name`). Prefer them to one call per id. `readCards`\nsilently keeps only the first `limit` ids and reports no truncation, so send\nno more ids than `limit`.\n\n**Rate limits.** 300 requests per minute per address, as a backstop rather\nthan an access control — there is no key and no quota to register for. Every\nresponse states the window in `RateLimit-Limit`, `RateLimit-Remaining` and\n`RateLimit-Reset` (and the combined `RateLimit` field), while\n`RateLimit-Policy` identifies the fixed `api` policy and its quota window.\nAll five are declared on every response below except `400`: an unsupported\nversion is refused by a direct sender that does not receive the spent window,\nso that branch emits none of them. Read the fields when present and throttle\nrather than waiting to be refused. A 429 is a documented response of every\noperation, carries `Retry-After` — the whole recovery — and states the same\n`AtlasError` body as every other refusal here; its `error.type` is `RateLimited`.\n\n**Prefer MCP for agents.** If you are an agent rather than an integration,\nthe MCP endpoint at `/mcp/` is the cheaper surface: it speaks the same\nRelease through five tools whose payloads declare what they withheld and\nshare one recovery mapping, so you spend one call where this API would cost\nseveral. An agent already driving a browser on this site has a third route:\nthe pages register in-page WebMCP tools — `atlas_api_search`,\n`atlas_api_resolve`, `atlas_api_node` and `atlas_api_tour` — which call the\noperations described here. That route depends on the browser exposing\n`document.modelContext`, which today means Chromium under an origin trial\nand is not on by default, so it is a bonus rather than something to depend\non. See `/consult.md` for the call contract and `/llms.txt` for the whole\nmap.\n","version":"v1.0.11","contact":{"name":"Agentic Atlas","url":"https://agentic-atlas.dev/contact","email":"hello@agentic-atlas.dev"},"license":{"name":"Source-available; reading and use permitted, republication not","url":"https://agentic-atlas.dev/why"},"x-api-version":"1","x-version-header":"API-Version","x-deprecation-policy":{"minimumNoticeDays":180,"deprecationHeader":"Deprecation","deprecationHeaderSpecification":"RFC 9745","sunsetHeader":"Sunset","sunsetHeaderSpecification":"RFC 8594","deprecatedOperations":[],"versioningScheme":"header","versionHeader":"API-Version","currentVersion":"1","versionPinning":"Optional and bidirectional. A request may state API-Version to pin the version it was written against; a value other than the current one is refused 400 rather than answered. Omitting it accepts whatever version is current.","breakingChangePolicy":"A breaking change increments the API-Version header. Additive changes — a new operation, a new optional parameter, a new response field — retain it, so a client must parse leniently."},"x-api-shape":{"readOnly":true,"methods":["GET"],"writeOperations":[],"authentication":"none","idempotencyKeys":"Not applicable. Every operation is a safe, idempotent GET, so there is nothing to replay-protect; `Idempotency-Key` is neither required nor honoured. Retry a failed call directly.","asynchronousOperations":"None. Every operation answers in one round trip — no job to submit, no status to poll, no callback to register.","sandbox":"None, and none is needed. Every operation is a public read of published data with no key, no quota, and no side effect, so the live surface is the safe one to develop against.","batchOperations":{"readCards":"ids","compare":"ids","resolveName":"name"},"batchStyle":"Repeated query parameters on a GET, not a POST envelope. Each is atomic: the whole call is refused rather than partially answered, so no caller has to notice a gap in a payload that looks complete. The refusal names the id that spoiled the batch — drop it and re-batch the rest in one call. Falling back to one call per id spends a request per id to learn what the refusal already said."},"x-pagination":{"style":"bounded-read","boundParameter":"limit","offsetParameter":null,"pageParameter":null,"cursorParameter":null,"nextLinkField":null,"truncationFields":["total","returned","truncated"],"truncationReportedBy":["readLinks","readTermUsages"],"description":"Reads are bounded, not paged. `limit` caps one response; it does not select a window, and there is no offset, page number, or cursor to advance — no continuation state exists to carry. Ordering is the publisher's and is stable within one Release, so a bounded read is a prefix rather than a sample. Where a bound can cut, the payload reports it in-band; the remainder is reached by raising `limit` toward the maximum declared on the parameter, or by narrowing the subject. A client written for cursors should not be pointed here."},"x-availability":{"healthProbe":"/healthz","readinessProbe":"/readyz","statusDocumentation":"/status","statusPage":null,"incidentFeed":null,"slaPublished":false,"retryableStatuses":[503],"description":"Availability is best effort and no service level is promised. /healthz answers whenever the process is running and reads no database; /readyz answers 200 when this deployment can serve and 503 when it cannot, naming every check, the active Release and its Catalog revision. A 503 from an operation is the same condition and the same retry: the address is unchanged and the operation is not retired. There is no external status page, no incident feed and no uptime history — /status states each refusal this API can return with its recovery, and says that too."}},"paths":{"/api/orient":{"get":{"summary":"Read the routing cues and their candidate identities","operationId":"orient","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"The protocol version this client was written against. Omit it to be served whatever version is current; send it to be refused with 400 rather than answered in a version you cannot parse. The value to send is the one every response states in the header of this name."},{"name":"cue","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cue"},"description":"One routing cue key, spelled exactly as a listing without this parameter returns it. Omit it to read every published cue with its candidates, which is the usual first call. It is matched whole, never searched: an unknown key is a 404, and free text belongs in search's `q`."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":3,"title":"Limit","minimum":1,"maximum":8},"description":"How many candidate identities to carry per cue. A bound, not a page: there is no offset to advance and the ordering is the publisher's, so a smaller bound returns a prefix of the same list."}],"responses":{"200":{"description":"The requested reading of the active Release.","content":{"application/json":{"schema":{}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-Catalog-Revision":{"$ref":"#/components/headers/CatalogRevision"}}},"400":{"description":"Nothing was read. The request pinned an API-Version this deployment does not serve, or — where the operation takes a query — the query is not one this Catalog can read; `error.type` tells them apart. For the first, resend with the version the response header states, or without the header to be served whatever version is current. That direct version refusal spends from the rate-limit window but carries none of its advisory headers; a routed query refusal does, so this shared 400 response cannot require them.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"404":{"description":"No such subject in the active Release. The address is an operation and the request parsed; it is the subject that is unknown. An operation that refuses its miss does so in `AtlasError`, and `error.type` names the class it was looked for as. An operation that answers its miss as a reading instead sends the same payload as its 200, declared on this status through the same schema, carrying X-Catalog-Revision and no `error` key: readDecision (`DecisionRead` with `outcome` `not-found` and `decision` null) and readTour (`LearningPathsRead` with `paths` empty). A 404 at an address that names no operation is a different refusal, `UnknownOperation`, and is declared on no operation here because none is published there.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"405":{"description":"Nothing was read. The address names an operation; the method does not. Resend under one of the methods the `Allow` header names — and note that this API has no write operations at all, which info.x-api-shape states, so no method beyond GET and HEAD is coming.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Allow":{"$ref":"#/components/headers/Allow"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"422":{"description":"A parameter value is outside its permitted range, or could not be parsed into its declared type. The two carry different bodies — see the schema.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/AtlasError"},{"$ref":"#/components/schemas/RequestValidationError"}]}}}},"429":{"description":"Nothing was read. More than the published number of requests came from this address inside one window, and the refusal was composed before the operation ran. Wait the seconds named in `Retry-After` and resend; the request itself is fine. Every response, this one included, states the window in `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`, so a client can pace itself and never arrive here.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"503":{"description":"The Catalog is unreachable, or no Release is active. The address is fine and the request parsed; retry it. Readiness is reported at /readyz, and /status states this and every other refusal with its recovery.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}}},"description":"Lists the publisher's routing cues — design moments, each one an authored *reach for this when…* claim — with the candidate canonical identities each cue targets, carrying status and hook. Omit `cue` to read every published cue, which is the usual first call. `cue` is a key, not a query: send one exactly as a listing spells it, and an unknown key is refused with 404 `CueNotFound` rather than matched loosely. To start from a phrase of your own, such as *my agent keeps running out of context*, call search, which reads free text.","deprecated":false}},"/api/tour":{"get":{"summary":"Read the publisher-curated first tour","operationId":"readTour","responses":{"200":{"description":"The requested reading of the active Release.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningPathsRead"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-Catalog-Revision":{"$ref":"#/components/headers/CatalogRevision"}}},"404":{"description":"No such subject in the active Release. The address is an operation and the request parsed; it is the subject that is unknown. An operation that refuses its miss does so in `AtlasError`, and `error.type` names the class it was looked for as. An operation that answers its miss as a reading instead sends the same payload as its 200, declared on this status through the same schema, carrying X-Catalog-Revision and no `error` key: readDecision (`DecisionRead` with `outcome` `not-found` and `decision` null) and readTour (`LearningPathsRead` with `paths` empty). A 404 at an address that names no operation is a different refusal, `UnknownOperation`, and is declared on no operation here because none is published there.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-Catalog-Revision":{"$ref":"#/components/headers/CatalogRevision"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningPathsRead"}}}},"400":{"description":"Nothing was read. The request pinned an API-Version this deployment does not serve, or — where the operation takes a query — the query is not one this Catalog can read; `error.type` tells them apart. For the first, resend with the version the response header states, or without the header to be served whatever version is current. That direct version refusal spends from the rate-limit window but carries none of its advisory headers; a routed query refusal does, so this shared 400 response cannot require them.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"405":{"description":"Nothing was read. The address names an operation; the method does not. Resend under one of the methods the `Allow` header names — and note that this API has no write operations at all, which info.x-api-shape states, so no method beyond GET and HEAD is coming.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Allow":{"$ref":"#/components/headers/Allow"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"429":{"description":"Nothing was read. More than the published number of requests came from this address inside one window, and the refusal was composed before the operation ran. Wait the seconds named in `Retry-After` and resend; the request itself is fine. Every response, this one included, states the window in `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`, so a client can pace itself and never arrive here.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"503":{"description":"The Catalog is unreachable, or no Release is active. The address is fine and the request parsed; retry it. Readiness is reported at /readyz, and /status states this and every other refusal with its recovery.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}}},"description":"The ordered walk the publisher recommends for a first reading, with the narration explaining why each step follows the last. A Release that seals no tour answers with an absent walk rather than refusing.","deprecated":false,"parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"The protocol version this client was written against. Omit it to be served whatever version is current; send it to be refused with 400 rather than answered in a version you cannot parse. The value to send is the one every response states in the header of this name."}]}},"/api/cards":{"get":{"summary":"Read the Card for each of several canonical ids","operationId":"readCards","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"The protocol version this client was written against. Omit it to be served whatever version is current; send it to be refused with 400 rather than answered in a version you cannot parse. The value to send is the one every response states in the header of this name."},{"name":"ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Ids"},"description":"Canonical ids to read, repeated: `?ids=a&ids=b`. This is the batch read — prefer it to one call per id. Send no more than `limit` ids: the surplus is dropped silently and the response reports no truncation."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":3,"title":"Limit","minimum":1,"maximum":8},"description":"How many of the supplied ids are read. Ids past this position are dropped rather than refused."}],"responses":{"200":{"description":"The requested reading of the active Release.","content":{"application/json":{"schema":{}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-Catalog-Revision":{"$ref":"#/components/headers/CatalogRevision"}}},"400":{"description":"Nothing was read. The request pinned an API-Version this deployment does not serve, or — where the operation takes a query — the query is not one this Catalog can read; `error.type` tells them apart. For the first, resend with the version the response header states, or without the header to be served whatever version is current. That direct version refusal spends from the rate-limit window but carries none of its advisory headers; a routed query refusal does, so this shared 400 response cannot require them.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"404":{"description":"No such subject in the active Release. The address is an operation and the request parsed; it is the subject that is unknown. An operation that refuses its miss does so in `AtlasError`, and `error.type` names the class it was looked for as. An operation that answers its miss as a reading instead sends the same payload as its 200, declared on this status through the same schema, carrying X-Catalog-Revision and no `error` key: readDecision (`DecisionRead` with `outcome` `not-found` and `decision` null) and readTour (`LearningPathsRead` with `paths` empty). A 404 at an address that names no operation is a different refusal, `UnknownOperation`, and is declared on no operation here because none is published there.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"405":{"description":"Nothing was read. The address names an operation; the method does not. Resend under one of the methods the `Allow` header names — and note that this API has no write operations at all, which info.x-api-shape states, so no method beyond GET and HEAD is coming.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Allow":{"$ref":"#/components/headers/Allow"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"422":{"description":"A parameter value is outside its permitted range, or could not be parsed into its declared type. The two carry different bodies — see the schema.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/AtlasError"},{"$ref":"#/components/schemas/RequestValidationError"}]}}}},"429":{"description":"Nothing was read. More than the published number of requests came from this address inside one window, and the refusal was composed before the operation ran. Wait the seconds named in `Retry-After` and resend; the request itself is fine. Every response, this one included, states the window in `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`, so a client can pace itself and never arrive here.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"503":{"description":"The Catalog is unreachable, or no Release is active. The address is fine and the request parsed; retry it. Readiness is reported at /readyz, and /status states this and every other refusal with its recovery.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}}},"description":"Batch-reads Cards — hook, status, the publisher's decision-bearing claims, and compact source addresses — for ids you already hold. The batch is atomic: one unadmitted id fails the whole request and returns no cards, so drop the offending id and re-batch rather than falling back to one call per id. Only the first `limit` ids are read, and the surplus is dropped without a refusal or a truncation flag, so send no more ids than `limit`.","deprecated":false}},"/api/search":{"get":{"summary":"Full-text search across the active Release","operationId":"search","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"The protocol version this client was written against. Omit it to be served whatever version is current; send it to be refused with 400 rather than answered in a version you cannot parse. The value to send is the one every response states in the header of this name."},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q","maxLength":256},"description":"The search terms, read as PostgreSQL reads them: every term must match, and a leading `!` excludes. When a query with no exclusion matches nothing as written, its terms are asked for as alternatives instead, so a situation phrased in your own words still reaches the Nodes that cover it. An empty query is accepted and matches nothing."},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind","type":"string","enum":["concept","example","pattern"]},"description":"Narrow to one kind of published record. Any other value is refused with 400 rather than ignored."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","type":"string","enum":["drafting","fleshed","needs-work","seeded","stable"]},"description":"Narrow to one rung of the status ladder. Any other value is refused with 400 rather than ignored."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit","minimum":1,"maximum":25},"description":"How many hits to carry. A bound, not a page: the ranking is stable within one Release, so this returns the top `limit` and there is no second page behind it."}],"responses":{"200":{"description":"The requested reading of the active Release.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRead"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-Catalog-Revision":{"$ref":"#/components/headers/CatalogRevision"}}},"400":{"description":"Nothing was read. The request pinned an API-Version this deployment does not serve, or — where the operation takes a query — the query is not one this Catalog can read; `error.type` tells them apart. For the first, resend with the version the response header states, or without the header to be served whatever version is current. That direct version refusal spends from the rate-limit window but carries none of its advisory headers; a routed query refusal does, so this shared 400 response cannot require them.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"405":{"description":"Nothing was read. The address names an operation; the method does not. Resend under one of the methods the `Allow` header names — and note that this API has no write operations at all, which info.x-api-shape states, so no method beyond GET and HEAD is coming.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Allow":{"$ref":"#/components/headers/Allow"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"422":{"description":"A parameter value is outside its permitted range, or could not be parsed into its declared type. The two carry different bodies — see the schema.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/AtlasError"},{"$ref":"#/components/schemas/RequestValidationError"}]}}}},"429":{"description":"Nothing was read. More than the published number of requests came from this address inside one window, and the refusal was composed before the operation ran. Wait the seconds named in `Retry-After` and resend; the request itself is fine. Every response, this one included, states the window in `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`, so a client can pace itself and never arrive here.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"503":{"description":"The Catalog is unreachable, or no Release is active. The address is fine and the request parsed; retry it. Readiness is reported at /readyz, and /status states this and every other refusal with its recovery.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}}},"description":"Plain full-text search over every published plate, optionally narrowed by kind and status. Each hit carries the evidence that matched, so a caller can judge relevance without reading the whole Node. This is the operation that reads free text, so a problem stated in your own words belongs here; orient lists the publisher's own cues when you would rather browse them.","deprecated":false}},"/api/compare":{"get":{"summary":"Compare several Nodes section by section","operationId":"compare","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"The protocol version this client was written against. Omit it to be served whatever version is current; send it to be refused with 400 rather than answered in a version you cannot parse. The value to send is the one every response states in the header of this name."},{"name":"ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Ids"},"description":"The canonical ids to align, repeated: at least 2 and at most 4. A selection outside that range, or one mixing disclosure levels, is refused with 422 rather than aligned misleadingly."},{"name":"sections","in":"query","required":false,"schema":{"type":"string","default":"decision","title":"Sections","enum":["all","decision"]},"description":"Which sections to align: `decision` for the decision-bearing ones, `all` for every shared section."}],"responses":{"200":{"description":"The requested reading of the active Release.","content":{"application/json":{"schema":{}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-Catalog-Revision":{"$ref":"#/components/headers/CatalogRevision"}}},"400":{"description":"Nothing was read. The request pinned an API-Version this deployment does not serve, or — where the operation takes a query — the query is not one this Catalog can read; `error.type` tells them apart. For the first, resend with the version the response header states, or without the header to be served whatever version is current. That direct version refusal spends from the rate-limit window but carries none of its advisory headers; a routed query refusal does, so this shared 400 response cannot require them.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"404":{"description":"No such subject in the active Release. The address is an operation and the request parsed; it is the subject that is unknown. An operation that refuses its miss does so in `AtlasError`, and `error.type` names the class it was looked for as. An operation that answers its miss as a reading instead sends the same payload as its 200, declared on this status through the same schema, carrying X-Catalog-Revision and no `error` key: readDecision (`DecisionRead` with `outcome` `not-found` and `decision` null) and readTour (`LearningPathsRead` with `paths` empty). A 404 at an address that names no operation is a different refusal, `UnknownOperation`, and is declared on no operation here because none is published there.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"405":{"description":"Nothing was read. The address names an operation; the method does not. Resend under one of the methods the `Allow` header names — and note that this API has no write operations at all, which info.x-api-shape states, so no method beyond GET and HEAD is coming.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Allow":{"$ref":"#/components/headers/Allow"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"422":{"description":"A parameter value is outside its permitted range, or could not be parsed into its declared type. The two carry different bodies — see the schema.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"429":{"description":"Nothing was read. More than the published number of requests came from this address inside one window, and the refusal was composed before the operation ran. Wait the seconds named in `Retry-After` and resend; the request itself is fine. Every response, this one included, states the window in `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`, so a client can pace itself and never arrive here.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"503":{"description":"The Catalog is unreachable, or no Release is active. The address is fine and the request parsed; retry it. Readiness is reported at /readyz, and /status states this and every other refusal with its recovery.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}}},"description":"Aligns two or more Nodes on their shared sections so the differences between neighbouring patterns can be read directly. Nodes whose disclosure levels differ are not comparable and are refused rather than aligned misleadingly.","deprecated":false}},"/api/glossary":{"get":{"summary":"List the admitted glossary terms","operationId":"listGlossary","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"The protocol version this client was written against. Omit it to be served whatever version is current; send it to be refused with 400 rather than answered in a version you cannot parse. The value to send is the one every response states in the header of this name."},{"name":"term","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Term","type":"string","maxLength":160},"description":"Define one term instead of listing every term. Supplying it returns the same payload as defineTerm."}],"responses":{"200":{"description":"The requested reading of the active Release.","content":{"application/json":{"schema":{}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-Catalog-Revision":{"$ref":"#/components/headers/CatalogRevision"}}},"400":{"description":"Nothing was read. The request pinned an API-Version this deployment does not serve, or — where the operation takes a query — the query is not one this Catalog can read; `error.type` tells them apart. For the first, resend with the version the response header states, or without the header to be served whatever version is current. That direct version refusal spends from the rate-limit window but carries none of its advisory headers; a routed query refusal does, so this shared 400 response cannot require them.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"405":{"description":"Nothing was read. The address names an operation; the method does not. Resend under one of the methods the `Allow` header names — and note that this API has no write operations at all, which info.x-api-shape states, so no method beyond GET and HEAD is coming.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Allow":{"$ref":"#/components/headers/Allow"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"429":{"description":"Nothing was read. More than the published number of requests came from this address inside one window, and the refusal was composed before the operation ran. Wait the seconds named in `Retry-After` and resend; the request itself is fine. Every response, this one included, states the window in `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`, so a client can pace itself and never arrive here.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"503":{"description":"The Catalog is unreachable, or no Release is active. The address is fine and the request parsed; retry it. Readiness is reported at /readyz, and /status states this and every other refusal with its recovery.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}}},"description":"The complete working vocabulary of the active Release, one entry per admitted term, in the publisher's order.","deprecated":false}},"/api/glossary/{term_key}/usages":{"get":{"summary":"Find where one term is used","operationId":"readTermUsages","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"The protocol version this client was written against. Omit it to be served whatever version is current; send it to be refused with 400 rather than answered in a version you cannot parse. The value to send is the one every response states in the header of this name."},{"name":"term_key","in":"path","required":true,"schema":{"type":"string","title":"Term Key"},"description":"The exact Catalog key a definition resolved to — not a loose spelling. An unknown key reads no usages rather than resolving a second time."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":12,"title":"Limit","minimum":1,"maximum":50},"description":"How many usages to carry. A bound, not a page: when it cuts, the payload says so in `total`, `returned` and `truncated`."}],"responses":{"200":{"description":"The requested reading of the active Release.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TermUsagesRead"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-Catalog-Revision":{"$ref":"#/components/headers/CatalogRevision"}}},"400":{"description":"Nothing was read. The request pinned an API-Version this deployment does not serve, or — where the operation takes a query — the query is not one this Catalog can read; `error.type` tells them apart. For the first, resend with the version the response header states, or without the header to be served whatever version is current. That direct version refusal spends from the rate-limit window but carries none of its advisory headers; a routed query refusal does, so this shared 400 response cannot require them.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"405":{"description":"Nothing was read. The address names an operation; the method does not. Resend under one of the methods the `Allow` header names — and note that this API has no write operations at all, which info.x-api-shape states, so no method beyond GET and HEAD is coming.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Allow":{"$ref":"#/components/headers/Allow"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"422":{"description":"A parameter value is outside its permitted range, or could not be parsed into its declared type. The two carry different bodies — see the schema.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/AtlasError"},{"$ref":"#/components/schemas/RequestValidationError"}]}}}},"429":{"description":"Nothing was read. More than the published number of requests came from this address inside one window, and the refusal was composed before the operation ran. Wait the seconds named in `Retry-After` and resend; the request itself is fine. Every response, this one included, states the window in `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`, so a client can pace itself and never arrive here.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"503":{"description":"The Catalog is unreachable, or no Release is active. The address is fine and the request parsed; retry it. Readiness is reported at /readyz, and /status states this and every other refusal with its recovery.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}}},"description":"The published sections that lean on one term, addressed by the exact key a definition resolved to, so a reader can see a term at work rather than only defined. An unknown key reads no usages rather than resolving a second time.","deprecated":false}},"/api/glossary/{term}":{"get":{"summary":"Define one glossary term","operationId":"defineTerm","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"The protocol version this client was written against. Omit it to be served whatever version is current; send it to be refused with 400 rather than answered in a version you cannot parse. The value to send is the one every response states in the header of this name."},{"name":"term","in":"path","required":true,"schema":{"type":"string","title":"Term","maxLength":160},"description":"The term to define, in a reader's own spelling. A miss is a successful payload carrying near spellings, never a 404."}],"responses":{"200":{"description":"The requested reading of the active Release.","content":{"application/json":{"schema":{}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-Catalog-Revision":{"$ref":"#/components/headers/CatalogRevision"}}},"400":{"description":"Nothing was read. The request pinned an API-Version this deployment does not serve, or — where the operation takes a query — the query is not one this Catalog can read; `error.type` tells them apart. For the first, resend with the version the response header states, or without the header to be served whatever version is current. That direct version refusal spends from the rate-limit window but carries none of its advisory headers; a routed query refusal does, so this shared 400 response cannot require them.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"405":{"description":"Nothing was read. The address names an operation; the method does not. Resend under one of the methods the `Allow` header names — and note that this API has no write operations at all, which info.x-api-shape states, so no method beyond GET and HEAD is coming.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Allow":{"$ref":"#/components/headers/Allow"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"429":{"description":"Nothing was read. More than the published number of requests came from this address inside one window, and the refusal was composed before the operation ran. Wait the seconds named in `Retry-After` and resend; the request itself is fine. Every response, this one included, states the window in `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`, so a client can pace itself and never arrive here.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"503":{"description":"The Catalog is unreachable, or no Release is active. The address is fine and the request parsed; retry it. Readiness is reported at /readyz, and /status states this and every other refusal with its recovery.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}}},"description":"Resolves one term to its definition. Reports an exact match, an ambiguity with the candidate terms that could have been meant, or a miss with near spellings — all three are successful payloads a caller can act on.","deprecated":false}},"/api/decisions":{"get":{"summary":"List or search the decision records","operationId":"listDecisions","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"The protocol version this client was written against. Omit it to be served whatever version is current; send it to be refused with 400 rather than answered in a version you cannot parse. The value to send is the one every response states in the header of this name."},{"name":"query","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query","type":"string","maxLength":256},"description":"Narrow the listing to decision records matching these words. Omit it to list them all, in the publisher's order."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit","minimum":1,"maximum":50},"description":"How many decision summaries to carry. A bound, not a page: the order is the publisher's, so this returns a prefix."}],"responses":{"200":{"description":"The requested reading of the active Release.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionsRead"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-Catalog-Revision":{"$ref":"#/components/headers/CatalogRevision"}}},"400":{"description":"Nothing was read. The request pinned an API-Version this deployment does not serve, or — where the operation takes a query — the query is not one this Catalog can read; `error.type` tells them apart. For the first, resend with the version the response header states, or without the header to be served whatever version is current. That direct version refusal spends from the rate-limit window but carries none of its advisory headers; a routed query refusal does, so this shared 400 response cannot require them.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"405":{"description":"Nothing was read. The address names an operation; the method does not. Resend under one of the methods the `Allow` header names — and note that this API has no write operations at all, which info.x-api-shape states, so no method beyond GET and HEAD is coming.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Allow":{"$ref":"#/components/headers/Allow"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"422":{"description":"A parameter value is outside its permitted range, or could not be parsed into its declared type. The two carry different bodies — see the schema.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/AtlasError"},{"$ref":"#/components/schemas/RequestValidationError"}]}}}},"429":{"description":"Nothing was read. More than the published number of requests came from this address inside one window, and the refusal was composed before the operation ran. Wait the seconds named in `Retry-After` and resend; the request itself is fine. Every response, this one included, states the window in `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`, so a client can pace itself and never arrive here.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"503":{"description":"The Catalog is unreachable, or no Release is active. The address is fine and the request parsed; retry it. Readiness is reported at /readyz, and /status states this and every other refusal with its recovery.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}}},"description":"The admitted decision summaries, optionally filtered by query. Decision records explain how the corpus came to be shaped the way it is; they are history and never override the live Release.","deprecated":false}},"/api/decisions/{canonical_id}":{"get":{"summary":"Read one complete decision record","operationId":"readDecision","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"The protocol version this client was written against. Omit it to be served whatever version is current; send it to be refused with 400 rather than answered in a version you cannot parse. The value to send is the one every response states in the header of this name."},{"name":"canonical_id","in":"path","required":true,"schema":{"type":"string","title":"Canonical Id"},"description":"The decision record's canonical id. A miss is a successful payload whose `outcome` is `not-found`, answered with 404."}],"responses":{"200":{"description":"The requested reading of the active Release.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionRead"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-Catalog-Revision":{"$ref":"#/components/headers/CatalogRevision"}}},"404":{"description":"No such subject in the active Release. The address is an operation and the request parsed; it is the subject that is unknown. An operation that refuses its miss does so in `AtlasError`, and `error.type` names the class it was looked for as. An operation that answers its miss as a reading instead sends the same payload as its 200, declared on this status through the same schema, carrying X-Catalog-Revision and no `error` key: readDecision (`DecisionRead` with `outcome` `not-found` and `decision` null) and readTour (`LearningPathsRead` with `paths` empty). A 404 at an address that names no operation is a different refusal, `UnknownOperation`, and is declared on no operation here because none is published there.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-Catalog-Revision":{"$ref":"#/components/headers/CatalogRevision"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionRead"}}}},"400":{"description":"Nothing was read. The request pinned an API-Version this deployment does not serve, or — where the operation takes a query — the query is not one this Catalog can read; `error.type` tells them apart. For the first, resend with the version the response header states, or without the header to be served whatever version is current. That direct version refusal spends from the rate-limit window but carries none of its advisory headers; a routed query refusal does, so this shared 400 response cannot require them.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"405":{"description":"Nothing was read. The address names an operation; the method does not. Resend under one of the methods the `Allow` header names — and note that this API has no write operations at all, which info.x-api-shape states, so no method beyond GET and HEAD is coming.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Allow":{"$ref":"#/components/headers/Allow"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"429":{"description":"Nothing was read. More than the published number of requests came from this address inside one window, and the refusal was composed before the operation ran. Wait the seconds named in `Retry-After` and resend; the request itself is fine. Every response, this one included, states the window in `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`, so a client can pace itself and never arrive here.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"503":{"description":"The Catalog is unreachable, or no Release is active. The address is fine and the request parsed; retry it. Readiness is reported at /readyz, and /status states this and every other refusal with its recovery.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}}},"description":"One decision record in full: the question, the options weighed, and the verdict. This is where a ruling stated on a plate was actually argued, and the right place to take a disagreement.","deprecated":false}},"/api/links/{canonical_id}":{"get":{"summary":"Page one Node's relationship occurrences","operationId":"readLinks","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"The protocol version this client was written against. Omit it to be served whatever version is current; send it to be refused with 400 rather than answered in a version you cannot parse. The value to send is the one every response states in the header of this name."},{"name":"canonical_id","in":"path","required":true,"schema":{"type":"string","title":"Canonical Id"},"description":"The subject whose relationships are read."},{"name":"direction","in":"query","required":false,"schema":{"type":"string","default":"both","title":"Direction","enum":["both","in","out"]},"description":"Which side to read. The default carries both in one response and each occurrence states its own direction, so filtering here saves nothing but a field."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":12,"title":"Limit","minimum":1,"maximum":50},"description":"How many occurrences to carry per side. A bound, not a page: when it cuts, the view says so in `total`, `returned` and `truncated`, and the remainder is reached by raising this toward its maximum rather than by a cursor."}],"responses":{"200":{"description":"The requested reading of the active Release.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinksRead"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-Catalog-Revision":{"$ref":"#/components/headers/CatalogRevision"}}},"400":{"description":"Nothing was read. The request pinned an API-Version this deployment does not serve, or — where the operation takes a query — the query is not one this Catalog can read; `error.type` tells them apart. For the first, resend with the version the response header states, or without the header to be served whatever version is current. That direct version refusal spends from the rate-limit window but carries none of its advisory headers; a routed query refusal does, so this shared 400 response cannot require them.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"404":{"description":"No such subject in the active Release. The address is an operation and the request parsed; it is the subject that is unknown. An operation that refuses its miss does so in `AtlasError`, and `error.type` names the class it was looked for as. An operation that answers its miss as a reading instead sends the same payload as its 200, declared on this status through the same schema, carrying X-Catalog-Revision and no `error` key: readDecision (`DecisionRead` with `outcome` `not-found` and `decision` null) and readTour (`LearningPathsRead` with `paths` empty). A 404 at an address that names no operation is a different refusal, `UnknownOperation`, and is declared on no operation here because none is published there.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"405":{"description":"Nothing was read. The address names an operation; the method does not. Resend under one of the methods the `Allow` header names — and note that this API has no write operations at all, which info.x-api-shape states, so no method beyond GET and HEAD is coming.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Allow":{"$ref":"#/components/headers/Allow"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"422":{"description":"A parameter value is outside its permitted range, or could not be parsed into its declared type. The two carry different bodies — see the schema.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/AtlasError"},{"$ref":"#/components/schemas/RequestValidationError"}]}}}},"429":{"description":"Nothing was read. More than the published number of requests came from this address inside one window, and the refusal was composed before the operation ran. Wait the seconds named in `Retry-After` and resend; the request itself is fine. Every response, this one included, states the window in `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`, so a client can pace itself and never arrive here.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"503":{"description":"The Catalog is unreachable, or no Release is active. The address is fine and the request parsed; retry it. Readiness is reported at /readyz, and /status states this and every other refusal with its recovery.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}}},"description":"Every argued relationship touching one subject, inbound and outbound in the same page. There is deliberately no direction filter: each occurrence carries its own direction, so read the side you want off the page you already have rather than spending a second call.","deprecated":false}},"/api/nodes/{canonical_id}":{"get":{"summary":"Read one complete Node","operationId":"readNode","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"The protocol version this client was written against. Omit it to be served whatever version is current; send it to be refused with 400 rather than answered in a version you cannot parse. The value to send is the one every response states in the header of this name."},{"name":"canonical_id","in":"path","required":true,"schema":{"type":"string","title":"Canonical Id"},"description":"The Node's canonical id. Canonical ids are not guessable — reach one through resolveName, orient, or search."},{"name":"section","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section"},"description":"Read one section by slug instead of the whole Node. An unknown slug is a 404, not an empty read."}],"responses":{"200":{"description":"The requested reading of the active Release.","content":{"application/json":{"schema":{}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-Catalog-Revision":{"$ref":"#/components/headers/CatalogRevision"}}},"400":{"description":"Nothing was read. The request pinned an API-Version this deployment does not serve, or — where the operation takes a query — the query is not one this Catalog can read; `error.type` tells them apart. For the first, resend with the version the response header states, or without the header to be served whatever version is current. That direct version refusal spends from the rate-limit window but carries none of its advisory headers; a routed query refusal does, so this shared 400 response cannot require them.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"404":{"description":"No such subject in the active Release. The address is an operation and the request parsed; it is the subject that is unknown. An operation that refuses its miss does so in `AtlasError`, and `error.type` names the class it was looked for as. An operation that answers its miss as a reading instead sends the same payload as its 200, declared on this status through the same schema, carrying X-Catalog-Revision and no `error` key: readDecision (`DecisionRead` with `outcome` `not-found` and `decision` null) and readTour (`LearningPathsRead` with `paths` empty). A 404 at an address that names no operation is a different refusal, `UnknownOperation`, and is declared on no operation here because none is published there.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"405":{"description":"Nothing was read. The address names an operation; the method does not. Resend under one of the methods the `Allow` header names — and note that this API has no write operations at all, which info.x-api-shape states, so no method beyond GET and HEAD is coming.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Allow":{"$ref":"#/components/headers/Allow"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"429":{"description":"Nothing was read. More than the published number of requests came from this address inside one window, and the refusal was composed before the operation ran. Wait the seconds named in `Retry-After` and resend; the request itself is fine. Every response, this one included, states the window in `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`, so a client can pace itself and never arrive here.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"503":{"description":"The Catalog is unreachable, or no Release is active. The address is fine and the request parsed; retry it. Readiness is reported at /readyz, and /status states this and every other refusal with its recovery.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}}},"description":"The whole Node at one canonical address: every section, in order, with its prose and its references. This is the most expensive payload on the surface — prefer a Card when the publisher's claims are all you need.","deprecated":false}},"/api/tree":{"get":{"summary":"Walk the canonical ordered traversal","operationId":"readTree","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"The protocol version this client was written against. Omit it to be served whatever version is current; send it to be refused with 400 rather than answered in a version you cannot parse. The value to send is the one every response states in the header of this name."},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind","type":"string","enum":["concept","example","pattern"]},"description":"Narrow the traversal to one kind. Any other value is refused with 400."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","type":"string","enum":["drafting","fleshed","needs-work","seeded","stable"]},"description":"Narrow the traversal to one rung of the status ladder. Any other value is refused with 400."}],"responses":{"200":{"description":"The requested reading of the active Release.","content":{"application/json":{"schema":{}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-Catalog-Revision":{"$ref":"#/components/headers/CatalogRevision"}}},"400":{"description":"Nothing was read. The request pinned an API-Version this deployment does not serve, or — where the operation takes a query — the query is not one this Catalog can read; `error.type` tells them apart. For the first, resend with the version the response header states, or without the header to be served whatever version is current. That direct version refusal spends from the rate-limit window but carries none of its advisory headers; a routed query refusal does, so this shared 400 response cannot require them.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"405":{"description":"Nothing was read. The address names an operation; the method does not. Resend under one of the methods the `Allow` header names — and note that this API has no write operations at all, which info.x-api-shape states, so no method beyond GET and HEAD is coming.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Allow":{"$ref":"#/components/headers/Allow"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"429":{"description":"Nothing was read. More than the published number of requests came from this address inside one window, and the refusal was composed before the operation ran. Wait the seconds named in `Retry-After` and resend; the request itself is fine. Every response, this one included, states the window in `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`, so a client can pace itself and never arrive here.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"503":{"description":"The Catalog is unreachable, or no Release is active. The address is fine and the request parsed; retry it. Readiness is reported at /readyz, and /status states this and every other refusal with its recovery.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}}},"description":"Every published Node in the canonical order the survey defines, never re-ranked by relevance, with each Node's place in the hierarchy. This is the machine-readable index of the whole Release and the right starting point for a crawl.","deprecated":false}},"/api/resolve":{"get":{"summary":"Resolve a name to a canonical id","operationId":"resolveName","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"The protocol version this client was written against. Omit it to be served whatever version is current; send it to be refused with 400 rather than answered in a version you cannot parse. The value to send is the one every response states in the header of this name."},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Name"},"description":"Names to resolve, repeated: `?name=one&name=two`. A batch read — at least one and at most 32, each at most 160 characters and not blank. Every violation is refused with 400 rather than trimmed."}],"responses":{"200":{"description":"The requested reading of the active Release.","content":{"application/json":{"schema":{}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"X-Catalog-Revision":{"$ref":"#/components/headers/CatalogRevision"}}},"400":{"description":"Nothing was read. The request pinned an API-Version this deployment does not serve, or — where the operation takes a query — the query is not one this Catalog can read; `error.type` tells them apart. For the first, resend with the version the response header states, or without the header to be served whatever version is current. That direct version refusal spends from the rate-limit window but carries none of its advisory headers; a routed query refusal does, so this shared 400 response cannot require them.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"405":{"description":"Nothing was read. The address names an operation; the method does not. Resend under one of the methods the `Allow` header names — and note that this API has no write operations at all, which info.x-api-shape states, so no method beyond GET and HEAD is coming.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Allow":{"$ref":"#/components/headers/Allow"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"429":{"description":"Nothing was read. More than the published number of requests came from this address inside one window, and the refusal was composed before the operation ran. Wait the seconds named in `Retry-After` and resend; the request itself is fine. Every response, this one included, states the window in `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`, so a client can pace itself and never arrive here.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}},"503":{"description":"The Catalog is unreachable, or no Release is active. The address is fine and the request parsed; retry it. Readiness is reported at /readyz, and /status states this and every other refusal with its recovery.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasError"}}}}},"description":"Maps a title, alias, or near-miss spelling onto the canonical id that addresses it. Canonical ids are not guessable, so this is how a caller holding only a human-readable name reaches an address the other operations accept.","deprecated":false}}},"components":{"headers":{"Allow":{"description":"The methods this address does answer. Present only on a 405, where it is the whole recovery in the way Retry-After is on a 429: resend the same request under one of these.","required":true,"schema":{"type":"string"}},"ApiVersion":{"description":"The stable API protocol version. Additive changes retain this value; a breaking change increments it. Independent of the content Release named by X-Catalog-Revision. Send this value back as a request header to pin it — see the parameter of the same name on any operation.","required":true,"schema":{"type":"string","enum":["1"]}},"CatalogRevision":{"description":"The active Release's Catalog revision. Two responses carrying the same value describe the same Atlas; a changed value means a promotion happened between the calls.","required":true,"schema":{"type":"string"}},"Deprecation":{"description":"Present, with the value `true`, only while this operation is inside its retirement notice window (RFC 9745). Absent on a current operation, and absent everywhere today — no operation is deprecated. See info.x-deprecation-policy.deprecatedOperations.","required":false,"schema":{"type":"string","enum":["true"]}},"RateLimit":{"description":"The current API window as one advisory field: `limit`, `remaining`, and seconds until `reset`. Present on every API response so a client can pace itself before a refusal. The direct unsupported-version 400 is the one exception.","required":true,"schema":{"type":"string"},"example":"limit=300, remaining=299, reset=60"},"RateLimitLimit":{"description":"The maximum requests admitted in the current API window. Present on every API response except the direct unsupported-version 400.","required":true,"schema":{"type":"integer","enum":[300]}},"RateLimitPolicy":{"description":"The policy that produced this window: the `api` policy name, its request quota (`q`), and its window in seconds (`w`). Present on every API response except the direct unsupported-version 400.","required":true,"schema":{"type":"string","enum":["\"api\";q=300;w=60"]}},"RateLimitRemaining":{"description":"The requests left in the current API window after this one. Present on every API response except the direct unsupported-version 400.","required":true,"schema":{"type":"integer","minimum":0,"maximum":300}},"RateLimitReset":{"description":"Seconds until the current API window resets, clamped to at least one. Present on every API response except the direct unsupported-version 400.","required":true,"schema":{"type":"integer","minimum":1,"maximum":60}},"RetryAfter":{"description":"How many seconds until the rate-limit window reopens. Present only on a 429, where it is the whole recovery: wait this long and resend the same request unchanged.","required":true,"schema":{"type":"integer","minimum":1,"maximum":60}},"Sunset":{"description":"The HTTP-date after which this operation may be removed (RFC 8594). Accompanies Deprecation and is set at least 180 days ahead. Absent on a current operation, and absent everywhere today.","required":false,"schema":{"type":"string","format":"http-date"}}},"schemas":{"AtlasError":{"type":"object","title":"Atlas error","description":"The Atlas's own refusal: a nested `error` object naming what could not be answered. Show `error.message`; branch on the HTTP status, or on `error.type` for a finer split.","properties":{"error":{"type":"object","properties":{"code":{"type":"integer","description":"The HTTP status, repeated in the body. Omitted by readNode, so read the status rather than relying on this."},"type":{"type":"string","description":"The class of refusal — `NodeNotFound`, `InvalidBound`, `CatalogUnavailable`, and the like. The refusals composed before the operation runs name themselves here too: `UnsupportedApiVersion` on a 400, `RateLimited` on a 429, `MethodNotAllowed` on a 405, and `UnknownOperation` on a 404 at an address that names no operation at all."},"message":{"type":"string","description":"One sentence naming what could not be answered."}},"required":["type","message"]}},"required":["error"]},"RequestValidationError":{"type":"object","title":"Request validation error","description":"The framework's refusal, raised before the operation runs when a parameter cannot be parsed into its declared type at all — `limit=abc`, say. Distinct from AtlasError: a 422 may carry either, so branch on which key is present.","properties":{"detail":{"type":"array","description":"One entry per parameter that failed.","items":{"type":"object","properties":{"type":{"type":"string","description":"The parse failure's class."},"loc":{"type":"array","description":"Where the bad value was, e.g. `[\"query\", \"limit\"]`."},"msg":{"type":"string","description":"The failure in one sentence."},"input":{"description":"The value as it was received."}},"required":["type","loc","msg"]}}},"required":["detail"]},"ReferenceView":{"type":"object","title":"Bounded reference view","description":"One side of a bounded read. There is no cursor or offset to fetch the remainder: raise `limit` toward its maximum, or narrow the subject.","properties":{"total":{"type":"integer","description":"How many occurrences exist on this side."},"returned":{"type":"integer","description":"How many this response carries."},"truncated":{"type":"boolean","description":"True when `total` exceeds `returned` — the bound cut, and what is here is a prefix."},"references":{"type":"array","description":"The occurrences themselves, each stating its own direction and class.","items":{"type":"object"}}},"required":["total","returned","truncated","references"]},"LinksRead":{"type":"object","title":"Bounded relationship read","description":"Every argued relationship touching one subject, inbound and outbound in one bounded response.","properties":{"catalog_revision":{"type":"object","description":"The active Release's Catalog revision, the same identity the X-Catalog-Revision header carries, with the provenance counts beside it.","properties":{"revision":{"type":"string","description":"The revision two responses must share to be comparable."}},"required":["revision"]},"subject":{"type":"object","description":"The Node the relationships were read around."},"direction":{"type":"string","enum":["both","in","out"],"description":"The direction filter this read applied."},"limit":{"type":"integer","description":"The bound this response was read under — echoed so a caller can tell a defaulted read from one it asked for."},"inbound":{"$ref":"#/components/schemas/ReferenceView"},"outbound":{"$ref":"#/components/schemas/ReferenceView"}},"required":["catalog_revision","subject","direction","limit","inbound","outbound"]},"TermUsagesRead":{"type":"object","title":"Bounded term-usage read","description":"The published sections that lean on one term, bounded, with the truncation reported in-band.","properties":{"catalog_revision":{"type":"object","description":"The active Release's Catalog revision, the same identity the X-Catalog-Revision header carries, with the provenance counts beside it.","properties":{"revision":{"type":"string","description":"The revision two responses must share to be comparable."}},"required":["revision"]},"term_key":{"type":"string","description":"The exact Catalog key that was read."},"limit":{"type":"integer","description":"The bound this response was read under — echoed so a caller can tell a defaulted read from one it asked for."},"total":{"type":"integer","description":"How many usages exist."},"returned":{"type":"integer","description":"How many this response carries."},"truncated":{"type":"boolean","description":"True when the bound cut the rest off."},"usages":{"type":"array","description":"The usages, in the publisher's order.","items":{"type":"object"}},"empty":{"type":"boolean","description":"True when the read matched nothing."}},"required":["catalog_revision","term_key","limit","total","returned","truncated","usages","empty"]},"SearchRead":{"type":"object","title":"Bounded search read","description":"The top `limit` hits for one query. The ranking is stable within a Release, so this is a prefix and there is no second page behind it.","properties":{"catalog_revision":{"type":"object","description":"The active Release's Catalog revision, the same identity the X-Catalog-Revision header carries, with the provenance counts beside it.","properties":{"revision":{"type":"string","description":"The revision two responses must share to be comparable."}},"required":["revision"]},"query":{"type":"string","description":"The query as it was read."},"filters":{"type":"object","description":"The kind and status narrowing that was applied.","properties":{"kind":{"type":["string","null"]},"status":{"type":["string","null"]}}},"limit":{"type":"integer","description":"The bound this response was read under — echoed so a caller can tell a defaulted read from one it asked for."},"results":{"type":"array","description":"The hits, each carrying the evidence that matched.","items":{"type":"object"}},"empty":{"type":"boolean","description":"True when the read matched nothing."}},"required":["catalog_revision","query","filters","limit","results","empty"]},"DecisionsRead":{"type":"object","title":"Bounded decision listing","description":"The admitted decision summaries, bounded, in the publisher's order.","properties":{"catalog_revision":{"type":"object","description":"The active Release's Catalog revision, the same identity the X-Catalog-Revision header carries, with the provenance counts beside it.","properties":{"revision":{"type":"string","description":"The revision two responses must share to be comparable."}},"required":["revision"]},"query":{"type":["string","null"],"description":"The narrowing query, or null when absent."},"limit":{"type":"integer","description":"The bound this response was read under — echoed so a caller can tell a defaulted read from one it asked for."},"decisions":{"type":"array","description":"The summaries, in the publisher's order.","items":{"type":"object"}},"empty":{"type":"boolean","description":"True when the read matched nothing."}},"required":["catalog_revision","query","limit","decisions","empty"]},"LearningPathsRead":{"type":"object","title":"Tour reading","description":"The walks the active Release seals, or none; `paths` says which. A sealed walk is answered 200 and an empty `paths` 404, and both are readings of the active Release: the same shape, X-Catalog-Revision on each, and no `error` key on the miss.","properties":{"catalog_revision":{"type":"object","description":"The active Release's Catalog revision, the same identity the X-Catalog-Revision header carries, with the provenance counts beside it.","properties":{"revision":{"type":"string","description":"The revision two responses must share to be comparable."}},"required":["revision"]},"paths":{"type":"array","description":"The sealed walks in presentation order. Empty when the Release seals none, answered 404.","items":{"type":"object","description":"One curated walk through the Release.","properties":{"id":{"type":"string","description":"The walk's id."},"title":{"type":"string"},"intro":{"type":"string","description":"The publisher's introduction to the walk."},"steps":{"type":"array","items":{"type":"object","description":"One step of the walk, in the order it is read.","properties":{"position":{"type":"integer","description":"The step's 1-based place in the walk."},"narration":{"type":"string","description":"Why this step follows the last."},"node":{"type":"object","description":"The Node this step reads, as the tour field draws it.","properties":{"id":{"type":"string","description":"The Node's canonical id."},"title":{"type":"string"},"hook":{"type":"string","description":"The Node's one-line hook."},"kind":{"type":"string","description":"The Node's kind."}},"required":["id","title","hook","kind"]}},"required":["position","narration","node"]}}},"required":["id","title","intro","steps"]}}},"required":["catalog_revision","paths"]},"DecisionRead":{"type":"object","title":"Decision reading","description":"One decision record, or the miss for one; `outcome` says which. A `match` is answered 200 and a `not-found` 404, and both are readings of the active Release: the same shape, X-Catalog-Revision on each, and no `error` key on the miss.","properties":{"catalog_revision":{"type":"object","description":"The active Release's Catalog revision, the same identity the X-Catalog-Revision header carries, with the provenance counts beside it.","properties":{"revision":{"type":"string","description":"The revision two responses must share to be comparable."}},"required":["revision"]},"canonical_id":{"type":"string","description":"The id as it was read."},"outcome":{"type":"string","enum":["match","not-found"],"description":"`match` when the record exists, answered 200; `not-found` when it does not, answered 404."},"decision":{"type":["object","null"],"description":"The record on a match: its summary and its source Markdown. Null on a miss."}},"required":["catalog_revision","canonical_id","outcome","decision"]}}},"servers":[{"url":"https://agentic-atlas.dev","description":"The origin this API is published at"}],"externalDocs":{"description":"Agent manifest, MCP endpoint, and call contract","url":"https://agentic-atlas.dev/llms.txt"}}