{"service": "bsdoor-api", "name": "BSDoor", "description": "The BSafe Group application store: catalogue, reviews, libraries, the developer portal, editorial and the status board", "base_url": "https://door-api.bsafegroup.be", "client": "https://door.bsafegroup.be", "api": "/", "health": "/health", "endpoint_count": 94, "endpoints": [{"group": "meta", "method": "GET", "path": "/", "auth": "none", "summary": "This document: what the service is and every route it serves"}, {"group": "meta", "method": "GET", "path": "/health", "auth": "none", "summary": "Liveness. Answers without touching the database"}, {"group": "meta", "method": "GET", "path": "/health/ready", "auth": "none", "summary": "Readiness. Opens a database connection and gives it straight back"}, {"group": "catalog", "method": "GET", "path": "/categories", "auth": "none", "summary": "Every category, with how many applications each holds"}, {"group": "catalog", "method": "GET", "path": "/categories/:id", "auth": "none", "summary": "One category and its applications"}, {"group": "catalog", "method": "GET", "path": "/collections", "auth": "none", "summary": "Editorial collections, newest first"}, {"group": "catalog", "method": "GET", "path": "/collections/slugs", "auth": "none", "summary": "Just the slugs, for building static pages"}, {"group": "catalog", "method": "GET", "path": "/collections/:slug", "auth": "none", "summary": "One collection and what it says about itself"}, {"group": "catalog", "method": "GET", "path": "/collections/:slug/apps", "auth": "none", "summary": "The applications gathered in one collection"}, {"group": "catalog", "method": "GET", "path": "/publishers", "auth": "none", "summary": "Every publisher with an accepted profile"}, {"group": "catalog", "method": "GET", "path": "/publishers/:id", "auth": "none", "summary": "One publisher"}, {"group": "catalog", "method": "GET", "path": "/publishers/:id/apps", "auth": "none", "summary": "Everything one publisher has published"}, {"group": "catalog", "method": "GET", "path": "/apps", "auth": "none", "summary": "Search and browse the catalogue. Takes q, category, platform, sort, page"}, {"group": "catalog", "method": "GET", "path": "/apps/featured", "auth": "none", "summary": "The applications the editors are putting forward"}, {"group": "catalog", "method": "GET", "path": "/apps/slugs", "auth": "none", "summary": "Just the slugs, for building static pages"}, {"group": "catalog", "method": "GET", "path": "/apps/:slug", "auth": "none", "summary": "One listing in full: text, builds, screenshots, releases, rating"}, {"group": "catalog", "method": "GET", "path": "/apps/:slug/related", "auth": "none", "summary": "Applications a reader of this one tends to want next"}, {"group": "catalog", "method": "GET", "path": "/apps/:slug/download", "auth": "none", "summary": "Resolve the download for a device: its build, the minimum it needs, and whether the sent version meets it"}, {"group": "catalog", "method": "GET", "path": "/meta/updated", "auth": "none", "summary": "When the catalogue last changed, for cache and sitemap dates"}, {"group": "reviews", "method": "GET", "path": "/apps/:slug/reviews", "auth": "none", "summary": "Published reviews for one application"}, {"group": "reviews", "method": "GET", "path": "/apps/:slug/reviews/mine", "auth": "bearer", "summary": "The review this account left, if there is one"}, {"group": "reviews", "method": "GET", "path": "/apps/:slug/ratings", "auth": "none", "summary": "The one to five star breakdown behind the average"}, {"group": "reviews", "method": "POST", "path": "/apps/:slug/reviews", "auth": "bearer", "summary": "Write or replace this account's review"}, {"group": "reviews", "method": "DELETE", "path": "/reviews/:id", "auth": "bearer", "summary": "Withdraw a review this account wrote"}, {"group": "reviews", "method": "POST", "path": "/reviews/:id/helpful", "auth": "bearer", "summary": "Mark somebody else's review as helpful"}, {"group": "reviews", "method": "DELETE", "path": "/reviews/:id/helpful", "auth": "bearer", "summary": "Take that mark back"}, {"group": "library", "method": "GET", "path": "/apps/:slug/installs", "auth": "bearer", "summary": "Whether this account has this application"}, {"group": "library", "method": "POST", "path": "/apps/:slug/installs", "auth": "bearer", "summary": "Add it to this account's library"}, {"group": "library", "method": "DELETE", "path": "/apps/:slug/installs", "auth": "bearer", "summary": "Remove it again"}, {"group": "library", "method": "GET", "path": "/me/library", "auth": "bearer", "summary": "Everything this account has installed"}, {"group": "subscriptions", "method": "POST", "path": "/apps/:slug/subscriptions", "auth": "none", "summary": "Ask to be told by email when this application is updated"}, {"group": "subscriptions", "method": "DELETE", "path": "/apps/:slug/subscriptions", "auth": "none", "summary": "Stop being told"}, {"group": "company", "method": "GET", "path": "/company", "auth": "none", "summary": "Who BSafe Group is: profile, offices, milestones, addresses"}, {"group": "company", "method": "GET", "path": "/careers", "auth": "none", "summary": "Open roles. Add all=1 as an editor to see the unadvertised ones too"}, {"group": "company", "method": "GET", "path": "/contact/channels", "auth": "none", "summary": "The ways to reach the company, and what each is for"}, {"group": "editorial", "method": "PATCH", "path": "/editorial/company", "auth": "bearer (admin)", "summary": "Amend the company profile"}, {"group": "editorial", "method": "PUT", "path": "/editorial/company/emails/:purpose", "auth": "bearer (admin)", "summary": "Set the address behind one purpose"}, {"group": "editorial", "method": "PUT", "path": "/editorial/offices/:id", "auth": "bearer (admin)", "summary": "Add or replace an office"}, {"group": "editorial", "method": "PUT", "path": "/editorial/offices/:id/text/:locale", "auth": "bearer (reviewer)", "summary": "An office in one language"}, {"group": "editorial", "method": "DELETE", "path": "/editorial/offices/:id", "auth": "bearer (admin)", "summary": "Remove an office"}, {"group": "editorial", "method": "PUT", "path": "/editorial/milestones/:id", "auth": "bearer (admin)", "summary": "Add or replace a milestone"}, {"group": "editorial", "method": "PUT", "path": "/editorial/milestones/:id/text/:locale", "auth": "bearer (reviewer)", "summary": "A milestone in one language"}, {"group": "editorial", "method": "DELETE", "path": "/editorial/milestones/:id", "auth": "bearer (admin)", "summary": "Remove a milestone"}, {"group": "editorial", "method": "PUT", "path": "/editorial/careers/:id", "auth": "bearer (admin)", "summary": "Add or replace a role"}, {"group": "editorial", "method": "PUT", "path": "/editorial/careers/:id/text/:locale", "auth": "bearer (reviewer)", "summary": "A role in one language"}, {"group": "editorial", "method": "POST", "path": "/editorial/careers/:id/open", "auth": "bearer (admin)", "summary": "Advertise a role or take it down"}, {"group": "editorial", "method": "PUT", "path": "/editorial/contact/channels/:id", "auth": "bearer (admin)", "summary": "Add or replace a contact channel"}, {"group": "editorial", "method": "PUT", "path": "/editorial/contact/channels/:id/text/:locale", "auth": "bearer (reviewer)", "summary": "A channel in one language"}, {"group": "editorial", "method": "DELETE", "path": "/editorial/contact/channels/:id", "auth": "bearer (admin)", "summary": "Remove a contact channel"}, {"group": "helpdesk", "method": "POST", "path": "/contact", "auth": "none", "summary": "Send the company a message"}, {"group": "helpdesk", "method": "GET", "path": "/review/messages", "auth": "bearer (reviewer)", "summary": "Messages waiting to be answered"}, {"group": "helpdesk", "method": "POST", "path": "/review/messages/:id/handled", "auth": "bearer (reviewer)", "summary": "Mark one message as dealt with"}, {"group": "status", "method": "GET", "path": "/status", "auth": "none", "summary": "The status board: every service, its state and any live incident"}, {"group": "status", "method": "PUT", "path": "/status/services/:id", "auth": "bearer (reviewer)", "summary": "Add or replace a service on the board"}, {"group": "status", "method": "DELETE", "path": "/status/services/:id", "auth": "bearer (reviewer)", "summary": "Take a service off the board"}, {"group": "status", "method": "POST", "path": "/status/services/:id/state", "auth": "bearer (reviewer)", "summary": "Record what a service is doing right now"}, {"group": "status", "method": "PUT", "path": "/status/incidents/:id", "auth": "bearer (reviewer)", "summary": "Open or amend an incident"}, {"group": "status", "method": "PUT", "path": "/status/incidents/:id/text/:locale", "auth": "bearer (reviewer)", "summary": "The incident in one language"}, {"group": "status", "method": "POST", "path": "/status/incidents/:id/resolve", "auth": "bearer (reviewer)", "summary": "Close an incident"}, {"group": "auth", "method": "POST", "path": "/auth/register", "auth": "none", "summary": "Open an account"}, {"group": "auth", "method": "POST", "path": "/auth/login", "auth": "none", "summary": "Sign in with an email and a password"}, {"group": "auth", "method": "POST", "path": "/auth/refresh", "auth": "refresh token", "summary": "Mint a new access token from the refresh cookie"}, {"group": "auth", "method": "POST", "path": "/auth/password", "auth": "bearer", "summary": "Change this account's password"}, {"group": "auth", "method": "GET", "path": "/auth/me", "auth": "bearer", "summary": "Who this token belongs to"}, {"group": "portal", "method": "GET", "path": "/portal/profile", "auth": "bearer", "summary": "This account's publisher profile, and how far along it is"}, {"group": "portal", "method": "PUT", "path": "/portal/profile", "auth": "bearer", "summary": "Create or amend the publisher profile"}, {"group": "portal", "method": "GET", "path": "/portal/submissions", "auth": "bearer", "summary": "Everything this publisher has submitted"}, {"group": "portal", "method": "POST", "path": "/portal/submissions", "auth": "bearer", "summary": "Start a new submission"}, {"group": "portal", "method": "GET", "path": "/portal/submissions/:id", "auth": "bearer", "summary": "One submission in full"}, {"group": "portal", "method": "PATCH", "path": "/portal/submissions/:id", "auth": "bearer", "summary": "Amend a draft submission"}, {"group": "portal", "method": "PUT", "path": "/portal/submissions/:id/builds", "auth": "bearer", "summary": "Replace the builds on a draft"}, {"group": "portal", "method": "PUT", "path": "/portal/submissions/:id/screenshots", "auth": "bearer", "summary": "Replace the screenshots on a draft"}, {"group": "portal", "method": "POST", "path": "/portal/submissions/:id/submit", "auth": "bearer", "summary": "Hand a draft to the reviewers"}, {"group": "portal", "method": "DELETE", "path": "/portal/submissions/:id", "auth": "bearer", "summary": "Discard a draft"}, {"group": "moderation", "method": "GET", "path": "/review/overview", "auth": "bearer (reviewer)", "summary": "The review queues at a glance, with their counts"}, {"group": "moderation", "method": "GET", "path": "/review/submissions", "auth": "bearer (reviewer)", "summary": "Submissions waiting on a decision"}, {"group": "moderation", "method": "GET", "path": "/review/submissions/:id", "auth": "bearer (reviewer)", "summary": "One submission under review, in full"}, {"group": "moderation", "method": "POST", "path": "/review/submissions/:id/decision", "auth": "bearer (reviewer)", "summary": "Accept or refuse a submission"}, {"group": "moderation", "method": "GET", "path": "/review/profiles", "auth": "bearer (reviewer)", "summary": "Publisher profiles waiting on a decision"}, {"group": "moderation", "method": "POST", "path": "/review/profiles/:id/decision", "auth": "bearer (reviewer)", "summary": "Accept or refuse a publisher"}, {"group": "moderation", "method": "GET", "path": "/review/reviews", "auth": "bearer (reviewer)", "summary": "Reported reviews waiting on a decision"}, {"group": "moderation", "method": "POST", "path": "/review/reviews/:id/moderation", "auth": "bearer (reviewer)", "summary": "Keep or hide a review"}, {"group": "moderation", "method": "GET", "path": "/review/accounts", "auth": "bearer (admin)", "summary": "Accounts, for changing what they may do"}, {"group": "moderation", "method": "POST", "path": "/review/accounts/:id/role", "auth": "bearer (admin)", "summary": "Set an account's role"}, {"group": "editorial", "method": "PUT", "path": "/editorial/apps/:slug/text/:locale", "auth": "bearer (reviewer)", "summary": "One listing in one language"}, {"group": "editorial", "method": "PATCH", "path": "/editorial/apps/:slug", "auth": "bearer (reviewer)", "summary": "Amend a listing: category, badge, pricing, visibility"}, {"group": "editorial", "method": "PATCH", "path": "/editorial/publishers/:id", "auth": "bearer (admin)", "summary": "Amend a publisher record"}, {"group": "editorial", "method": "PUT", "path": "/editorial/categories/:id", "auth": "bearer (admin)", "summary": "Add or replace a category"}, {"group": "editorial", "method": "PUT", "path": "/editorial/categories/:id/text/:locale", "auth": "bearer (reviewer)", "summary": "A category in one language"}, {"group": "editorial", "method": "DELETE", "path": "/editorial/categories/:id", "auth": "bearer (admin)", "summary": "Remove a category"}, {"group": "editorial", "method": "PUT", "path": "/editorial/collections/:slug", "auth": "bearer (admin)", "summary": "Add or replace a collection"}, {"group": "editorial", "method": "PUT", "path": "/editorial/collections/:slug/text/:locale", "auth": "bearer (reviewer)", "summary": "A collection in one language"}, {"group": "editorial", "method": "PUT", "path": "/editorial/collections/:slug/apps", "auth": "bearer (admin)", "summary": "Set which applications a collection holds"}, {"group": "editorial", "method": "DELETE", "path": "/editorial/collections/:slug", "auth": "bearer (admin)", "summary": "Remove a collection"}]}