{"openapi": "3.1.0", "info": {"title": "Launch Trophies API", "version": "1.0.0", "description": "The Launch Trophies API: read every public listing, category, launch and leaderboard; submit your product by URL and edit the AI draft; manage your listings; build orders that end in a checkout link you pay yourself. There is no voting through the API: votes come only from people on the site. Docs: https://launchtrophies.com/developers", "contact": {"name": "Launch Trophies developers", "url": "https://launchtrophies.com/developers", "email": "launch@zinndigital.com"}, "termsOfService": "https://launchtrophies.com/developers/terms"}, "servers": [{"url": "https://launchtrophies.com/api/v1"}], "tags": [{"name": "Site", "description": "Who this site is and what it offers"}, {"name": "Listings", "description": "Search and read live listings"}, {"name": "Categories", "description": "Categories and subcategories"}, {"name": "Launches", "description": "The launch calendar"}, {"name": "Leaderboards", "description": "Community votes, the paid billboard and Domain Rating boards (separate systems)"}, {"name": "People", "description": "Founders and their stories"}, {"name": "Content", "description": "Blog posts and guides"}, {"name": "Badges", "description": "Embeddable badges and awards"}, {"name": "Account", "description": "Your account (needs sign-in)"}, {"name": "Submit", "description": "Submit a product by URL and edit the AI draft (needs sign-in)"}, {"name": "My listings", "description": "Edit your live listings (needs sign-in)"}, {"name": "Claims", "description": "Claim and verify an existing listing (needs sign-in)"}, {"name": "Orders", "description": "Prices, VAT preview and secure checkout links (needs sign-in to build an order)"}, {"name": "Trophies", "description": "Trophy cabinets, awards and their verification, leaderboards, Hall of Fame, programmes to enter"}], "paths": {"/site": {"get": {"operationId": "get_site_info", "summary": "About this site and its API", "description": "Returns this site's name, what it is for, its public URLs, how many live listings and categories it has, and where the API docs, OpenAPI file and MCP server are. Call this first to orient yourself.", "tags": ["Site"], "x-mcp-tool": "get_site_info", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}}, "security": [{}, {"oauth2": []}, {"apiKey": []}]}}, "/categories": {"get": {"operationId": "list_categories", "summary": "List categories and subcategories", "description": "The full category tree with live listing counts per category on this site. Every listing has one primary category (and paid listings up to 3 more). Use a slug in search_listings(category=...).", "tags": ["Categories"], "x-mcp-tool": "list_categories", "parameters": [{"name": "include_empty", "in": "query", "required": false, "schema": {"type": "boolean", "description": "Include categories with no live listings yet", "default": true}, "description": "Include categories with no live listings yet"}], "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}}, "security": [{}, {"oauth2": []}, {"apiKey": []}]}}, "/categories/{slug}": {"get": {"operationId": "get_category", "summary": "Get a category with its top listings", "description": "One category: description, FAQs, parent, subcategories and its live listings (most voted first).", "tags": ["Categories"], "x-mcp-tool": "get_category", "parameters": [{"name": "slug", "in": "path", "required": true, "schema": {"type": "string", "pattern": "^[a-z0-9][a-z0-9-]{0,219}$", "description": "Category slug"}}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "maximum": 1000, "default": 1, "description": "Page number (1-based)"}, "description": "Page number (1-based)"}, {"name": "per_page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "maximum": 100, "default": 20, "description": "Items per page"}, "description": "Items per page"}], "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}, "404": {"$ref": "#/components/responses/Error"}}, "security": [{}, {"oauth2": []}, {"apiKey": []}]}}, "/founders": {"get": {"operationId": "list_founders", "summary": "Find founders", "description": "Founders behind this site's live listings, optionally matched by name or filtered by country.", "tags": ["People"], "x-mcp-tool": "list_founders", "parameters": [{"name": "q", "in": "query", "required": false, "schema": {"type": "string", "description": "Name to look for", "maxLength": 120}, "description": "Name to look for"}, {"name": "country", "in": "query", "required": false, "schema": {"type": "string", "description": "ISO two-letter country code", "pattern": "^[A-Za-z]{2}$"}, "description": "ISO two-letter country code"}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "maximum": 1000, "default": 1, "description": "Page number (1-based)"}, "description": "Page number (1-based)"}, {"name": "per_page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "maximum": 100, "default": 20, "description": "Items per page"}, "description": "Items per page"}], "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}}, "security": [{}, {"oauth2": []}, {"apiKey": []}]}}, "/founders/{slug}": {"get": {"operationId": "get_founder", "summary": "Get a founder with companies and stories", "description": "A founder's public profile: bio, socials, their companies listed here and their published stories.", "tags": ["People"], "x-mcp-tool": "get_founder", "parameters": [{"name": "slug", "in": "path", "required": true, "schema": {"type": "string", "pattern": "^[a-z0-9][a-z0-9-]{0,219}$", "description": "Founder slug"}}], "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}, "404": {"$ref": "#/components/responses/Error"}}, "security": [{}, {"oauth2": []}, {"apiKey": []}]}}, "/blog": {"get": {"operationId": "list_blog_posts", "summary": "List or search blog posts", "description": "This site's published guides and articles, newest first, or matched by `q`.", "tags": ["Content"], "x-mcp-tool": "list_blog_posts", "parameters": [{"name": "q", "in": "query", "required": false, "schema": {"type": "string", "description": "Search words", "maxLength": 200}, "description": "Search words"}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "maximum": 1000, "default": 1, "description": "Page number (1-based)"}, "description": "Page number (1-based)"}, {"name": "per_page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "maximum": 100, "default": 20, "description": "Items per page"}, "description": "Items per page"}], "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}}, "security": [{}, {"oauth2": []}, {"apiKey": []}]}}, "/blog/{slug}": {"get": {"operationId": "get_blog_post", "summary": "Read a blog post", "description": "One published post with its full text (Markdown) and FAQs.", "tags": ["Content"], "x-mcp-tool": "get_blog_post", "parameters": [{"name": "slug", "in": "path", "required": true, "schema": {"type": "string", "pattern": "^[a-z0-9][a-z0-9-]{0,219}$", "description": "Post slug"}}], "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}, "404": {"$ref": "#/components/responses/Error"}}, "security": [{}, {"oauth2": []}, {"apiKey": []}]}}, "/me": {"get": {"operationId": "get_account", "summary": "Your account", "description": "Who you are signed in as on this site, and what your access allows.", "tags": ["Account"], "x-mcp-tool": "get_account", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}, "401": {"$ref": "#/components/responses/Error"}, "403": {"$ref": "#/components/responses/Error"}}, "security": [{"oauth2": ["account:read"]}, {"apiKey": []}], "x-required-scopes": ["account:read"]}}, "/orders/quote": {"post": {"operationId": "quote_order", "summary": "Price an order (with VAT preview)", "description": "Prices a list of products for your listings using the site's current admin prices and validates every option (weeks, categories, billboard minimum). Nothing is saved or charged.", "tags": ["Orders"], "x-mcp-tool": "quote_order", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"items": {"type": "array", "description": "What to buy", "items": {"type": "object", "properties": {"product": {"type": "string", "description": "Product code from list_products, e.g. launch, skip_queue, featured, done_for_you (we list you on other high-value launch sites for you), launch_bundle, extra_categories, relaunch, ai_review, billboard_min", "maxLength": 60}, "listing_id": {"type": "integer", "description": "Your listing id (needed for products with needs_listing=true)", "minimum": 1}, "week": {"type": "string", "description": "Launch week Monday YYYY-MM-DD, one of the weeks list_products shows. launch: optional and free (omit to go live now). skip_queue: required; for FREE listings only, it replaces the free-queue week (a paid launch chooses its week on the launch product at no extra cost). relaunch: required", "maxLength": 10}, "amount_cents": {"type": "integer", "description": "billboard_min only: amount you choose, at least the minimum", "minimum": 1, "maximum": 100000000}, "categories": {"type": "array", "description": "extra_categories only: up to 3 extra category slugs", "items": {"type": "string"}, "maxItems": 10}, "options": {"type": "object", "description": "Products whose list_products entry has 'options' (e.g. trophy cabinet products): the options it describes", "additionalProperties": true, "maxProperties": 20}}, "required": ["product"], "additionalProperties": false}, "minItems": 1, "maxItems": 20}, "billing_country": {"type": "string", "description": "ISO country code for the VAT preview, e.g. GB, DE, US", "pattern": "^[A-Za-z]{2}$"}, "vat_number": {"type": "string", "description": "VAT number for the VAT preview (EU businesses: reverse charge when valid)", "maxLength": 32}}, "required": ["items"], "additionalProperties": false}}}}, "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}, "401": {"$ref": "#/components/responses/Error"}, "403": {"$ref": "#/components/responses/Error"}}, "security": [{"oauth2": ["orders:write"]}, {"apiKey": []}], "x-required-scopes": ["orders:write"]}}, "/orders/checkout": {"post": {"operationId": "create_checkout", "summary": "Get a secure checkout link", "description": "Builds an order and returns `checkout_url`: a secure page on this site where the person reviews the order, enters billing details and pays THEMSELVES (card, Apple/Google Pay, PayPal or crypto). Give the link to the user; never ask them for card details. After payment, get_order shows the status. Send an Idempotency-Key header to make retries safe.", "tags": ["Orders"], "x-mcp-tool": "create_checkout", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"items": {"type": "array", "description": "What to buy", "items": {"type": "object", "properties": {"product": {"type": "string", "description": "Product code from list_products, e.g. launch, skip_queue, featured, done_for_you (we list you on other high-value launch sites for you), launch_bundle, extra_categories, relaunch, ai_review, billboard_min", "maxLength": 60}, "listing_id": {"type": "integer", "description": "Your listing id (needed for products with needs_listing=true)", "minimum": 1}, "week": {"type": "string", "description": "Launch week Monday YYYY-MM-DD, one of the weeks list_products shows. launch: optional and free (omit to go live now). skip_queue: required; for FREE listings only, it replaces the free-queue week (a paid launch chooses its week on the launch product at no extra cost). relaunch: required", "maxLength": 10}, "amount_cents": {"type": "integer", "description": "billboard_min only: amount you choose, at least the minimum", "minimum": 1, "maximum": 100000000}, "categories": {"type": "array", "description": "extra_categories only: up to 3 extra category slugs", "items": {"type": "string"}, "maxItems": 10}, "options": {"type": "object", "description": "Products whose list_products entry has 'options' (e.g. trophy cabinet products): the options it describes", "additionalProperties": true, "maxProperties": 20}}, "required": ["product"], "additionalProperties": false}, "minItems": 1, "maxItems": 20}, "billing_country": {"type": "string", "description": "ISO country code for the VAT preview, e.g. GB, DE, US", "pattern": "^[A-Za-z]{2}$"}, "vat_number": {"type": "string", "description": "VAT number for the VAT preview (EU businesses: reverse charge when valid)", "maxLength": 32}}, "required": ["items"], "additionalProperties": false}}}}, "responses": {"201": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}, "401": {"$ref": "#/components/responses/Error"}, "403": {"$ref": "#/components/responses/Error"}}, "security": [{"oauth2": ["orders:write"]}, {"apiKey": []}], "x-required-scopes": ["orders:write"], "parameters": [{"$ref": "#/components/parameters/IdempotencyKey"}]}}, "/orders": {"get": {"operationId": "list_my_orders", "summary": "Your orders", "description": "Your orders on this site, newest first, with status (pending, paid, ...).", "tags": ["Orders"], "x-mcp-tool": "list_my_orders", "parameters": [{"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "maximum": 1000, "default": 1, "description": "Page number (1-based)"}, "description": "Page number (1-based)"}, {"name": "per_page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "maximum": 100, "default": 20, "description": "Items per page"}, "description": "Items per page"}], "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}, "401": {"$ref": "#/components/responses/Error"}, "403": {"$ref": "#/components/responses/Error"}}, "security": [{"oauth2": ["account:read"]}, {"apiKey": []}], "x-required-scopes": ["account:read"]}}, "/orders/{number}": {"get": {"operationId": "get_order", "summary": "One order and its status", "description": "An order's status, totals with VAT, lines and whether each was fulfilled.", "tags": ["Orders"], "x-mcp-tool": "get_order", "parameters": [{"name": "number", "in": "path", "required": true, "schema": {"type": "string", "description": "Order number", "maxLength": 32}}], "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}, "401": {"$ref": "#/components/responses/Error"}, "403": {"$ref": "#/components/responses/Error"}, "404": {"$ref": "#/components/responses/Error"}}, "security": [{"oauth2": ["account:read"]}, {"apiKey": []}], "x-required-scopes": ["account:read"]}}, "/products": {"get": {"operationId": "list_products", "summary": "Products and prices", "description": "Everything you can buy on this site with its current price in USD cents (set by the site's admin; never hardcode prices). `needs_listing` products are bought for one of your listings. Prices exclude VAT; use quote_order for VAT.", "tags": ["Orders"], "x-mcp-tool": "list_products", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}}, "security": [{}, {"oauth2": []}, {"apiKey": []}]}}, "/trophies/cabinets": {"get": {"operationId": "list_trophy_cabinets", "summary": "Search trophy cabinets", "description": "Trophy cabinets (one per product) ranked by award points, optionally filtered by a search term, category slug or country. Points come from awards only; nothing paid adds a point.", "tags": ["Trophies"], "x-mcp-tool": "list_trophy_cabinets", "parameters": [{"name": "q", "in": "query", "required": false, "schema": {"type": "string", "description": "Search company name", "maxLength": 100}, "description": "Search company name"}, {"name": "category", "in": "query", "required": false, "schema": {"type": "string", "description": "Top-level category slug", "maxLength": 140}, "description": "Top-level category slug"}, {"name": "country", "in": "query", "required": false, "schema": {"type": "string", "description": "ISO country code", "pattern": "^[A-Za-z]{2}$"}, "description": "ISO country code"}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "maximum": 1000, "default": 1, "description": "Page number (1-based)"}, "description": "Page number (1-based)"}, {"name": "per_page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "maximum": 100, "default": 20, "description": "Items per page"}, "description": "Items per page"}], "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}}, "security": [{}, {"oauth2": []}, {"apiKey": []}]}}, "/trophies/cabinets/{slug}": {"get": {"operationId": "get_trophy_cabinet", "summary": "One trophy cabinet", "description": "Every published award in a cabinet with its issuer, year, placing and verification level (verified = the company is named on the issuer's own page; evidence = a page is linked but does not name it independently; self = no readable page). Pages are re-checked weekly.", "tags": ["Trophies"], "x-mcp-tool": "get_trophy_cabinet", "parameters": [{"name": "slug", "in": "path", "required": true, "schema": {"type": "string", "description": "Cabinet slug", "maxLength": 220, "pattern": "^[a-z0-9-]+$"}}], "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}, "404": {"$ref": "#/components/responses/Error"}}, "security": [{}, {"oauth2": []}, {"apiKey": []}]}}, "/trophies/leaderboards": {"get": {"operationId": "trophy_leaderboard", "summary": "Trophy leaderboard", "description": "Cabinets ranked by award points for the week, month, year or all time, optionally by category or country. Also see Hall of Fame. Paid placements never add points.", "tags": ["Trophies"], "x-mcp-tool": "trophy_leaderboard", "parameters": [{"name": "period", "in": "query", "required": false, "schema": {"type": "string", "description": "week, month, year or all", "enum": ["week", "month", "year", "all"]}, "description": "week, month, year or all"}, {"name": "category", "in": "query", "required": false, "schema": {"type": "string", "description": "Top-level category slug", "maxLength": 140}, "description": "Top-level category slug"}, {"name": "country", "in": "query", "required": false, "schema": {"type": "string", "description": "ISO country code", "pattern": "^[A-Za-z]{2}$"}, "description": "ISO country code"}], "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}}, "security": [{}, {"oauth2": []}, {"apiKey": []}]}}, "/trophies/hall-of-fame/{year}": {"get": {"operationId": "hall_of_fame", "summary": "Hall of Fame for a year", "description": "The year's inductees (most award points that year). final=false while the year is still running.", "tags": ["Trophies"], "x-mcp-tool": "hall_of_fame", "parameters": [{"name": "year", "in": "path", "required": true, "schema": {"type": "integer", "description": "Year", "minimum": 2025, "maximum": 2100}}], "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}, "404": {"$ref": "#/components/responses/Error"}}, "security": [{}, {"oauth2": []}, {"apiKey": []}]}}, "/trophies/programmes": {"get": {"operationId": "list_award_programmes", "summary": "Award programmes", "description": "Award programmes in the directory. open=true gives the 'awards you can enter' calendar: programmes whose entry deadline has not passed, soonest first. listed_by_organiser marks paid organiser listings.", "tags": ["Trophies"], "x-mcp-tool": "list_award_programmes", "parameters": [{"name": "open", "in": "query", "required": false, "schema": {"type": "boolean", "description": "Only programmes still open for entries"}, "description": "Only programmes still open for entries"}, {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "maximum": 1000, "default": 1, "description": "Page number (1-based)"}, "description": "Page number (1-based)"}, {"name": "per_page", "in": "query", "required": false, "schema": {"type": "integer", "minimum": 1, "maximum": 100, "default": 20, "description": "Items per page"}, "description": "Items per page"}], "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}}, "security": [{}, {"oauth2": []}, {"apiKey": []}]}}, "/trophies/my-cabinets": {"get": {"operationId": "my_trophy_cabinets", "summary": "Your trophy cabinets", "description": "The cabinets of the companies you own, with every award (any status) and its verification level.", "tags": ["Trophies"], "x-mcp-tool": "my_trophy_cabinets", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}, "401": {"$ref": "#/components/responses/Error"}, "403": {"$ref": "#/components/responses/Error"}}, "security": [{"oauth2": ["account:read"]}, {"apiKey": []}], "x-required-scopes": ["account:read"]}}, "/trophies/cabinets/{slug}/awards": {"post": {"operationId": "add_external_award", "summary": "Add an award you won elsewhere (by URL)", "description": "Adds an external award to your cabinet from the organiser's page. We read the page (robots.txt respected), keep only facts written on it, and set the verification level; the award appears in a minute or two (poll get_trophy_cabinet or my_trophy_cabinets). Free cabinets hold a limited number of external awards; Pro is unlimited.", "tags": ["Trophies"], "x-mcp-tool": "add_external_award", "parameters": [{"name": "slug", "in": "path", "required": true, "schema": {"type": "string", "description": "Cabinet slug", "maxLength": 220, "pattern": "^[a-z0-9-]+$"}}, {"$ref": "#/components/parameters/IdempotencyKey"}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"url": {"type": "string", "description": "Address of the award page naming your company", "maxLength": 1000}, "title": {"type": "string", "description": "Award name (optional; read from the page otherwise)", "maxLength": 200}}, "required": ["url"], "additionalProperties": false}}}}, "responses": {"201": {"description": "Success", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"$ref": "#/components/responses/Error"}, "429": {"$ref": "#/components/responses/RateLimited"}, "401": {"$ref": "#/components/responses/Error"}, "403": {"$ref": "#/components/responses/Error"}, "404": {"$ref": "#/components/responses/Error"}}, "security": [{"oauth2": ["listings:write"]}, {"apiKey": []}], "x-required-scopes": ["listings:write"]}}}, "components": {"securitySchemes": {"oauth2": {"type": "oauth2", "description": "OAuth 2.1 authorization code + PKCE (S256). Dynamic client registration and client ID metadata documents are supported.", "flows": {"authorizationCode": {"authorizationUrl": "https://launchtrophies.com/oauth/authorize", "tokenUrl": "https://launchtrophies.com/oauth/token", "refreshUrl": "https://launchtrophies.com/oauth/token", "scopes": {"read": "Read public data (listings, categories, launches, leaderboards, blog). Not needed for anonymous reads.", "account:read": "See your account, your listings, drafts and orders", "listings:write": "Submit new listings and edit your own drafts and listings", "orders:write": "Build orders for paid products and get a checkout link you pay yourself"}}}}, "apiKey": {"type": "http", "scheme": "bearer", "description": "Personal API key from https://launchtrophies.com/account/developers"}}, "parameters": {"IdempotencyKey": {"name": "Idempotency-Key", "in": "header", "required": false, "description": "Any unique string (e.g. a UUID). Retrying with the same key returns the first result instead of doing the work twice (24 h).", "schema": {"type": "string", "maxLength": 200}}}, "schemas": {"Error": {"type": "object", "required": ["error"], "properties": {"error": {"type": "object", "required": ["code", "message", "status"], "properties": {"code": {"type": "string", "enum": ["invalid_request", "unauthorized", "invalid_token", "insufficient_scope", "forbidden", "not_found", "conflict", "idempotency_mismatch", "rate_limited", "quota_exceeded", "api_disabled", "server_error"]}, "message": {"type": "string"}, "status": {"type": "integer"}, "request_id": {"type": "string"}, "details": {"type": "object"}}}}}}, "responses": {"Error": {"description": "Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "RateLimited": {"description": "Too many requests", "headers": {"Retry-After": {"schema": {"type": "integer"}, "description": "Seconds to wait"}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}}, "x-changelog": [{"version": "1.0.0", "date": "2026-10-02", "changes": "First public version: listings, categories, launches, leaderboards, founders, blog, badges and awards; submit by URL with AI drafts; edit drafts and listings; claims; orders with VAT preview and checkout links; OAuth 2.1 + API keys; MCP server."}]}