{"openapi":"3.1.0","info":{"title":"Bookbridge Service API","version":"1.5.0","description":"Bookbridge is a channel manager: it synchronises availability, rates and reservations between property managers and booking platforms. Integration happens outbound, against each platform’s API, so this service exposes only a public status page and a health probe. There is no public booking API.","contact":{"name":"Bookbridge Support","email":"support@bookbridge.example"}},"servers":[{"url":"https://bookbridge.example","description":"Production"}],"paths":{"/":{"get":{"summary":"Service status page","description":"Human-readable status page. Server-rendered HTML.","operationId":"getStatusPage","responses":{"200":{"description":"Status page","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/webhooks/platform":{"post":{"summary":"Partner-scoped platform webhook receiver","description":"Receives signed event deliveries from the partner-api platform. The body is verified as an HMAC-SHA256 over the raw request bytes, keyed on the endpoint secret and presented as bare lowercase hex in `X-Signature` — no `sha256=` prefix. A delivery that fails verification is answered 401 and still recorded. Processing is nil by design: we acknowledge immediately, because the platform retries anything slow.","operationId":"receivePlatformWebhook","parameters":[{"name":"X-Signature","in":"header","required":true,"description":"Bare lowercase hex HMAC-SHA256 of the raw body (64 characters).","schema":{"type":"string","pattern":"^[0-9a-f]{64}$"}},{"name":"X-Webhook-Event","in":"header","required":false,"description":"Event type, e.g. `integration.breaking_change`.","schema":{"type":"string"}},{"name":"X-Webhook-Timestamp","in":"header","required":false,"description":"ISO-8601 instant the payload was built.","schema":{"type":"string","format":"date-time"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["event","timestamp","data"],"properties":{"event":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"data":{"type":"object","additionalProperties":true}}}}}},"responses":{"200":{"description":"Delivery accepted","content":{"application/json":{"schema":{"type":"object","required":["received"],"properties":{"received":{"type":"boolean","enum":[true]},"event":{"type":["string","null"]}}}}}},"401":{"description":"Signature missing, malformed or wrong"}}}},"/health":{"get":{"summary":"Health probe","description":"Liveness probe used by the platform’s load balancer.","operationId":"getHealth","responses":{"200":{"description":"Service is up","content":{"application/json":{"schema":{"type":"object","required":["status","uptime","version"],"properties":{"status":{"type":"string","enum":["ok"]},"uptime":{"type":"number","description":"Process uptime in seconds"},"version":{"type":"string"}}}}}}}}}}}