{"openapi":"3.1.0","info":{"title":"Open Protocol Labs API","version":"1.2.0","description":"Public Open Protocol Labs HTTP API. Errors use RFC 9457 application/problem+json.\n\nThe current public API is /api/v1. Every response includes API-Version: 1. Clients may send that request header. Breaking changes ship as /api/v2. When a version is retired, responses include Deprecation: true, a Sunset HTTP-date (RFC 8594) at least 180 days out, and Link rel=deprecation.\n\nRate limits: every /api response sends IETF RateLimit and RateLimit-Policy headers (draft-ietf-httpapi-ratelimit-headers). The default policy is \"default\";q=120;w=60. 429 responses also send Retry-After, which takes precedence over RateLimit t.\n\nCLI: @opl.dev/cli. See /developers/cli.\n\nMCP: Streamable HTTP at /mcp. Discovery manifest at /.well-known/mcp.json."},"servers":[{"url":"https://opl.dev"}],"paths":{"/api":{"get":{"summary":"API discovery","operationId":"discoverApi","responses":{"200":{"description":"Published machine-readable surfaces","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"API-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object","required":["name","version","docs","openapi","llms"],"properties":{"name":{"type":"string"},"version":{"type":"string","const":"1"},"docs":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"},"llms":{"type":"string","format":"uri"},"cli":{"type":"string","format":"uri"},"mcp":{"type":"string","format":"uri"},"manifest":{"type":"string","format":"uri"}}}}}}}}},"/api/v1":{"get":{"summary":"API discovery","operationId":"discoverApiV1","responses":{"200":{"description":"Published machine-readable surfaces","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"API-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object","required":["name","version","docs","openapi","llms"],"properties":{"name":{"type":"string"},"version":{"type":"string","const":"1"},"docs":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"},"llms":{"type":"string","format":"uri"},"cli":{"type":"string","format":"uri"},"mcp":{"type":"string","format":"uri"},"manifest":{"type":"string","format":"uri"}}}}}}}}}},"components":{"schemas":{"Problem":{"type":"object","required":["type","title","status","detail","code","hint","error","error_description"],"properties":{"type":{"type":"string","format":"uri","description":"RFC 9457 type URI for this error code","examples":["https://opl.dev/problems/unauthorized"]},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"code":{"type":"string"},"hint":{"type":"string","description":"How an agent should recover"},"error":{"type":"string","description":"OAuth-compatible alias of code"},"error_description":{"type":"string","description":"OAuth-compatible alias of detail"}}}},"headers":{"RateLimit":{"description":"Current remaining quota. draft-ietf-httpapi-ratelimit-headers: \"default\";r=119;t=60","schema":{"type":"string"}},"RateLimitPolicy":{"description":"Quota policy. draft-ietf-httpapi-ratelimit-headers: \"default\";q=120;w=60","schema":{"type":"string"}},"ApiVersion":{"description":"Current API version. Send API-Version: 1 optionally.","schema":{"type":"string","const":"1"}},"RetryAfter":{"description":"Seconds to wait after 429. RFC 9110. Takes precedence over RateLimit t.","schema":{"type":"integer"}}}}}