{"service": "bschat-api", "name": "BSChat", "description": "The BSafe Group messenger: conversations, groups and channels, a feed, and calls through BS Meet", "base_url": "https://chat-api.bsafegroup.be", "client": "https://chat.bsafegroup.be", "api": "/api", "health": "/healthz", "realtime": {"protocol": "bschat/3", "path": "/ws"}, "docs": "/api/swagger.json", "endpoint_count": 43, "endpoints": [{"group": "auth", "method": "POST", "path": "/api/auth/register", "auth": "none", "summary": "Create an account"}, {"group": "auth", "method": "POST", "path": "/api/auth/login", "auth": "none", "summary": "Trade an email and password for an access and a refresh token"}, {"group": "auth", "method": "POST", "path": "/api/auth/refresh", "auth": "refresh-token", "summary": "Trade a refresh token for a new pair"}, {"group": "auth", "method": "POST", "path": "/api/auth/logout", "auth": "refresh-token", "summary": "End the session the refresh token belongs to"}, {"group": "auth", "method": "POST", "path": "/api/auth/change-password", "auth": "bearer", "summary": "Change the caller's password"}, {"group": "auth", "method": "GET", "path": "/api/auth/me", "auth": "bearer", "summary": "Who the access token belongs to"}, {"group": "auth", "method": "GET", "path": "/api/auth/sessions", "auth": "bearer", "summary": "The caller's signed-in sessions"}, {"group": "auth", "method": "DELETE", "path": "/api/auth/sessions", "auth": "bearer", "summary": "Sign out every session but this one"}, {"group": "auth", "method": "DELETE", "path": "/api/auth/sessions/:id", "auth": "bearer", "summary": "Sign out one session"}, {"group": "files", "method": "POST", "path": "/api/attachments", "auth": "bearer", "summary": "Upload a chat attachment"}, {"group": "files", "method": "POST", "path": "/api/attachments/upload-url", "auth": "bearer", "summary": "Ask for a URL to upload an attachment straight to object storage"}, {"group": "files", "method": "POST", "path": "/api/attachments/confirm", "auth": "bearer", "summary": "Confirm a direct upload once the bytes have landed"}, {"group": "files", "method": "GET", "path": "/api/attachments/:id", "auth": "bearer", "summary": "What an attachment is, without its bytes"}, {"group": "files", "method": "GET", "path": "/cdn/:id", "auth": "bearer-or-token", "summary": "An attachment's bytes, for a member of its conversation"}, {"group": "files", "method": "GET", "path": "/cdn/:kind/:id", "auth": "bearer-or-token", "summary": "An attachment's bytes by its object key"}, {"group": "files", "method": "GET", "path": "/img/:id", "auth": "none", "summary": "A thumbnail of an image or video attachment"}, {"group": "files", "method": "GET", "path": "/img/:kind/:id", "auth": "none", "summary": "A thumbnail by object key"}, {"group": "files", "method": "POST", "path": "/api/avatars", "auth": "bearer", "summary": "Upload the caller's avatar"}, {"group": "files", "method": "GET", "path": "/avatars/:name", "auth": "none", "summary": "An avatar image"}, {"group": "feed", "method": "POST", "path": "/api/post-attachments", "auth": "bearer", "summary": "Upload media for a feed post"}, {"group": "feed", "method": "DELETE", "path": "/api/post-attachments", "auth": "bearer", "summary": "Discard feed media no post has claimed"}, {"group": "feed", "method": "GET", "path": "/cdn-public/:id", "auth": "none", "summary": "Feed media, which is public"}, {"group": "feed", "method": "GET", "path": "/cdn-public/:kind/:id", "auth": "none", "summary": "Feed media by object key"}, {"group": "push", "method": "GET", "path": "/api/push/devices", "auth": "bearer", "summary": "The caller's devices registered for push"}, {"group": "push", "method": "DELETE", "path": "/api/push/devices/:id", "auth": "bearer", "summary": "Stop pushing to one device"}, {"group": "push", "method": "POST", "path": "/api/push/register-device", "auth": "bearer", "summary": "Register a device token for Firebase push"}, {"group": "billing", "method": "POST", "path": "/api/billing/checkout", "auth": "bearer", "summary": "Start a Stripe checkout for a plan"}, {"group": "billing", "method": "POST", "path": "/api/billing/portal", "auth": "bearer", "summary": "Open the Stripe customer portal"}, {"group": "billing", "method": "POST", "path": "/api/billing/webhook", "auth": "stripe-signature", "summary": "Stripe's notifications about subscriptions"}, {"group": "billing", "method": "POST", "path": "/api/stripe/checkout", "auth": "bearer", "summary": "Older path for /api/billing/checkout"}, {"group": "billing", "method": "POST", "path": "/api/stripe/portal", "auth": "bearer", "summary": "Older path for /api/billing/portal"}, {"group": "billing", "method": "POST", "path": "/api/stripe/webhook", "auth": "stripe-signature", "summary": "Older path for /api/billing/webhook"}, {"group": "service", "method": "POST", "path": "/api/service/bots/send", "auth": "bot-token", "summary": "Send a text from the calling bot to the person registered with a phone number"}, {"group": "service", "method": "POST", "path": "/api/service/bots/lookup", "auth": "bot-token", "summary": "Whether the calling bot can reach a phone number"}, {"group": "meta", "method": "GET", "path": "/api", "auth": "none", "summary": "This document: what the service is and every route it serves"}, {"group": "meta", "method": "GET", "path": "/healthz", "auth": "none", "summary": "Whether the process is up; used by the container probe"}, {"group": "meta", "method": "GET", "path": "/api/version", "auth": "none", "summary": "The running build, for clients to notice a new deploy"}, {"group": "meta", "method": "GET", "path": "/api/config", "auth": "none", "summary": "What this instance is and which optional features it has"}, {"group": "meta", "method": "GET", "path": "/api/methods", "auth": "none", "summary": "Every RPC method the realtime socket answers"}, {"group": "meta", "method": "GET", "path": "/api/swagger.json", "auth": "none", "summary": "OpenAPI description of the REST surface"}, {"group": "meta", "method": "GET", "path": "/robots.txt", "auth": "none", "summary": "Crawler rules"}, {"group": "meta", "method": "GET", "path": "/sitemap.xml", "auth": "none", "summary": "Sitemap"}, {"group": "realtime", "method": "GET", "path": "/ws", "auth": "bearer", "summary": "The bschat/3 WebSocket: every RPC after login and every live event (served by the realtime listener)"}]}