{"openapi":"3.1.0","info":{"title":"DaloyJS website APIs","version":"1.0.0","summary":"Agent discovery, docs MCP, and Markdown representations for daloyjs.dev.","description":"HTTP APIs hosted on the DaloyJS project site. Errors are RFC 9457 problem+json with `code` and `hint` fields. Page URLs also negotiate `Accept: text/markdown`. Website HTTP APIs are versioned in the URL path (/api/v1) and echoed on the API-Version response header. The unversioned /api alias redirects to the current major. Breaking changes ship as a new path major (/api/v2). The previous major keeps serving until it is retired. Retirement is signaled at least 180 days in advance with Deprecation (RFC 9745) and Sunset (RFC 8594) response headers plus a rel=\"sunset\" Link. v1 has no announced sunset. MCP uses MCP-Protocol-Version on /mcp, not this path scheme. OAuth 2.0 client_credentials at https://daloyjs.dev/oauth/token issues a Bearer token with scope docs:read. Tokens are optional: every resource here is already public. Named scopes exist so agents request least privilege instead of inferring roles from prose. Metadata: GET /.well-known/oauth-authorization-server (RFC 8414) and GET /.well-known/oauth-protected-resource (RFC 9728), with per-resource documents at /.well-known/oauth-protected-resource/<resource>. Check a token with POST https://daloyjs.dev/oauth/introspect (RFC 7662). The framework's own generated OpenAPI (the spec your app emits) is documented at /docs/openapi.","x-api-lifecycle":{"current":"1","path":"/api/v1","header":"API-Version","documentation":"https://daloyjs.dev/docs/api-lifecycle","sunsetNoticeDays":180,"signals":{"deprecationHeader":"Deprecation","deprecationHeaderFormat":"RFC 9745 structured-field Date, e.g. @1756944000","sunsetHeader":"Sunset","sunsetHeaderFormat":"RFC 8594 IMF-fixdate, e.g. Wed, 11 Nov 2026 00:00:00 GMT","linkRelations":["deprecation","sunset","successor-version","latest-version"]},"surfaces":[{"id":"api-v1","path":"/api/v1","url":"https://daloyjs.dev/api/v1","status":"current","deprecatedAt":null,"sunsetAt":null,"successor":null,"summary":"Current major of the website JSON catalog. No retirement is scheduled."},{"id":"docs-md","path":"/docs-md","url":"https://daloyjs.dev/docs-md","status":"deprecated","deprecatedAt":"2026-08-23","sunsetAt":null,"successor":"/md","summary":"Legacy Markdown handler kept for cached /docs/*.md destinations. Use /md/<path>, or Accept: text/markdown on the canonical URL. It keeps answering until a Sunset date is announced here at least 180 days ahead."},{"id":"md","path":"/md","url":"https://daloyjs.dev/md","status":"current","deprecatedAt":null,"sunsetAt":null,"successor":null,"summary":"Markdown representation of any public page. Also selected by Accept: text/markdown on the canonical URL."},{"id":"api-alias","path":"/api","url":"https://daloyjs.dev/api","status":"current","deprecatedAt":null,"sunsetAt":null,"successor":"/api/v1","summary":"Unversioned alias. Permanently redirects to the current major so agents never pin an unversioned path."}]},"contact":{"name":"DaloyJS maintainers","email":"daloyjs@gmail.com","url":"https://daloyjs.dev/contact"},"license":{"name":"MIT","url":"https://opensource.org/licenses/MIT"}},"externalDocs":{"description":"Versioning, deprecation, and sunset policy for these endpoints.","url":"https://daloyjs.dev/docs/api-lifecycle"},"servers":[{"url":"https://daloyjs.dev","description":"Current origin. Versioned paths live under /api/v1."}],"tags":[{"name":"Discovery","description":"Catalogs agents should fetch first."},{"name":"Docs MCP","description":"Read-only Model Context Protocol for the documentation."},{"name":"OAuth","description":"RFC 8414 authorization server and client_credentials token grant."},{"name":"Markdown","description":"Markdown representations of public pages, for agents that would rather not parse HTML."}],"security":[{"oauth2":["docs:read"]},{}],"paths":{"/api/v1":{"get":{"tags":["Discovery"],"operationId":"getApiCatalogV1","summary":"JSON index of DaloyJS website APIs (v1)","description":"The catalog also publishes the whole versioning and deprecation policy under `versioning`, including every surface's status, successor, and sunset date.","security":[{"oauth2":["docs:read"]},{}],"parameters":[{"name":"API-Version","in":"header","required":false,"description":"Pin the API major. Accepted: 1, v1, 1.0, 1.0.0. Any other value returns 400 unsupported_api_version instead of silently serving a different major.","schema":{"type":"string","enum":["1","v1","1.0","1.0.0"],"default":"1"}}],"responses":{"200":{"description":"Catalog of machine endpoints on this origin.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}}},"400":{"description":"The API-Version request header pinned a major this origin does not serve (code `unsupported_api_version`).","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Quota exhausted. Honor Retry-After and retry. RateLimit remaining is 0.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"RFC 9457 problem+json with an error code and a recovery hint.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api":{"get":{"tags":["Discovery"],"operationId":"getApiAlias","summary":"Unversioned alias for the current major","description":"Permanently redirects to /api/v1 so an agent never pins an unversioned path. The redirect carries rel=\"successor-version\" and rel=\"latest-version\" link relations.","responses":{"308":{"description":"Permanent redirect to the current major.","headers":{"Location":{"description":"The versioned path, e.g. /api/v1.","schema":{"type":"string"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}},"Link":{"description":"RFC 5829 rel=\"successor-version\" and rel=\"latest-version\".","schema":{"type":"string"}}}}}}},"/openapi.json":{"get":{"tags":["Discovery"],"operationId":"getOpenApiDocument","summary":"DaloyJS website OpenAPI 3.1 document","security":[{"oauth2":["docs:read"]},{}],"responses":{"200":{"description":"This OpenAPI document.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Quota exhausted. Honor Retry-After and retry. RateLimit remaining is 0.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"default":{"description":"RFC 9457 problem+json with an error code and a recovery hint.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/.well-known/api-catalog":{"get":{"tags":["Discovery"],"operationId":"getRfc9727ApiCatalog","summary":"RFC 9727 API catalog linkset","responses":{"200":{"description":"Linkset pointing at OpenAPI and the docs MCP.","content":{"application/linkset+json":{"schema":{"type":"object"}}}}}}},"/.well-known/mcp/server-card.json":{"get":{"tags":["Docs MCP"],"operationId":"getMcpServerCard","summary":"MCP Server Card for the docs MCP server (draft)","description":"Discovery metadata for POST /mcp: transport, protocol version, capabilities, authentication, and the full tool list with input schemas. Follows the draft MCP Server Cards proposal (SEP-1649), which may change before it reaches a released MCP specification.","responses":{"200":{"description":"The Server Card.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"application/json":{"schema":{"type":"object","required":["$schema","version","protocolVersion","serverInfo","transport","capabilities"],"properties":{"$schema":{"type":"string","format":"uri"},"version":{"type":"string"},"protocolVersion":{"type":"string"},"serverInfo":{"type":"object","required":["name","version"],"properties":{"name":{"type":"string"},"title":{"type":"string"},"version":{"type":"string"}}},"description":{"type":"string"},"iconUrl":{"type":"string","format":"uri"},"documentationUrl":{"type":"string","format":"uri"},"transport":{"type":"object","required":["type","endpoint"],"properties":{"type":{"type":"string","const":"streamable-http"},"endpoint":{"type":"string","format":"uri"}}},"capabilities":{"type":"object"},"authentication":{"type":"object","required":["required","schemes"],"properties":{"required":{"type":"boolean"},"schemes":{"type":"array","items":{"type":"string"}}}},"instructions":{"type":"string"},"tools":{"type":"array","items":{"type":"object","required":["name","inputSchema"],"properties":{"name":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"inputSchema":{"type":"object"}}}}}}}}},"429":{"description":"Quota exhausted. Honor Retry-After and retry. RateLimit remaining is 0.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"tags":["OAuth"],"operationId":"getOauthAuthorizationServerMetadata","summary":"RFC 8414 OAuth 2.0 authorization-server metadata","responses":{"200":{"description":"Authorization-server metadata JSON.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"tags":["OAuth"],"operationId":"getOauthProtectedResourceMetadata","summary":"RFC 9728 OAuth 2.0 protected-resource metadata","responses":{"200":{"description":"Protected-resource metadata, including scopes_supported.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/oauth/token":{"post":{"tags":["OAuth"],"operationId":"postOauthToken","summary":"OAuth 2.0 client_credentials token endpoint","description":"Public client. Send grant_type=client_credentials and optional scope=docs:read as application/x-www-form-urlencoded. No client_secret.","security":[],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["grant_type"],"properties":{"grant_type":{"type":"string","enum":["client_credentials"]},"scope":{"type":"string","enum":["docs:read"]},"client_id":{"type":"string"}}}}}},"responses":{"200":{"description":"Access token response (RFC 6749 §5.1).","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"400":{"description":"OAuth error (RFC 6749 §5.2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"429":{"description":"Quota exhausted. Honor Retry-After and retry. RateLimit remaining is 0.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/mcp":{"post":{"tags":["Docs MCP"],"operationId":"postMcpJsonRpc","summary":"DaloyJS MCP server (JSON-RPC 2.0 over Streamable HTTP)","description":"Read-only tools: search_docs, get_doc, list_docs. Send JSON-RPC 2.0. GET on this URL returns 405 with a JSON hint. Bearer docs:read is optional.","security":[{"oauth2":["docs:read"]},{}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"responses":{"200":{"description":"JSON-RPC result or error envelope.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"RFC 9457 problem+json with an error code and a recovery hint.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"RFC 9457 problem+json with an error code and a recovery hint.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"RFC 9457 problem+json with an error code and a recovery hint.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Quota exhausted. Honor Retry-After and retry. RateLimit remaining is 0.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/llms.txt":{"get":{"tags":["Discovery"],"operationId":"getLlmsTxt","summary":"Curated Markdown index of the site for agents","responses":{"200":{"description":"llms.txt v2 document.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"text/plain":{"schema":{"type":"string"}}}},"429":{"description":"Quota exhausted. Honor Retry-After and retry. RateLimit remaining is 0.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/oauth/authorize":{"get":{"tags":["OAuth"],"operationId":"getOauthAuthorize","summary":"Authorization endpoint (client_credentials only)","description":"Advertised by the RFC 8414 metadata. This server implements no browser redirect flow, so it answers with an RFC 6749 §4.1.2.1 unsupported_response_type error pointing at the token endpoint. Probes get live JSON rather than an HTML 404.","security":[],"responses":{"400":{"description":"OAuth error (RFC 6749 §5.2).","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"429":{"description":"Quota exhausted. Honor Retry-After and retry. RateLimit remaining is 0.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/oauth/introspect":{"post":{"tags":["OAuth"],"operationId":"postOauthIntrospect","summary":"OAuth 2.0 token introspection (RFC 7662)","description":"Confirm that a token minted by this origin is still active and which scope it carries. No client authentication: the only issued scope covers public documentation. Unknown or expired tokens return { active: false }.","security":[],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["token"],"properties":{"token":{"type":"string"},"token_type_hint":{"type":"string","enum":["access_token"]}}}}}},"responses":{"200":{"description":"Introspection response (RFC 7662 §2.2).","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntrospectionResponse"}}}},"400":{"description":"OAuth error (RFC 6749 §5.2).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"429":{"description":"Quota exhausted. Honor Retry-After and retry. RateLimit remaining is 0.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/.well-known/oauth-protected-resource/{resource}":{"get":{"tags":["OAuth"],"operationId":"getOauthProtectedResourceMetadataForResource","summary":"RFC 9728 §3.1 per-resource protected-resource metadata","description":"Metadata for one resource on this origin, located by inserting the resource path after the well-known prefix. MCP clients resolve /.well-known/oauth-protected-resource/mcp before attaching a token.","parameters":[{"name":"resource","in":"path","required":true,"description":"Resource path without the leading slash.","schema":{"type":"string","examples":["mcp","api/v1"]}}],"responses":{"200":{"description":"Protected-resource metadata, including scopes_supported.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"RFC 9457 problem+json with an error code and a recovery hint.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Quota exhausted. Honor Retry-After and retry. RateLimit remaining is 0.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/md/{path}":{"get":{"tags":["Markdown"],"operationId":"getPageMarkdown","summary":"Markdown representation of any public page","description":"Also reachable by appending `.md` to a page URL, or by sending `Accept: text/markdown` to the canonical URL. Responses set `Vary: Accept`.","parameters":[{"name":"path","in":"path","required":true,"description":"Page path without the leading slash.","schema":{"type":"string","examples":["docs/routing"]}}],"responses":{"200":{"description":"Markdown body of the page.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}}},"content":{"text/markdown":{"schema":{"type":"string"}}}},"404":{"description":"No such page. The Markdown body lists recovery entry points.","content":{"text/markdown":{"schema":{"type":"string"}}}},"429":{"description":"Quota exhausted. Honor Retry-After and retry. RateLimit remaining is 0.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/docs-md/{path}":{"get":{"tags":["Markdown"],"operationId":"getLegacyDocsMarkdown","summary":"Legacy Markdown handler for cached /docs/*.md destinations","deprecated":true,"description":"Deprecated in favour of /md/docs/{path}. Every response carries an RFC 9745 Deprecation date and RFC 8288 deprecation / successor-version relations. No Sunset date is scheduled; one will be announced at least 180 days ahead. Policy: https://daloyjs.dev/docs/api-lifecycle.","parameters":[{"name":"path","in":"path","required":true,"description":"Docs path without the leading slash.","schema":{"type":"string","examples":["routing"]}}],"responses":{"200":{"description":"Markdown body of the docs page.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}},"Deprecation":{"description":"RFC 9745 structured-field Date marking when this surface was deprecated, e.g. @1756944000.","schema":{"type":"string"}},"Sunset":{"description":"RFC 8594 IMF-fixdate for the scheduled retirement. Absent while no retirement is scheduled; never set less than 180 days ahead.","schema":{"type":"string"}},"Link":{"description":"RFC 8288 relations: rel=\"deprecation\", rel=\"sunset\", rel=\"successor-version\", rel=\"latest-version\".","schema":{"type":"string"}}},"content":{"text/markdown":{"schema":{"type":"string"}}}},"404":{"description":"No such docs page.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}},"Deprecation":{"description":"RFC 9745 structured-field Date marking when this surface was deprecated, e.g. @1756944000.","schema":{"type":"string"}},"Sunset":{"description":"RFC 8594 IMF-fixdate for the scheduled retirement. Absent while no retirement is scheduled; never set less than 180 days ahead.","schema":{"type":"string"}},"Link":{"description":"RFC 8288 relations: rel=\"deprecation\", rel=\"sunset\", rel=\"successor-version\", rel=\"latest-version\".","schema":{"type":"string"}}},"content":{"text/markdown":{"schema":{"type":"string"}}}},"429":{"description":"Quota exhausted. Honor Retry-After and retry. RateLimit remaining is 0.","headers":{"RateLimit":{"description":"IETF RateLimit header (draft-ietf-httpapi-ratelimit-headers). Example: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Advertised quota. Default: \"default\";q=120;w=60","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Maximum requests per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer"}},"API-Version":{"description":"Current URL-path major (1).","schema":{"type":"string","const":"1"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}},"components":{"securitySchemes":{"oauth2":{"type":"oauth2","description":"Optional OAuth 2.0 client_credentials. The only issued scope is docs:read (public documentation). Resources remain usable without a token.","flows":{"clientCredentials":{"tokenUrl":"https://daloyjs.dev/oauth/token","scopes":{"docs:read":"Read public DaloyJS documentation, OpenAPI, llms.txt, and the docs MCP server."}}}}},"schemas":{"Problem":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","code","hint"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string","description":"Machine-readable error code (snake_case)."},"hint":{"type":"string","description":"What the caller should do next to recover."}}},"ApiIndex":{"type":"object","additionalProperties":false,"required":["name","description","version","links"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"version":{"type":"string"},"versioning":{"type":"object","additionalProperties":true},"links":{"type":"object","additionalProperties":{"type":"string","format":"uri"}}}},"TokenResponse":{"type":"object","required":["access_token","token_type","expires_in","scope"],"properties":{"access_token":{"type":"string"},"token_type":{"type":"string","enum":["Bearer"]},"expires_in":{"type":"integer"},"scope":{"type":"string","const":"docs:read"}}},"IntrospectionResponse":{"type":"object","required":["active"],"properties":{"active":{"type":"boolean"},"scope":{"type":"string"},"token_type":{"type":"string"},"iss":{"type":"string"},"aud":{"type":"string"},"iat":{"type":"integer"},"exp":{"type":"integer"}}},"OAuthError":{"type":"object","required":["error","error_description"],"properties":{"error":{"type":"string"},"error_description":{"type":"string"}}}}}}