{"openapi":"3.1.0","info":{"title":"Seattle Organic SEO — Public Agent API","version":"3.0.0","description":"Versioned public read-only API. No OAuth, purchases, lead submissions, idempotent writes, async REST jobs or GraphQL are implemented. MCP notifications may return HTTP 202 (not an async job).","contact":{"name":"Seattle Organic SEO","url":"https://seattleorganicseo.com/contact/","email":"hello@seattleorganicseo.com"}},"servers":[{"url":"https://seattleorganicseo.com"}],"paths":{"/openapi.json":{"get":{"summary":"OpenAPI 3.1 specification","responses":{"200":{"description":"Specification","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/agent/health":{"get":{"summary":"Public agent API health check","responses":{"200":{"description":"Status","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/agent/pages":{"get":{"summary":"List public pages","responses":{"200":{"description":"Public pages","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/agent/page":{"get":{"summary":"Read one public page as text","parameters":[{"name":"path","in":"query","required":true,"schema":{"type":"string","enum":["/","/privacy-policy/","/privacy/","/about/","/seo-plans/","/contact/","/llm-info/","/generative-engine-optimization/","/wordpress-seo-company/","/local-seo/","/ppc-ads-management/"]}}],"responses":{"200":{"description":"Extracted public page text","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Unsupported path"},"502":{"description":"Origin unavailable"},"503":{"description":"Origin rate limited"}}}},"/mcp":{"post":{"summary":"Public, read-only MCP JSON-RPC endpoint (when Ora does not serve /mcp)","description":"Stateless Streamable HTTP with JSON response. Supported methods: initialize, ping, tools/list, tools/call.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"JSON-RPC result","content":{"application/json":{"schema":{"type":"object"}}}},"202":{"description":"Notification accepted"},"400":{"description":"Invalid request"},"403":{"description":"Origin rejected"}}}},"/api/v1/agent/health":{"get":{"operationId":"getAgentHealthV1","summary":"Read API health and version","responses":{"200":{"description":"Status","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/agent/company":{"get":{"operationId":"getAgentCompanyV1","summary":"Read published company facts","responses":{"200":{"description":"Company details","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/agent/contact":{"get":{"operationId":"getAgentContactV1","summary":"Read contact information; cannot submit a lead","responses":{"200":{"description":"Contact details","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/agent/pricing":{"get":{"operationId":"getAgentPricingV1","summary":"Read dated public SEO pricing snapshot","responses":{"200":{"description":"Published prices","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/agent/pages":{"get":{"operationId":"listAgentPagesV1","summary":"List approved public pages with real pagination","parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"One-based page index"},{"name":"per_page","in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"description":"Items per page"}],"responses":{"200":{"description":"Page collection","content":{"application/json":{"schema":{"type":"object","required":["data","pagination","links"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Page"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"links":{"type":"object","properties":{"self":{"type":"string","format":"uri"},"next":{"type":["string","null"],"format":"uri"},"prev":{"type":["string","null"],"format":"uri"}}}}}}}},"400":{"description":"Invalid page parameters","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/agent/page":{"get":{"operationId":"readAgentPageV1","summary":"Read bounded text from an approved public page","parameters":[{"name":"path","in":"query","required":true,"schema":{"type":"string","enum":["/","/privacy-policy/","/privacy/","/about/","/seo-plans/","/contact/","/llm-info/","/generative-engine-optimization/","/wordpress-seo-company/","/local-seo/","/ppc-ads-management/"]}}],"responses":{"200":{"description":"Public page content","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid page path","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"Upstream unavailable","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream overloaded","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/pricing":{"get":{"summary":"Redirect to published SEO pricing","responses":{"302":{"description":"Redirect to /seo-plans/","headers":{"Location":{"schema":{"type":"string"}}}}}}},"/a2a/v1":{"post":{"summary":"Deterministic read-only A2A public information agent","description":"Supports A2A v1.0 JSON-RPC SendMessage with text input; returns a direct answer, not a background task.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"A2A JSON-RPC response","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"A2A JSON-RPC error","content":{"application/json":{"schema":{"type":"object"}}}}}}}},"components":{"schemas":{"Problem":{"type":"object","required":["type","title","status","code","detail","instance"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string"},"detail":{"type":"string"},"instance":{"type":"string"}}},"Page":{"type":"object","required":["title","path","description","url"],"properties":{"title":{"type":"string"},"path":{"type":"string"},"description":{"type":"string"},"url":{"type":"string","format":"uri"}}},"Pagination":{"type":"object","required":["page","per_page","total","total_pages","has_more"],"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"},"total_pages":{"type":"integer"},"has_more":{"type":"boolean"}}}}}}