{"openapi":"3.1.0","info":{"title":"VALAR Public Site API","summary":"Agent- and developer-facing public endpoints on valar.space, served under /v1.","description":"VALAR (https://valar.space) is cloud-native flight dynamics software for satellite operators: orbit determination, maneuver planning and conjunction assessment. This document describes the public, read-only endpoints of the valar.space marketing site.\n\n## Versioning\nEvery path below is versioned with a URL path prefix (/v1/...). The v1 surface is additive-only: new endpoints and optional fields may appear without notice, breaking changes ship as a new major prefix (/v2/...) alongside v1 before any removal. The unversioned paths (e.g. /pricing.md) stay live as compatibility aliases but are not part of this contract.\n\nThe authenticated product API lives at https://api.valar.space/ and is documented at https://docs.valar.space/; it is out of scope here.\n\nPublic endpoints are rate limited to 60 requests per 60 seconds per client. Every response carries IETF RateLimit-Policy and RateLimit headers; an exhausted window answers 429 with a numeric Retry-After header.","version":"1.0.0","contact":{"name":"VALAR SPACE, S.L.","email":"legal@valar.space","url":"https://valar.space/developers"}},"servers":[{"url":"https://valar.space","description":"VALAR public marketing site"}],"paths":{"/v1/llms.txt":{"get":{"operationId":"getLlmsTxt","summary":"Agent guidance and full resource index","description":"llms.txt document with when-to-use guidance for the VALAR product and links to every developer surface.","tags":["Discovery"],"responses":{"200":{"description":"Markdown document","content":{"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}}}},"429":{"description":"Rate limit exhausted; Retry-After carries seconds until the window rolls over.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/pricing.md":{"get":{"operationId":"getPricingMarkdown","summary":"Public pricing tiers as markdown","description":"Machine-readable VALAR pricing: every tier, what it includes, and per-tier capability depth.","tags":["Content"],"responses":{"200":{"description":"Markdown document","content":{"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limit exhausted; Retry-After carries seconds until the window rolls over.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/openapi.json":{"get":{"operationId":"getOpenApiSpec","summary":"This OpenAPI document","description":"The OpenAPI 3.1 description of the public valar.space surface.","tags":["Discovery"],"responses":{"200":{"description":"OpenAPI 3.1 document","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenApiDocument"}}}},"429":{"description":"Rate limit exhausted; Retry-After carries seconds until the window rolls over.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/.well-known/api-catalog":{"get":{"operationId":"getApiCatalog","summary":"RFC 9727 API catalog linkset","description":"Linkset pointing at the product API description (service-desc), human documentation (service-doc) and status endpoint.","tags":["Discovery"],"responses":{"200":{"description":"RFC 9727 linkset document","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiCatalogLinkset"}}}},"429":{"description":"Rate limit exhausted; Retry-After carries seconds until the window rolls over.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/.well-known/homepage-markdown":{"get":{"operationId":"getHomepageMarkdown","summary":"Homepage as markdown","description":"The VALAR homepage rendered as markdown. Also served at / when the request carries Accept: text/markdown.","tags":["Content"],"responses":{"200":{"description":"Markdown document","content":{"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}}}},"429":{"description":"Rate limit exhausted; Retry-After carries seconds until the window rolls over.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/server.json":{"get":{"operationId":"getMcpServerManifest","summary":"MCP server registry manifest","description":"Model Context Protocol registry manifest for the VALAR MCP server.","tags":["MCP"],"responses":{"200":{"description":"MCP server manifest","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerManifest"}}}},"429":{"description":"Rate limit exhausted; Retry-After carries seconds until the window rolls over.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/mcp/server-card":{"get":{"operationId":"getMcpServerCardCanonical","summary":"Canonical MCP server card","description":"The canonical remote server card for the VALAR MCP server.","tags":["MCP"],"responses":{"200":{"description":"MCP server card","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerCard"}}}},"429":{"description":"Rate limit exhausted; Retry-After carries seconds until the window rolls over.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/.well-known/mcp/server-card.json":{"get":{"operationId":"getMcpServerCardCompat","summary":"Compatibility copy of the MCP server card","description":"A compatibility copy of the canonical MCP server card.","tags":["MCP"],"responses":{"200":{"description":"MCP server card","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerCard"}}}},"429":{"description":"Rate limit exhausted; Retry-After carries seconds until the window rolls over.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/.well-known/ai-catalog.json":{"get":{"operationId":"getAiCatalog","summary":"Domain-level MCP discovery","description":"Catalog entry pointing at the canonical VALAR MCP server card.","tags":["MCP"],"responses":{"200":{"description":"AI catalog document","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiCatalog"}}}},"429":{"description":"Rate limit exhausted; Retry-After carries seconds until the window rolls over.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/mcp":{"post":{"operationId":"postMcpJsonRpc","summary":"VALAR MCP server (Streamable HTTP, stateless)","description":"JSON-RPC 2.0 endpoint implementing the Model Context Protocol: initialize, notifications/initialized, ping, tools/list and tools/call. Read-only tools: valar_get_pricing, valar_get_homepage, valar_get_site_map, valar_get_changelog_latest, valar_get_docs_index.","tags":["MCP"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"},"examples":{"initialize":{"value":{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"example-client","version":"1.0.0"}}}},"toolsList":{"value":{"jsonrpc":"2.0","id":2,"method":"tools/list"}},"toolsCall":{"value":{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"valar_get_pricing","arguments":{}}}}}}}},"responses":{"200":{"description":"JSON-RPC response envelope (result or error). Notifications answer 202 with no body.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcEnvelope"}}}},"202":{"description":"Notification accepted; no body."},"400":{"description":"Malformed or invalid request.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Rate limit exhausted; Retry-After carries seconds until the window rolls over.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"get":{"operationId":"getMcpMethodNotAllowed","summary":"Returns 405 - the MCP server accepts POST only","description":"The VALAR MCP server serves no SSE stream; GET answers 405 with an Allow: POST header.","tags":["MCP"],"responses":{"405":{"description":"Unsupported method; Allow lists what is accepted.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"429":{"description":"Rate limit exhausted; Retry-After carries seconds until the window rolls over.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/v1/changelog/latest.json":{"get":{"operationId":"getLatestChangelog","summary":"Latest changelog entry for the product UI","description":"The newest published changelog entry as JSON, consumed by the VALAR product UI.","tags":["Content"],"responses":{"200":{"description":"Latest changelog entry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LatestChangelogEntry"}}}},"404":{"description":"No published changelog entries in this deploy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LatestChangelogNotFound"}}}},"429":{"description":"Rate limit exhausted; Retry-After carries seconds until the window rolls over.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}}},"tags":[{"name":"Discovery","description":"Machine-readable indexes of VALAR surfaces."},{"name":"Content","description":"Public content in agent-friendly representations."},{"name":"MCP","description":"Model Context Protocol server and manifests."}],"components":{"schemas":{"MarkdownDocument":{"type":"string","description":"A UTF-8 markdown document."},"ProblemDetails":{"type":"object","description":"RFC 9457 problem details with VALAR extensions: stable machine code, human detail, actionable resolution.","properties":{"type":{"type":"string","format":"uri-reference","description":"Problem type URI."},"code":{"type":"string","description":"Stable machine-readable error code, e.g. NOT_FOUND."},"title":{"type":"string","description":"Short human-readable summary."},"status":{"type":"integer","description":"HTTP status code."},"detail":{"type":"string","description":"Human-readable explanation."},"message":{"type":"string","description":"Alias of detail for lenient parsers."},"resolution":{"type":"string","description":"Actionable hint for recovering."},"instance":{"type":"string","description":"Request path that raised the problem."}},"required":["type","code","title","status","detail","message","resolution"]},"JsonRpcEnvelope":{"type":"object","description":"JSON-RPC 2.0 response envelope.","properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"result":{"type":"object","description":"Result on success; shape depends on the method.","additionalProperties":true},"error":{"type":"object","properties":{"code":{"type":"integer","description":"JSON-RPC error code, e.g. -32601."},"message":{"type":"string"},"data":{"type":"object","additionalProperties":true}},"required":["code","message"]}},"required":["jsonrpc"]},"JsonRpcRequest":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","enum":["2.0"]},"id":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"null"}]},"method":{"type":"string","enum":["initialize","notifications/initialized","ping","tools/list","tools/call"]},"params":{"type":"object","additionalProperties":true}}},"McpServerManifest":{"type":"object","properties":{"$schema":{"type":"string","format":"uri"},"name":{"type":"string","example":"io.github.valar-space/valar-marketing-site"},"title":{"type":"string"},"description":{"type":"string"},"version":{"type":"string"},"websiteUrl":{"type":"string","format":"uri"},"remotes":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"streamable-http"},"url":{"type":"string","format":"uri"}},"required":["type","url"]}}},"required":["name","title","description","version","websiteUrl","remotes"]},"McpServerCard":{"type":"object","properties":{"$schema":{"type":"string","format":"uri"},"name":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"version":{"type":"string"},"websiteUrl":{"type":"string","format":"uri"},"remotes":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"streamable-http"},"url":{"type":"string","format":"uri"},"supportedProtocolVersions":{"type":"array","items":{"type":"string"}}},"required":["type","url"]}}},"required":["name","title","version","remotes"]},"AiCatalog":{"type":"object","properties":{"specVersion":{"type":"string","const":"1.0"},"entries":{"type":"array","items":{"type":"object","properties":{"identifier":{"type":"string","description":"URN-style identifier."},"type":{"type":"string","const":"application/mcp-server-card+json"},"url":{"type":"string","format":"uri"}},"required":["identifier","type","url"]}}},"required":["specVersion","entries"]},"ApiCatalogLinkset":{"type":"object","description":"RFC 9727 link-set document.","properties":{"linkset":{"type":"array","items":{"type":"object","properties":{"anchor":{"type":"string","format":"uri"},"service-desc":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","format":"uri"},"type":{"type":"string"}},"required":["href"]}},"service-doc":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","format":"uri"},"type":{"type":"string"}},"required":["href"]}},"status":{"type":"array","items":{"type":"object","properties":{"href":{"type":"string","format":"uri"},"type":{"type":"string"}},"required":["href"]}}},"required":["anchor"]}}},"required":["linkset"]},"LatestChangelogEntry":{"type":"object","properties":{"slug":{"type":"string"},"theme":{"type":"string","description":"Entry theme used as its title."},"publishDate":{"type":"string","format":"date"},"url":{"type":"string","format":"uri"}},"required":["slug","theme","publishDate","url"]},"LatestChangelogNotFound":{"type":"object","properties":{"error":{"type":"string","const":"NO_PUBLISHED_ENTRIES"},"message":{"type":"string"}},"required":["error","message"]},"OpenApiDocument":{"type":"object","description":"This OpenAPI document.","properties":{"openapi":{"type":"string","pattern":"^3\\."},"info":{"type":"object","additionalProperties":true},"paths":{"type":"object","additionalProperties":true}},"required":["openapi","info","paths"]}},"headers":{"RateLimit-Policy":{"schema":{"type":"string","example":"60;w=60"},"description":"IETF rate-limit policy: 60 requests per 60-second window."},"RateLimit":{"schema":{"type":"string","example":"limit=60, remaining=59, reset=1787397210"},"description":"IETF RateLimit structured field: limit, remaining and reset for this window."},"Retry-After":{"schema":{"type":"integer","minimum":1,"maximum":60},"description":"Seconds until the exhausted window resets."}}}}