{"openapi":"3.1.0","info":{"title":"sendyka.dev public website API","description":"Digital partner for NGOs and SMEs in Poland: web design, IT support, and process automation with privacy-first implementation. Current public API surface is intentionally small and focused on newsletter and MCP discovery flows.","version":"1.2.0"},"servers":[{"url":"https://sendyka.dev"}],"externalDocs":{"description":"Service reliability status and planned maintenance","url":"https://sendyka.dev/status/"},"x-scopes-supported":[{"name":"newsletter:subscribe","description":"Create newsletter subscription requests on behalf of a user."},{"name":"newsletter:unsubscribe","description":"Revoke newsletter subscription for a user email."},{"name":"mcp:read","description":"Read MCP server metadata and tool list without calling tools."},{"name":"mcp:tools:inquiry","description":"Submit service inquiry using MCP tool endpoints."},{"name":"mcp:tools:booking","description":"Create consultation booking requests through MCP transport."}],"components":{"headers":{"XRateLimitLimit":{"description":"Maximum requests allowed in the current time window.","schema":{"type":"integer"}},"XRateLimitRemaining":{"description":"Requests remaining in the current time window.","schema":{"type":"integer"}},"RetryAfter":{"description":"Seconds to wait before retrying after a rate limit response.","schema":{"type":"integer"}}},"schemas":{"SubscribeRequest":{"type":"object","required":["email","consent"],"properties":{"email":{"type":"string","format":"email","description":"Subscriber email address."},"locale":{"type":"string","enum":["pl","en"],"description":"Preferred content language. Defaults to `pl`."},"consent":{"type":"boolean","description":"Must be `true` to confirm newsletter consent."}}},"UnsubscribeRequest":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","description":"Email address to remove from newsletter updates."}}},"SuccessResponse":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}},"ErrorResponse":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","hint","retryable"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"},"retryable":{"type":"boolean"}}}}},"McpJsonRpcRequest":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","number","null"]},"method":{"type":"string"},"params":{"type":"object"}}},"McpServiceInquiryArguments":{"type":"object","required":["fullName","email","supportArea"],"properties":{"fullName":{"type":"string","minLength":3},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"supportArea":{"type":"string","minLength":3},"notes":{"type":"string"}}},"McpConsultationBookingArguments":{"type":"object","required":["fullName","email","timeZone","start"],"properties":{"fullName":{"type":"string","minLength":3},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"timeZone":{"type":"string","example":"Europe/Warsaw"},"start":{"type":"string","format":"date-time"},"notes":{"type":"string"}}},"McpDiscoveryResponse":{"type":"object","required":["name","version","transport","serverCardUrl","wellKnownTransportUrl","tools"],"properties":{"name":{"type":"string"},"version":{"type":"string"},"transport":{"type":"string"},"serverCardUrl":{"type":"string","format":"uri"},"wellKnownTransportUrl":{"type":"string","format":"uri"},"tools":{"type":"array","items":{"type":"object"}}}},"McpSseEvent":{"type":"string","description":"Server-Sent Events stream payload. Events include `start`, `progress`, and `complete` with JSON in each `data:` line."},"McpJsonRpcResponse":{"type":"object","required":["jsonrpc"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","number","null"]},"result":{"type":"object"},"error":{"type":"object"}}},"ApiCatalogResponse":{"type":"object","required":["name","version","docs","endpoints","streaming","errors"],"properties":{"name":{"type":"string"},"version":{"type":"string"},"docs":{"type":"object"},"endpoints":{"type":"array","items":{"type":"object"}},"streaming":{"type":"object"},"errors":{"type":"object"}}},"ErrorContractResponse":{"type":"object","required":["name","version","schema","examples"],"properties":{"name":{"type":"string"},"version":{"type":"string"},"schema":{"type":"object"},"examples":{"type":"array","items":{"type":"object"}}}}},"responses":{"Error400":{"description":"Validation or JSON parsing error.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Error429":{"description":"Rate limit exceeded.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Error501":{"description":"Endpoint not configured for current deployment.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"Error502":{"description":"Transient upstream/provider error.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"paths":{"/api/subscribe":{"options":{"operationId":"optionsSubscribePreflight","summary":"CORS preflight for subscribe endpoint","responses":{"204":{"description":"CORS headers returned"}}},"post":{"operationId":"postNewsletterSubscribe","summary":"Subscribe email to newsletter","description":"Adds an email to newsletter list for selected locale.","x-recommended-scopes":["newsletter:subscribe"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeRequest"}}}},"responses":{"200":{"description":"Subscription accepted.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"$ref":"#/components/responses/Error400"},"429":{"$ref":"#/components/responses/Error429"},"501":{"$ref":"#/components/responses/Error501"},"502":{"$ref":"#/components/responses/Error502"}}}},"/api/newsletter/unsubscribe":{"options":{"operationId":"optionsUnsubscribePreflight","summary":"CORS preflight for unsubscribe endpoint","responses":{"204":{"description":"CORS headers returned"}}},"post":{"operationId":"postNewsletterUnsubscribe","summary":"Unsubscribe email from newsletter","description":"Removes an email from newsletter list.","x-recommended-scopes":["newsletter:unsubscribe"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnsubscribeRequest"}}}},"responses":{"200":{"description":"Unsubscribe accepted.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}}},"400":{"$ref":"#/components/responses/Error400"},"429":{"$ref":"#/components/responses/Error429"},"501":{"$ref":"#/components/responses/Error501"},"502":{"$ref":"#/components/responses/Error502"}}}},"/api/mcp":{"get":{"operationId":"getMcpDiscoveryManifest","summary":"MCP discovery manifest","description":"Returns MCP discovery metadata and tool definitions for service inquiry and consultation booking. Supports SSE streaming when `Accept: text/event-stream` is provided.","x-recommended-scopes":["mcp:read"],"responses":{"200":{"description":"MCP manifest response.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpDiscoveryResponse"}},"text/markdown":{"schema":{"type":"string"}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/McpSseEvent"}}}},"429":{"$ref":"#/components/responses/Error429"}}},"post":{"operationId":"postMcpJsonRpc","summary":"MCP JSON-RPC endpoint","description":"Accepts JSON-RPC requests (`initialize`, `tools/list`, `tools/call`). Supported tools: `service_inquiry_submit`, `consultation_book`.","x-recommended-scopes":["mcp:tools:inquiry","mcp:tools:booking"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpJsonRpcRequest"}}}},"responses":{"200":{"description":"MCP JSON-RPC success response.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpJsonRpcResponse"}}}},"400":{"description":"Invalid JSON-RPC request.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpJsonRpcResponse"}}}},"404":{"description":"Unknown method.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpJsonRpcResponse"}}}},"429":{"$ref":"#/components/responses/Error429"},"501":{"description":"Method known but not publicly callable.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpJsonRpcResponse"}}}}}}},"/mcp":{"get":{"operationId":"getMcpDiscoveryManifestWeb","summary":"WebMCP discovery manifest","description":"Primary WebMCP transport endpoint. Supports JSON, markdown, and SSE negotiation.","x-recommended-scopes":["mcp:read"],"responses":{"200":{"description":"MCP manifest response.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpDiscoveryResponse"}},"text/markdown":{"schema":{"type":"string"}},"text/event-stream":{"schema":{"$ref":"#/components/schemas/McpSseEvent"}}}},"429":{"$ref":"#/components/responses/Error429"}}},"post":{"operationId":"postMcpJsonRpcWeb","summary":"WebMCP JSON-RPC endpoint","description":"Primary JSON-RPC transport for browser-based and server-based MCP clients.","x-recommended-scopes":["mcp:tools:inquiry","mcp:tools:booking"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpJsonRpcRequest"}}}},"responses":{"200":{"description":"MCP JSON-RPC success response.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpJsonRpcResponse"}}}},"400":{"description":"Invalid JSON-RPC request.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpJsonRpcResponse"}}}},"404":{"description":"Unknown method.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpJsonRpcResponse"}}}},"429":{"$ref":"#/components/responses/Error429"},"501":{"description":"Method known but not publicly callable.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/XRateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/XRateLimitRemaining"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpJsonRpcResponse"}}}}}}},"/api":{"get":{"operationId":"getApiEndpointCatalog","summary":"Public API endpoint catalog","description":"Provides a machine-readable catalog of API endpoints, docs links, streaming support, and error contract references.","responses":{"200":{"description":"API catalog response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiCatalogResponse"}}}}}}},"/api/error-format":{"get":{"operationId":"getApiErrorContract","summary":"JSON error response contract","description":"Returns machine-readable JSON schema and examples for API error responses.","responses":{"200":{"description":"Error contract response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorContractResponse"}}}}}}}}}