{"openapi":"3.1.0","info":{"title":"MakerRadar Public API","version":"1.0.0","summary":"Read-only access to MakerRadar's directory of launched products.","description":"MakerRadar is a weekly product launch platform and startup directory. Makers list apps, SaaS, developer tools, shops and services for free; the community ranks each week's launches by upvotes; and every listing gets a permanent, search-friendly page. Paid placements are always labelled and never change a rank.\n\nThis API is read-only and needs no key. Every response is JSON: `{ \"data\": … }` on success, `{ \"error\", \"message\", \"hint\", \"docs\" }` on failure.\nCalls are rate-limited per IP address; every response states the quota in `RateLimit-Policy`, and a refused call (429) carries `RateLimit` and `Retry-After`.\nA listing's name, tagline and description are its makers' own words, unverified by MakerRadar.\nAI agents can also use the MCP server at https://api.makerradar.io/mcp (Streamable HTTP, JSON-RPC 2.0).\n\nVersioning and deprecation (https://makerradar.io/developers#versioning):\n- The API is versioned in its path: every endpoint is under `/v1`.\n- Within a version, changes are additive only: new endpoints, new optional parameters and new response fields. Ignore fields you don't recognise, and treat an error code you don't know by its HTTP status.\n- A breaking change ships as a new version (`/v2`) beside the old one, never as a change to it.\n- An endpoint we plan to remove is marked `deprecated` in the OpenAPI document and answers with a `Deprecation` header (RFC 9745), a `Sunset` header with the date it stops working (RFC 8594) and a `Link` to this policy — at least 180 days before that date.\n- Nothing in `/v1` is deprecated today.","termsOfService":"https://makerradar.io/terms","contact":{"name":"MakerRadar developers","url":"https://makerradar.io/developers","email":"support@makerradar.io"}},"externalDocs":{"description":"Developer docs","url":"https://makerradar.io/developers"},"servers":[{"url":"https://api.makerradar.io/v1"}],"security":[],"tags":[{"name":"Products","description":"Listed products — the directory."},{"name":"Drafts","description":"Listing drafts an agent prepares for a person to submit."},{"name":"Account","description":"The account an agent token acts for. Needs `Authorization: Bearer mr_…`, a token the person approved."},{"name":"Billing","description":"Prices, and checkouts an agent starts for its person to pay. An agent never pays."},{"name":"Categories","description":"What the directory's products are grouped by."},{"name":"Launches","description":"The weekly launch boards."}],"paths":{"/products":{"get":{"operationId":"listProducts","tags":["Products"],"summary":"List listed products, newest first","description":"Returns the directory's products, most recently published first (listings not yet published come last). Each item links to its canonical page in `url`. Narrow it with `q` (keywords in the name or tagline), `category` (a slug from `GET /categories`), `platform`, `audience` and `useCase` (a term's slug, as on /platforms, /for and /use-cases — an unknown one is a 404 naming the valid ones), `country` (where it's based: a two-letter code or a country's slug) and `updatedSince` (only listings changed since then — to keep a copy in sync, pass the time of your last sync). Filters combine: a product must match all of them. `limit` sets the page size (default 50, at most 100). When more remain, `nextCursor` is set (and a `Link: rel=\"next\"` header points at the next page): pass it back as `cursor`, with the same filters, until it is null.","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"$ref":"#/components/parameters/Query"},{"$ref":"#/components/parameters/Category"},{"$ref":"#/components/parameters/Platform"},{"$ref":"#/components/parameters/Audience"},{"$ref":"#/components/parameters/UseCase"},{"$ref":"#/components/parameters/Country"},{"$ref":"#/components/parameters/UpdatedSince"}],"responses":{"200":{"description":"A page of products.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Link":{"description":"The next page, when there is one: `<url>; rel=\"next\"` (RFC 8288).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","nextCursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Product"}},"nextCursor":{"type":["string","null"],"description":"Pass as `cursor` for the next page; null on the last page."}}}}}},"400":{"description":"A parameter isn't valid; `message` says which and how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing is published by that name: no listed product, category or launch week.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/products/{slug}":{"get":{"operationId":"getProduct","tags":["Products"],"summary":"Get one product by slug","description":"Returns the public details of one listed product: its description, pricing model, upvotes, rating totals and canonical page. The slug is the last part of its page URL (`/p/{slug}`).","parameters":[{"$ref":"#/components/parameters/Slug"}],"responses":{"200":{"description":"The product.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/ProductDetail"}}}}}},"404":{"description":"Nothing is published by that name: no listed product, category or launch week.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/products/{slug}/alternatives":{"get":{"operationId":"listProductAlternatives","tags":["Products"],"summary":"List a product's alternatives","description":"Returns the listed alternatives to one product in the order its alternatives page ranks them: editor's picks first, then the makers' own declarations, then by relevance and upvotes. `bestFor` is the alternative's makers' own line on who it suits.","parameters":[{"$ref":"#/components/parameters/Slug"},{"$ref":"#/components/parameters/Limit"}],"responses":{"200":{"description":"Its alternatives, best match first.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Alternative"}}}}}}},"404":{"description":"Nothing is published by that name: no listed product, category or launch week.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/categories":{"get":{"operationId":"listCategories","tags":["Categories"],"summary":"List the categories","description":"Returns every category with at least one listed product, most products first, with how many each has. A category's `slug` narrows `GET /products`; its `url` is its page (null while it has fewer than 5 products and so no page).","responses":{"200":{"description":"The categories.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}}}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/launches/current":{"get":{"operationId":"listCurrentLaunches","tags":["Launches"],"summary":"List this week's live launches","description":"Returns the launch board's live launches, most upvoted first: this ISO week's once its board has opened, else the week still live (between Monday 00:00 UTC and the rollover). `week` names the week returned.","responses":{"200":{"description":"The current week and its launches.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/CurrentLaunches"}}}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/launches/{week}":{"get":{"operationId":"getLaunchWeek","tags":["Launches"],"summary":"Get one launch week's results","description":"Returns one ISO week's launch board — any week since MakerRadar began, the live one included — ranked as its page ranks it: by upvotes, then comments, then who went live first. `status` says whether the week is upcoming, live or closed; a closed week's ranking is final.","parameters":[{"$ref":"#/components/parameters/Week"}],"responses":{"200":{"description":"The week and its ranked launches.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/LaunchWeek"}}}}}},"400":{"description":"A parameter isn't valid; `message` says which and how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing is published by that name: no listed product, category or launch week.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me":{"get":{"operationId":"getMe","tags":["Account"],"summary":"The account your agent token acts for","description":"Who the token acts for: the account's handle, whether it can list products yet (and where the person finishes setting up when not), and what the token may do. 401 without a working token.","security":[{"agentToken":[]}],"responses":{"200":{"description":"The account.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Account"}}}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/listings":{"get":{"operationId":"listMyListings","tags":["Account"],"summary":"The listings of the account your token acts for","description":"Every listing the account is a maker of, newest first: its status (draft, in review, live…), its public page once live, and where its maker manages it. Needs the `listings:read` scope.","security":[{"agentToken":[]}],"responses":{"200":{"description":"Its listings.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MyListing"}}}}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token works but wasn't given the scope this needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"submitMyListing","tags":["Account"],"summary":"Submit a product as your person's draft listing","description":"The website and, optionally, its name, tagline and description (checked as the site's own form checks them). 201 with the new listing's `productId`; 200 with `status: listed` or `on_file` when the site is already listed. Then `POST /me/listings/{id}/launch` sends it for review. Needs `listings:write`.","security":[{"agentToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftRequest"}}}},"responses":{"200":{"description":"Already listed or on file: nothing was submitted.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"201":{"description":"A new draft listing.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"400":{"description":"A parameter isn't valid; `message` says which and how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token works but wasn't given the scope this needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"This feature is paused for now. Nothing was changed; retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/listings/{id}":{"get":{"operationId":"getMyListing","tags":["Account"],"summary":"One of your person's listings","description":"Everything you can edit (copy, category, pricing, price from, where it's based, best for, demo video, technologies, platforms, audiences, tags, links elsewhere, quick answers, logo and photos with their ids), its status, what's left to make it complete (`readiness`) and whether it can be sent for review. Needs `listings:read`.","security":[{"agentToken":[]}],"parameters":[{"$ref":"#/components/parameters/ListingId"}],"responses":{"200":{"description":"The listing.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token works but wasn't given the scope this needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing is published by that name: no listed product, category or launch week.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateMyListing","tags":["Account"],"summary":"Edit any of a listing's details","description":"Name, tagline, description, category, pricing model, price from, where it's based, best for, demo video, technologies, platforms, audiences, tags and links elsewhere (one per kind, each on that site's own host) — the edit form's fields and rules. Send only what changes; `null` or an empty list clears a field; slugs come from `GET /me/listing-options`. A demo video must be a YouTube, Vimeo, Loom or Arcade link to a real, public video. A draft changes at once; on a live listing a new name, category, video or link, or a rewrite, waits for review (`pendingReview`). Needs `listings:write`.","security":[{"agentToken":[]}],"parameters":[{"$ref":"#/components/parameters/ListingId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"A new name, 2–60 characters."},"tagline":{"type":"string","description":"A new tagline, 4–90 characters."},"description":{"type":"string","description":"A new description, 40–4000 characters."},"category":{"type":"string","description":"The one category it's filed under (a slug)."},"pricingModel":{"type":"string","enum":["free","freemium","paid","open_source"]},"priceFrom":{"type":["object","null"],"description":"Its cheapest paid plan; null clears it.","properties":{"amount":{"type":["number","string"],"description":"Up to 100000."},"currency":{"type":"string","enum":["USD","EUR","GBP","INR","AUD","CAD","AED","SGD","CHF","NZD"]},"period":{"type":"string","enum":["once","month","year"]}},"required":["amount","currency","period"]},"basedIn":{"type":["string","null"],"description":"Where the business is, like \"Bristol, UK\" (up to 60 characters)."},"bestFor":{"type":["string","null"],"description":"Who it suits best, finishing \"Best for …\" (up to 40 characters)."},"demoVideo":{"type":["string","null"],"description":"A YouTube, Vimeo, Loom or Arcade link to a public video or demo."},"technologies":{"type":"array","items":{"type":"string"},"maxItems":20,"description":"What it's built with (slugs); replaces the list."},"platforms":{"type":"array","items":{"type":"string"},"maxItems":8,"description":"Where it runs (slugs); replaces the list."},"audiences":{"type":"array","items":{"type":"string"},"maxItems":4,"description":"Who it's for (slugs); replaces the list."},"tags":{"type":"array","items":{"type":"string"},"maxItems":8,"description":"Its tags (slugs of existing tags only); replaces the list."},"links":{"type":"array","maxItems":9,"description":"Its links elsewhere, one per kind, each on that kind's own site (get_listing_options shows each kind's example); replaces the list, and an empty list clears it.","items":{"type":"object","properties":{"kind":{"type":"string","enum":["twitter","github","linkedin","appstore","playstore","producthunt","youtube","discord","instagram"]},"url":{"type":"string"}},"required":["kind","url"]}}}}}}},"responses":{"200":{"description":"Saved.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"400":{"description":"A parameter isn't valid; `message` says which and how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token works but wasn't given the scope this needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing is published by that name: no listed product, category or launch week.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/listings/{id}/launch":{"get":{"operationId":"getLaunchOptions","tags":["Account"],"summary":"The launch weeks open to a listing","description":"Free (spots left per week, and the next week with room) and Premium weeks. Needs `launches:write`.","security":[{"agentToken":[]}],"parameters":[{"$ref":"#/components/parameters/ListingId"}],"responses":{"200":{"description":"Its launch options.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token works but wasn't given the scope this needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing is published by that name: no listed product, category or launch week.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"chooseLaunch","tags":["Account"],"summary":"Choose a launch and send the listing for review","description":"`tier` is free or premium; `week` (as `GET …/launch` names it) is optional for Free, needed for Premium. MakerRadar reviews every listing before it goes live. Needs `launches:write`.","security":[{"agentToken":[]}],"parameters":[{"$ref":"#/components/parameters/ListingId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tier"],"properties":{"tier":{"type":"string","enum":["free","premium","featured"]},"week":{"type":"string","examples":["week-46-2026"]}}}}}},"responses":{"200":{"description":"Sent for review.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"400":{"description":"A parameter isn't valid; `message` says which and how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token works but wasn't given the scope this needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing is published by that name: no listed product, category or launch week.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Not in a state that allows this (e.g. already in review).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/listings/{id}/ownership":{"post":{"operationId":"startOwnershipCheck","tags":["Account"],"summary":"Start proving the listing's site is your person's","description":"Returns a token and exactly where to put it (a DNS TXT record, a file, or a homepage meta tag). Place it, then `POST …/ownership/verify`. Needs `listings:write`.","security":[{"agentToken":[]}],"parameters":[{"$ref":"#/components/parameters/ListingId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["method"],"properties":{"method":{"type":"string","enum":["dns_txt","html_file","meta_tag"]}}}}}},"responses":{"200":{"description":"The token and its placement steps.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"400":{"description":"A parameter isn't valid; `message` says which and how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token works but wasn't given the scope this needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing is published by that name: no listed product, category or launch week.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/listings/{id}/ownership/verify":{"post":{"operationId":"verifyOwnership","tags":["Account"],"summary":"Verify the token is in place","description":"`verified: true` makes your person the listing's verified owner; otherwise `outcome` says what's missing. DNS can take a few minutes. Needs `listings:write`.","security":[{"agentToken":[]}],"parameters":[{"$ref":"#/components/parameters/ListingId"}],"responses":{"200":{"description":"Where the check stands.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"400":{"description":"A parameter isn't valid; `message` says which and how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token works but wasn't given the scope this needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing is published by that name: no listed product, category or launch week.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/listings/{id}/images":{"post":{"operationId":"addListingImage","tags":["Account"],"summary":"Add the listing's logo or a photo from a URL","description":"We fetch the public https image under our safety guard and check it like an upload; on a live listing it waits for review. Needs `listings:write`.","security":[{"agentToken":[]}],"parameters":[{"$ref":"#/components/parameters/ListingId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["kind","url"],"properties":{"kind":{"type":"string","enum":["logo","photo"]},"url":{"type":"string","format":"uri"},"alt":{"type":"string","maxLength":200}}}}}},"responses":{"200":{"description":"Added.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"400":{"description":"A parameter isn't valid; `message` says which and how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token works but wasn't given the scope this needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing is published by that name: no listed product, category or launch week.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/listing-options":{"get":{"operationId":"getListingOptions","tags":["Account"],"summary":"What a listing's fields accept","description":"The categories, technologies, platforms, audiences and tags to pick from (by slug), the pricing models, currencies and price periods, the demo video hosts, the link kinds with an example of each, and every field's limits. Needs `listings:read`.","security":[{"agentToken":[]}],"responses":{"200":{"description":"The choices.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token works but wasn't given the scope this needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/listings/{id}/answers":{"put":{"operationId":"setQuickAnswers","tags":["Account"],"summary":"Replace a listing's quick answers","description":"The full list of questions buyers ask, answered by the maker (an empty list removes them). On a live listing, answers that add a link or are mostly rewritten wait for review (`pendingReview`). Needs `listings:write`.","security":[{"agentToken":[]}],"parameters":[{"$ref":"#/components/parameters/ListingId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"answers":{"type":"array","maxItems":6,"description":"The full list (it replaces the old one); empty removes them all.","items":{"type":"object","properties":{"question":{"type":"string","maxLength":140},"answer":{"type":"string","maxLength":600}},"required":["question","answer"]}}},"required":["answers"]}}}},"responses":{"200":{"description":"Saved.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"400":{"description":"A parameter isn't valid; `message` says which and how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token works but wasn't given the scope this needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing is published by that name: no listed product, category or launch week.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/listings/{id}/images/{photoId}":{"delete":{"operationId":"removeListingPhoto","tags":["Account"],"summary":"Remove a photo from a listing","description":"By its id from `GET /me/listings/{id}`; it's gone at once. Needs `listings:write`.","security":[{"agentToken":[]}],"parameters":[{"$ref":"#/components/parameters/ListingId"},{"$ref":"#/components/parameters/PhotoId"}],"responses":{"200":{"description":"Removed.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token works but wasn't given the scope this needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing is published by that name: no listed product, category or launch week.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/listings/{id}/images/{photoId}/cover":{"post":{"operationId":"setListingCover","tags":["Account"],"summary":"Make a photo the listing's cover","description":"The photo its page leads with, by its id from `GET /me/listings/{id}`. Needs `listings:write`.","security":[{"agentToken":[]}],"parameters":[{"$ref":"#/components/parameters/ListingId"},{"$ref":"#/components/parameters/PhotoId"}],"responses":{"200":{"description":"Done.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token works but wasn't given the scope this needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing is published by that name: no listed product, category or launch week.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/listings/{id}/badge":{"get":{"operationId":"getBadgeSnippet","tags":["Account"],"summary":"The badge for the listing's site","description":"The HTML to put on the site's homepage, and what the listing earns while it's there. Needs `listings:read`.","security":[{"agentToken":[]}],"parameters":[{"$ref":"#/components/parameters/ListingId"}],"responses":{"200":{"description":"The badge snippet.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"400":{"description":"A parameter isn't valid; `message` says which and how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token works but wasn't given the scope this needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing is published by that name: no listed product, category or launch week.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pricing":{"get":{"operationId":"getPricing","tags":["Billing"],"summary":"What a listing can buy, at today's prices","description":"Every item on sale on MakerRadar — a Premium launch, featured or boosted weeks, ads, newsletter sponsorship, done-for-you submissions — with its `id` (what `POST /me/checkouts` takes as `item`), price, what it gets, and for an item bought by the week the totals for 1, 2 and 4 weeks and the weeks open to book. The prices /pricing shows and checkout charges. No key needed.","responses":{"200":{"description":"The items on sale.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/checkouts":{"post":{"operationId":"startCheckout","tags":["Billing"],"summary":"Start a checkout for the person to pay","description":"Opens a checkout for an `item` (from `GET /pricing`) for one of the person's listings, as the person: the same rules as the site's own Buy button (a placement needs an approved listing; a week must be open). Answers with `checkoutUrl`, the payment page — give it to the person; nothing is charged until they pay, and MakerRadar emails them the link too. An agent never pays. A week's spot is held until `heldUntil`. Needs `billing:checkout`.","security":[{"agentToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["item","productId"],"properties":{"item":{"type":"string","examples":["PREMIUM_LAUNCH"]},"productId":{"type":"string"},"week":{"type":"string","examples":["week-46-2026"]},"weeks":{"type":"integer","enum":[1,2,4]},"coupon":{"type":"string"}}}}}},"responses":{"200":{"description":"The checkout, with the payment page for the person.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"400":{"description":"A parameter isn't valid; `message` says which and how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token works but wasn't given the scope this needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing is published by that name: no listed product, category or launch week.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Not in a state that allows this (e.g. already in review).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"This feature is paused for now. Nothing was changed; retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/orders":{"get":{"operationId":"listMyOrders","tags":["Billing"],"summary":"The person's orders","description":"Their 20 newest orders: what each bought, for which listing and week, its status (pending, paid, failed, cancelled, refunded) and total. Poll it after `POST /me/checkouts` to see when they've paid. Needs `billing:checkout`.","security":[{"agentToken":[]}],"responses":{"200":{"description":"Their orders.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"No working agent token: send `Authorization: Bearer mr_…`, one the person approved and hasn't revoked.","headers":{"WWW-Authenticate":{"description":"The Bearer challenge (RFC 6750).","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token works but wasn't given the scope this needs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/agent/connect":{"post":{"operationId":"startAgentConnect","tags":["Account"],"summary":"Ask a person to let your agent act for their account","description":"Starts the device flow (RFC 8628): returns a short `userCode` and `verificationUriComplete` to show the person, and your secret `deviceCode`. They sign in and approve you on the site; then call `POST /agent/token` with `deviceCode` every `interval` seconds until it's approved. No sign-in needed to start; limited per IP.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"client":{"type":"string","description":"Your name as the person should see it (e.g. Claude Code)."},"scopes":{"type":"array","items":{"type":"string","enum":["listings:read","listings:write","launches:write","billing:checkout"]},"description":"What you ask to do; all of them when absent."}}}}}},"responses":{"200":{"description":"A code for the person and your device code.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/AgentConnect"}}}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/agent/token":{"post":{"operationId":"finishAgentConnect","tags":["Account"],"summary":"Trade your device code for an agent token","description":"After `POST /agent/connect`: `status` is `pending` until the person decides (ask again after `interval` seconds), then `approved` with your `token` (shown once — send it as `Authorization: Bearer <token>`), or `denied` / `expired`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["deviceCode"],"properties":{"deviceCode":{"type":"string"}}}}}},"responses":{"200":{"description":"Where the request stands, and the token once approved.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/AgentToken"}}}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/drafts":{"post":{"operationId":"createDraft","tags":["Drafts"],"summary":"Draft a listing for a person to submit","description":"For an agent helping a maker list their own product. Send the product's website and, optionally, a name, tagline and description (checked as the site's own form checks them). A new draft answers 201 with `reviewUrl`: give it to the person, who opens it, signs in, checks the listing and submits it. Nothing is published, fetched or reserved until they do, and the listing is reviewed before it goes live. The link works for 7 days. If the site is already listed, the answer is 200 with `status: listed` and its `productUrl` (the maker can claim it there); if we have it on file but not public, 200 with `status: on_file`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftRequest"}}}},"responses":{"200":{"description":"The site is already listed or on file: no draft was made.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Draft"}}}}}},"201":{"description":"A new draft, with the link for the person.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Draft"}}}}}},"400":{"description":"A parameter isn't valid; `message` says which and how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests from this IP in the current window.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected failure on our side. Nothing was changed; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"This feature is paused for now. Nothing was changed; retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"agentToken":{"type":"http","scheme":"bearer","description":"An agent token (`mr_…`) a person approved for your agent (MCP `connect_account`, or a key from Dashboard › AI agents). Only the Account operations need one."}},"parameters":{"ListingId":{"name":"id","in":"path","required":true,"description":"A listing's id, as `GET /me/listings` lists it.","schema":{"type":"string","minLength":1}},"PhotoId":{"name":"photoId","in":"path","required":true,"description":"A photo's id, as `GET /me/listings/{id}` lists it.","schema":{"type":"string","minLength":1}},"Limit":{"name":"limit","in":"query","required":false,"description":"How many products to return (1–100).","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},"Slug":{"name":"slug","in":"path","required":true,"description":"The product's slug, as in its page URL.","schema":{"type":"string","minLength":1,"examples":["acme-analytics"]}},"Cursor":{"name":"cursor","in":"query","required":false,"description":"Where to continue: the `nextCursor` of the previous page, unchanged. Omit it for the first page.","schema":{"type":"string"}},"Query":{"name":"q","in":"query","required":false,"description":"Keywords to find in the product's name or tagline (matched literally).","schema":{"type":"string","minLength":2,"maxLength":80,"examples":["analytics"]}},"Category":{"name":"category","in":"query","required":false,"description":"Only products in this category: a `slug` from `GET /categories`.","schema":{"type":"string","examples":["analytics"]}},"Platform":{"name":"platform","in":"query","required":false,"description":"Only products that run on this platform: a term's slug, as on /platforms (web, ios, android, mac, windows, linux, browser-extension, api, cli…).","schema":{"type":"string","examples":["ios"]}},"Audience":{"name":"audience","in":"query","required":false,"description":"Only products made for this audience: a term's slug, as on /for (developers, designers, marketers, founders…).","schema":{"type":"string","examples":["developers"]}},"UseCase":{"name":"useCase","in":"query","required":false,"description":"Only products for this use case: a term's slug, as on /use-cases.","schema":{"type":"string","examples":["invoicing"]}},"Country":{"name":"country","in":"query","required":false,"description":"Only products based in this country: an ISO 3166-1 alpha-2 code (either case) or the country's slug, as on /countries.","schema":{"type":"string","examples":["DE","germany"]}},"UpdatedSince":{"name":"updatedSince","in":"query","required":false,"description":"Only listings changed at or after this moment: an ISO 8601 date (UTC midnight) or a date-time with its zone.","schema":{"type":"string","examples":["2026-10-01T00:00:00Z"]}},"Week":{"name":"week","in":"path","required":true,"description":"The ISO week, as in its page URL.","schema":{"type":"string","pattern":"^week-\\d{1,2}-\\d{4}$","examples":["week-41-2026"]}}},"headers":{"RateLimitPolicy":{"description":"The quota for this surface: `\"<name>\";q=<requests>;w=<window seconds>`, counted per IP (draft-ietf-httpapi-ratelimit-headers).","schema":{"type":"string","examples":["\"v1\";q=120;w=60"]}},"RateLimit":{"description":"What is left of the quota: `\"<name>\";r=<remaining>;t=<seconds until reset>` (draft-ietf-httpapi-ratelimit-headers).","schema":{"type":"string","examples":["\"v1\";r=0;t=60"]}},"RetryAfter":{"description":"Seconds to wait before retrying (RFC 9110).","schema":{"type":"integer","minimum":1,"examples":[60]}}},"schemas":{"Account":{"type":"object","required":["ready","agent","dashboardUrl"],"properties":{"handle":{"type":["string","null"]},"name":{"type":["string","null"]},"ready":{"type":"boolean","description":"Whether it can list products yet."},"finishSetupUrl":{"type":["string","null"],"description":"Where the person finishes setting up, when not ready."},"agent":{"type":"object","properties":{"name":{"type":["string","null"]},"scopes":{"type":"array","items":{"type":"string","enum":["listings:read","listings:write","launches:write","billing:checkout"]}}}},"dashboardUrl":{"type":"string","format":"uri"}}},"AgentConnect":{"type":"object","required":["deviceCode","userCode","verificationUriComplete","interval","message"],"properties":{"deviceCode":{"type":"string","description":"Your secret. Never show it to the person."},"userCode":{"type":"string","examples":["ABCD-EFGH"]},"verificationUri":{"type":"string","format":"uri"},"verificationUriComplete":{"type":"string","format":"uri"},"expiresIn":{"type":"integer","description":"Seconds the code works."},"interval":{"type":"integer","description":"Seconds between token requests."},"message":{"type":"string"}}},"AgentToken":{"type":"object","required":["status","message"],"properties":{"status":{"type":"string","enum":["pending","approved","denied","expired"]},"message":{"type":"string"},"token":{"type":"string","description":"Once approved: `mr_…`, shown once."},"tokenType":{"type":"string","enum":["Bearer"]},"scopes":{"type":"array","items":{"type":"string"}},"expiresAt":{"type":"string","format":"date-time"}}},"MyListing":{"type":"object","required":["id","name","status","statusLabel","manageUrl"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"tagline":{"type":"string"},"domain":{"type":"string"},"status":{"type":"string","enum":["draft","pending","approved","rejected","archived"]},"statusLabel":{"type":"string"},"awaitingReview":{"type":"boolean"},"role":{"type":"string"},"url":{"type":["string","null"],"description":"Its public page, once live."},"manageUrl":{"type":"string","format":"uri"},"createdAt":{"type":"string","format":"date-time"}}},"DraftRequest":{"type":"object","description":"A listing an agent proposes. Only `url` is required.","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"The product's website (https://…).","examples":["https://acme.example"]},"name":{"type":"string","minLength":2,"maxLength":60},"tagline":{"type":"string","minLength":4,"maxLength":90},"description":{"type":"string","minLength":40,"maxLength":4000,"description":"What it does and who it's for, in plain Markdown."}}},"Draft":{"type":"object","description":"What drafting came to, and what to tell the person.","required":["status","message"],"properties":{"status":{"type":"string","enum":["drafted","listed","on_file"]},"message":{"type":"string"},"reviewUrl":{"type":"string","format":"uri","description":"For a new draft: the person opens it, signs in and submits."},"expiresAt":{"type":"string","format":"date-time"},"productUrl":{"type":"string","format":"uri","description":"For a listed site: its page."}}},"Product":{"type":"object","description":"A listed product, as the list endpoint returns it.","required":["slug","name","tagline","pricingModel","totalUpvotes","url"],"properties":{"slug":{"type":"string","description":"Its URL slug."},"name":{"type":"string","description":"The product's name (maker-provided)."},"tagline":{"type":"string","description":"Its one-line pitch (maker-provided)."},"websiteUrl":{"type":["string","null"],"format":"uri","description":"The product's own site; null while its domain is flagged by our safety scan."},"pricingModel":{"type":"string","enum":["free","freemium","paid","open_source"]},"totalUpvotes":{"type":"integer","minimum":0,"description":"All-time upvotes."},"logoUrl":{"type":["string","null"],"format":"uri","description":"The logo its page shows; null when it has none."},"publishedAt":{"type":["string","null"],"format":"date-time","description":"When it went public; null while its launch is still scheduled."},"updatedAt":{"type":"string","format":"date-time","description":"When its listing last changed."},"url":{"type":"string","format":"uri","description":"Its canonical page."}}},"Alternative":{"description":"A listed alternative to a product.","allOf":[{"$ref":"#/components/schemas/Product"},{"type":"object","properties":{"bestFor":{"type":["string","null"],"description":"Who it suits, in its makers' words (maker-provided, unverified)."}}}]},"Category":{"type":"object","required":["slug","name","productCount","url"],"properties":{"slug":{"type":"string","description":"Pass as `category` to filter products."},"name":{"type":"string"},"description":{"type":["string","null"]},"productCount":{"type":"integer","minimum":1,"description":"Listed products in it."},"url":{"type":["string","null"],"format":"uri","description":"Its page; null while it has too few products for one."}}},"ProductDetail":{"type":"object","description":"One listed product, with its full public details.","required":["slug","name","tagline","descriptionMd","domain","pricingModel","claimed","totalUpvotes","ratingCount","ratingSum","url"],"properties":{"slug":{"type":"string"},"name":{"type":"string","description":"Maker-provided."},"tagline":{"type":"string","description":"Maker-provided."},"descriptionMd":{"type":"string","description":"The makers' description, in Markdown (maker-provided, unverified)."},"websiteUrl":{"type":["string","null"],"format":"uri","description":"Null while its domain is flagged by our safety scan."},"domain":{"type":"string","description":"The host its site is on."},"pricingModel":{"type":"string","enum":["free","freemium","paid","open_source"]},"claimed":{"type":"boolean","description":"Whether a maker has proven they own it."},"totalUpvotes":{"type":"integer","minimum":0},"ratingCount":{"type":"integer","minimum":0,"description":"How many reviews."},"ratingSum":{"type":"integer","minimum":0,"description":"Sum of review ratings (1–5 each); the average is ratingSum / ratingCount."},"logoUrl":{"type":["string","null"],"format":"uri"},"publishedAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"tags":{"type":"array","description":"Its tags, from our vocabulary.","items":{"type":"object","required":["slug","name"],"properties":{"slug":{"type":"string"},"name":{"type":"string"}}}},"links":{"type":"array","description":"Its pages elsewhere (maker-provided, unverified): one per kind, each on that site's own host.","items":{"type":"object","required":["kind","url"],"properties":{"kind":{"type":"string","enum":["twitter","github","linkedin","appstore","playstore","producthunt","youtube","discord","instagram","other"]},"url":{"type":"string","format":"uri"}}}},"url":{"type":"string","format":"uri","description":"Its canonical page."}}},"Launch":{"type":"object","description":"A product on a launch board.","required":["slug","name","tagline","tier","upvoteCount","commentCount","url"],"properties":{"slug":{"type":"string"},"name":{"type":"string","description":"Maker-provided."},"tagline":{"type":"string","description":"Maker-provided."},"tier":{"type":"string","enum":["free","premium","featured"],"description":"How it launched. Paid tiers are labelled on the board and never change its rank."},"upvoteCount":{"type":"integer","minimum":0,"description":"Upvotes this week."},"commentCount":{"type":"integer","minimum":0},"logoUrl":{"type":["string","null"],"format":"uri"},"url":{"type":"string","format":"uri"}}},"CurrentLaunches":{"type":"object","required":["week","launches"],"properties":{"week":{"type":"string","pattern":"^week-\\d{1,2}-\\d{4}$","description":"The ISO week the board shows, as in its page URL.","examples":["week-41-2026"]},"launches":{"type":"array","items":{"$ref":"#/components/schemas/Launch"}}}},"LaunchWeek":{"type":"object","required":["week","label","status","url","launches"],"properties":{"week":{"type":"string","examples":["week-41-2026"]},"label":{"type":"string","examples":["Week 41, 2026"]},"status":{"type":"string","enum":["upcoming","live","closed"],"description":"Whether the week's board is still to open, open now, or final."},"url":{"type":"string","format":"uri","description":"The week's page."},"launches":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/Launch"},{"type":"object","required":["rank"],"properties":{"rank":{"type":"integer","minimum":1,"description":"1 is the week's winner."}}}]}}}},"Error":{"type":"object","description":"Every failure's body.","required":["error","message","hint","docs"],"properties":{"error":{"type":"string","enum":["unauthorized","not_found","rejected","rate_limited","invalid","paused","blocked","forbidden","provider_failed","internal_error","method_not_allowed","challenge_required"],"description":"A stable, machine-readable code."},"message":{"type":"string","description":"What happened, for a person."},"hint":{"type":"string","description":"What to do about it."},"docs":{"type":"string","format":"uri","description":"The error reference."}}}}}}