{"openapi":"3.1.0","info":{"title":"Webhooks Service API","description":"FastAPI Webhooks Service - handles external service callbacks","version":"0.3.0"},"paths":{"/razorpay/payments":{"post":{"tags":["Razorpay Webhooks"],"summary":"Razorpay Payments Webhook","description":"Handles Razorpay payment webhook events:\n    - payment.authorized\n    - payment.captured\n    - payment.failed\n    - order.paid","operationId":"razorpay_payments_webhook_razorpay_payments_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RazorpayWebhookPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/razorpay/refunds":{"post":{"tags":["Razorpay Webhooks"],"summary":"Razorpay Refunds Webhook","description":"Handles Razorpay refund webhook events:\n    - refund.created\n    - refund.processed\n    - refund.failed","operationId":"razorpay_refunds_webhook_razorpay_refunds_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RazorpayWebhookPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/razorpay/subscriptions":{"post":{"tags":["Razorpay Webhooks"],"summary":"Razorpay Subscriptions Webhook","description":"Handles Razorpay subscription webhook events:\n    - subscription.activated\n    - subscription.charged\n    - subscription.completed\n    - subscription.cancelled\n    - subscription.halted\n    - subscription.pending","operationId":"razorpay_subscriptions_webhook_razorpay_subscriptions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RazorpayWebhookPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ivs":{"get":{"tags":["IVS Webhooks"],"summary":"Ivs Webhook Get","description":"Health/verification endpoint for the IVS webhook.","operationId":"ivs_webhook_get_ivs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["IVS Webhooks"],"summary":"AWS IVS EventBridge Webhook","description":"Handles AWS IVS EventBridge events:\n    - IVS Stream State Change (Stream Start / Stream End)\n    - IVS Recording State Change (Recording Start / Recording End)\n\n    On \"Recording End\", enqueues a ProcessLiveRecordingArchive AppTask.","operationId":"ivs_webhook_ivs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IVSWebhookPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookBaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/getstream/chat":{"get":{"tags":["GetStream Webhooks"],"summary":"Getstream Chat Webhook Get","description":"Handle GET requests for chat webhook verification.","operationId":"getstream_chat_webhook_get_getstream_chat_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}}}},"post":{"tags":["GetStream Webhooks"],"summary":"GetStream Chat Webhook","description":"Handles GetStream chat webhook events:\n    - message.new\n    - message.updated\n    - etc.","operationId":"getstream_chat_webhook_getstream_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStreamListOrDictPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"options":{"tags":["GetStream Webhooks"],"summary":"Getstream Chat Webhook Options","description":"Handle CORS preflight for chat webhook.","operationId":"getstream_chat_webhook_options_getstream_chat_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/getstream/reactions":{"get":{"tags":["GetStream Webhooks"],"summary":"Getstream Reactions Webhook Get","description":"Handle GET requests for reactions webhook verification.","operationId":"getstream_reactions_webhook_get_getstream_reactions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}}}},"post":{"tags":["GetStream Webhooks"],"summary":"GetStream Reactions Webhook","description":"Handles GetStream reactions webhook events.","operationId":"getstream_reactions_webhook_getstream_reactions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStreamListOrDictPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"options":{"tags":["GetStream Webhooks"],"summary":"Getstream Reactions Webhook Options","description":"Handle CORS preflight for reactions webhook.","operationId":"getstream_reactions_webhook_options_getstream_reactions_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/getstream/users":{"get":{"tags":["GetStream Webhooks"],"summary":"Getstream Users Webhook Get","description":"Handle GET requests for users webhook verification.","operationId":"getstream_users_webhook_get_getstream_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}}}},"post":{"tags":["GetStream Webhooks"],"summary":"GetStream Users Webhook","description":"Handles GetStream users webhook events.","operationId":"getstream_users_webhook_getstream_users_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStreamListOrDictPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"options":{"tags":["GetStream Webhooks"],"summary":"Getstream Users Webhook Options","description":"Handle CORS preflight for users webhook.","operationId":"getstream_users_webhook_options_getstream_users_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/getstream/collections":{"get":{"tags":["GetStream Webhooks"],"summary":"Getstream Collections Webhook Get","description":"Handle GET requests for collections webhook verification.","operationId":"getstream_collections_webhook_get_getstream_collections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}}}},"post":{"tags":["GetStream Webhooks"],"summary":"GetStream Collections Webhook","description":"Handles GetStream collections webhook events.","operationId":"getstream_collections_webhook_getstream_collections_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStreamListOrDictPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"options":{"tags":["GetStream Webhooks"],"summary":"Getstream Collections Webhook Options","description":"Handle CORS preflight for collections webhook.","operationId":"getstream_collections_webhook_options_getstream_collections_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/getstream/files":{"get":{"tags":["GetStream Webhooks"],"summary":"Getstream Files Webhook Get","description":"Handle GET requests for files webhook verification.","operationId":"getstream_files_webhook_get_getstream_files_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}}}},"post":{"tags":["GetStream Webhooks"],"summary":"GetStream Files Webhook","description":"Handles GetStream files webhook events.","operationId":"getstream_files_webhook_getstream_files_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStreamListOrDictPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"options":{"tags":["GetStream Webhooks"],"summary":"Getstream Files Webhook Options","description":"Handle CORS preflight for files webhook.","operationId":"getstream_files_webhook_options_getstream_files_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/getstream/feed/user":{"get":{"tags":["GetStream Webhooks"],"summary":"Getstream User Feed Webhook Get","description":"Handle GET requests for user feed webhook verification.","operationId":"getstream_user_feed_webhook_get_getstream_feed_user_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}}}},"post":{"tags":["GetStream Webhooks"],"summary":"GetStream User Feed Webhook","description":"Handles GetStream user feed webhook events.","operationId":"getstream_user_feed_webhook_getstream_feed_user_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStreamListOrDictPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"options":{"tags":["GetStream Webhooks"],"summary":"Getstream User Feed Webhook Options","description":"Handle CORS preflight for user feed webhook.","operationId":"getstream_user_feed_webhook_options_getstream_feed_user_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/getstream/feed/timeline":{"get":{"tags":["GetStream Webhooks"],"summary":"Getstream Timeline Feed Webhook Get","description":"Handle GET requests for timeline feed webhook verification.","operationId":"getstream_timeline_feed_webhook_get_getstream_feed_timeline_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}}}},"post":{"tags":["GetStream Webhooks"],"summary":"GetStream Timeline Feed Webhook","description":"Handles GetStream timeline feed webhook events.","operationId":"getstream_timeline_feed_webhook_getstream_feed_timeline_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStreamListOrDictPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"options":{"tags":["GetStream Webhooks"],"summary":"Getstream Timeline Feed Webhook Options","description":"Handle CORS preflight for timeline feed webhook.","operationId":"getstream_timeline_feed_webhook_options_getstream_feed_timeline_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/getstream/feed/timeline_aggregated":{"get":{"tags":["GetStream Webhooks"],"summary":"Getstream Timeline Aggregated Feed Webhook Get","description":"Handle GET requests for timeline aggregated feed webhook verification.","operationId":"getstream_timeline_aggregated_feed_webhook_get_getstream_feed_timeline_aggregated_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}}}},"post":{"tags":["GetStream Webhooks"],"summary":"GetStream Timeline Aggregated Feed Webhook","description":"Handles GetStream timeline aggregated feed webhook events.","operationId":"getstream_timeline_aggregated_feed_webhook_getstream_feed_timeline_aggregated_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStreamListOrDictPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"options":{"tags":["GetStream Webhooks"],"summary":"Getstream Timeline Aggregated Feed Webhook Options","description":"Handle CORS preflight for timeline aggregated feed webhook.","operationId":"getstream_timeline_aggregated_feed_webhook_options_getstream_feed_timeline_aggregated_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/getstream/feed/notification":{"get":{"tags":["GetStream Webhooks"],"summary":"Getstream Notification Feed Webhook Get","description":"Handle GET requests for notification feed webhook verification.","operationId":"getstream_notification_feed_webhook_get_getstream_feed_notification_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}}}},"post":{"tags":["GetStream Webhooks"],"summary":"GetStream Notification Feed Webhook","description":"Handles GetStream notification feed webhook events.","operationId":"getstream_notification_feed_webhook_getstream_feed_notification_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStreamListOrDictPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"options":{"tags":["GetStream Webhooks"],"summary":"Getstream Notification Feed Webhook Options","description":"Handle CORS preflight for notification feed webhook.","operationId":"getstream_notification_feed_webhook_options_getstream_feed_notification_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/apple-iap/notifications":{"post":{"tags":["Apple IAP Webhooks"],"summary":"Apple App Store Server Notifications V2","description":"Receives App Store Server Notifications V2 from Apple.\n\n    Apple sends a POST with a JSON body containing a single\n    `signedPayload` field (JWS/JWT).  The service decodes the token,\n    routes the notification to the appropriate handler, and syncs the\n    subscription state.\n\n    Notification types handled:\n    - SUBSCRIBED\n    - DID_RENEW\n    - DID_CHANGE_RENEWAL_STATUS\n    - DID_CHANGE_RENEWAL_PREF\n    - EXPIRED\n    - DID_FAIL_TO_RENEW\n    - GRACE_PERIOD_EXPIRED\n    - REFUND\n    - REVOKE\n    - OFFER_REDEEMED\n    - RENEWAL_EXTENDED","operationId":"apple_iap_notifications_apple_iap_notifications_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}}}}},"/google-iap/notifications":{"post":{"tags":["Google IAP Webhooks"],"summary":"Google Play RTDN webhook","description":"Receives Google Play Real-time Developer Notifications via a wrapped Google\n\tCloud Pub/Sub push payload. The endpoint decodes the Pub/Sub message,\n\tfetches the latest subscription state from Google Play, and syncs the\n\texisting subscription + transaction system.","operationId":"google_iap_notifications_google_iap_notifications_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GResponse_WebhookBaseResponse_"}}}}}}},"/health":{"get":{"tags":["Health"],"summary":"Health Check","description":"Health check endpoint.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"tags":["webhooks"],"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"ErrorDetailSchema":{"properties":{"error_code":{"type":"string","title":"Error Code","description":"Machine-readable error code (e.g., VALIDATION_ERROR, JWT_EXPIRED)"},"error_type":{"type":"string","title":"Error Type","description":"Exception class name or error category"},"details":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Details","description":"Additional error details (e.g., validation field errors)"}},"additionalProperties":false,"type":"object","required":["error_code","error_type"],"title":"ErrorDetailSchema","description":"Detailed error information for API responses."},"GResponse_WebhookBaseResponse_":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"type":"string","title":"Message","default":"Request processed successfully"},"status":{"type":"integer","title":"Status","default":200},"data":{"anyOf":[{"$ref":"#/components/schemas/WebhookBaseResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetailSchema"},{"type":"null"}],"description":"Error details when success=False"}},"additionalProperties":false,"type":"object","title":"GResponse[WebhookBaseResponse]"},"GetStreamListOrDictPayload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"}],"title":"GetStreamListOrDictPayload","description":"GetStream payload shape that may arrive as either object or list."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IVSWebhookPayload":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"detail-type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail-Type"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"account":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account"},"time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"resources":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Resources"},"detail":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Detail"}},"additionalProperties":true,"type":"object","title":"IVSWebhookPayload","description":"AWS EventBridge event envelope for IVS / IVS Recording state changes."},"RazorpayPayloadContainer":{"properties":{"entity":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Entity"}},"additionalProperties":true,"type":"object","title":"RazorpayPayloadContainer","description":"Container for Razorpay payload entities."},"RazorpayWebhookPayload":{"properties":{"entity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity"},"account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Id"},"event":{"type":"string","title":"Event"},"contains":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Contains"},"payload":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/RazorpayPayloadContainer"},"type":"object"},{"type":"null"}],"title":"Payload"},"created_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Created At"}},"additionalProperties":true,"type":"object","required":["event"],"title":"RazorpayWebhookPayload","description":"Complete Razorpay webhook payload structure."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebhookBaseResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"type":"string","title":"Message","default":"Webhook processed successfully"}},"additionalProperties":false,"type":"object","title":"WebhookBaseResponse","description":"Base response for webhook endpoints."}}},"servers":[{"url":"/v1/webhooks"}]}