{"info":{"title":"Nick Launches API","version":"1.0.0","description":"Read the launch catalog, audit a product site before launching, and create launch drafts.\n\nReads are open. Writes need a bearer token: run the pairing flow, approve it once in a browser at /connect/, and send the token as `Authorization: Bearer <token>`.\n\nNothing here publishes a launch. `POST /submissions` creates a draft and hands back a URL a human opens to finish and submit it."},"servers":[{"url":"https://nicklaunches.com/api/v1","description":"Production. The site normalizes to trailing slashes, so /products 308-redirects to /products/. Both reach the same endpoint; appending the slash saves a redirect."}],"components":{"schemas":{"Error":{"type":"object","properties":{"code":{"type":"string","description":"Machine-readable error code, e.g. NOT_FOUND."},"status":{"type":"integer","description":"Repeats the HTTP status."},"message":{"type":"string","description":"Human-readable explanation, safe to show a user."},"defined":{"type":"boolean"},"data":{"type":"object","description":"Status-specific detail.","additionalProperties":true}},"required":["code","status","message"]}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"A connection token minted by the pairing flow and approved once by the account owner at /connect/. Tokens start with nl_ct_ and can be revoked at /profile/connections/."}}},"tags":[{"name":"Products","description":"The public launch catalog."},{"name":"Directories","description":"The vetted launch-directory catalog."},{"name":"Launch readiness","description":"Preflight audit of a product site."},{"name":"Submissions","description":"Creating launch drafts."},{"name":"Me","description":"The authenticated caller's own launches."}],"openapi":"3.1.1","paths":{"/products":{"get":{"operationId":"products.list","summary":"Search launches","description":"Returns published launches, newest first. Every filter is optional: an empty request returns the ten most recent. Paginate by passing the previous response's nextCursor back as cursor.","tags":["Products"],"parameters":[{"name":"query","in":"query","schema":{"type":"string","maxLength":120},"allowEmptyValue":true,"allowReserved":true},{"name":"category","in":"query","schema":{"type":"string"},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"allowEmptyValue":true,"allowReserved":true},{"name":"cursor","in":"query","schema":{"type":"string"},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"tagline":{"type":"string"},"url":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"pricing":{"anyOf":[{"enum":["free","freemium","paid","subscription","one_time","contact"],"type":"string"},{"type":"null"}]},"openSource":{"type":"boolean"},"upvotes":{"type":"number"},"launchDate":{"type":"string"},"productUrl":{"type":"string"}},"required":["slug","name","tagline","url","categories","pricing","openSource","upvotes","launchDate","productUrl"]}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["items","nextCursor"]}}}},"400":{"description":"The input failed validation, or the supplied site could not be reached. See `data.fieldErrors` and `data.issues`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` and `data.retryAfter` both carry the wait in seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/products/{slug}":{"get":{"operationId":"products.get","summary":"Get one launch","description":"Full public listing for a single launch, by canonical slug or by any retired alias. Responds 404 when no launch matches.","tags":["Products"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"tagline":{"type":"string"},"url":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"pricing":{"anyOf":[{"enum":["free","freemium","paid","subscription","one_time","contact"],"type":"string"},{"type":"null"}]},"openSource":{"type":"boolean"},"upvotes":{"type":"number"},"launchDate":{"type":"string"},"productUrl":{"type":"string"},"description":{"type":"string"},"logo":{"type":"string"},"screenshots":{"type":"array","items":{"type":"string"}},"twitterUsername":{"anyOf":[{"type":"string"},{"type":"null"}]},"demoVideoUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"discount":{"anyOf":[{"type":"object","properties":{"badgeTitle":{"anyOf":[{"type":"string"},{"type":"null"}]},"code":{"anyOf":[{"type":"string"},{"type":"null"}]},"percentOff":{"anyOf":[{"type":"number"},{"type":"null"}]},"validUntil":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["badgeTitle","code","percentOff","validUntil"]},{"type":"null"}]},"maker":{"type":"object","properties":{"name":{"type":"string"},"handle":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["name","handle"]},"commentCount":{"type":"number"},"changelogCount":{"type":"number"}},"required":["slug","name","tagline","url","categories","pricing","openSource","upvotes","launchDate","productUrl","description","logo","screenshots","twitterUsername","demoVideoUrl","discount","maker","commentCount","changelogCount"]}}}},"400":{"description":"The input failed validation, or the supplied site could not be reached. See `data.fieldErrors` and `data.issues`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` and `data.retryAfter` both carry the wait in seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/directories":{"get":{"operationId":"directories.list","summary":"List launch directories","description":"The vetted catalog of launch directories, with domain rating, link type and what submitting to each one involves.","tags":["Directories"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"tagline":{"type":"string"},"focus":{"type":"string"},"pricing":{"type":"string"},"traffic":{"type":"string"},"domainRating":{"type":"number"},"backlinkQuality":{"type":"string"},"linkType":{"type":"string"},"submissionFriction":{"type":"string"},"requiresBadge":{"type":"boolean"},"lastVerified":{"type":"string"}},"required":["slug","name","url","tagline","focus","pricing","traffic","domainRating","backlinkQuality","linkType","submissionFriction","requiresBadge","lastVerified"]}}},"required":["items"]}}}},"400":{"description":"The input failed validation, or the supplied site could not be reached. See `data.fieldErrors` and `data.issues`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` and `data.retryAfter` both carry the wait in seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/launch-readiness":{"post":{"operationId":"launchReadiness","summary":"Audit a site before launching","description":"Crawls a product site and reports what to fix before submitting: badge, duplicates, listing copy and metadata, each with a concrete fix. Also returns the listing a submission would draft and the next free-launch weeks with room. Ten calls per hour per caller; anonymous callers are bucketed by IP address. POST rather than GET because the call performs an outbound crawl and a model call, so it is neither safe nor cacheable.","tags":["Launch readiness"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","minLength":1}},"required":["url"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"url":{"type":"string"},"score":{"type":"number"},"checks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"status":{"enum":["pass","warn","fail"],"type":"string"},"detail":{"type":"string"},"fix":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","label","status","detail","fix"]}},"suggestedListing":{"type":"object","properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"categories":{"type":"array","items":{"type":"string"}},"pricing":{"anyOf":[{"enum":["free","freemium","paid","subscription","one_time","contact"],"type":"string"},{"type":"null"}]}},"required":["name","tagline","description","categories","pricing"]},"suggestedCategories":{"type":"array","items":{"type":"string"}},"nextFreeWeeks":{"type":"array","items":{"type":"object","properties":{"year":{"type":"number"},"week":{"type":"number"},"startsOn":{"type":"string"}},"required":["year","week","startsOn"]}}},"required":["ok","url","score","checks","suggestedListing","suggestedCategories","nextFreeWeeks"]}}}},"400":{"description":"The input failed validation, or the supplied site could not be reached. See `data.fieldErrors` and `data.issues`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` and `data.retryAfter` both carry the wait in seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/submissions":{"post":{"operationId":"submissions.create","summary":"Create a launch draft","description":"Creates a draft launch owned by the caller and returns the URL a human opens to finish and submit it. Only the URL is required: the server crawls the site and drafts the listing, and any field you supply wins over the crawl. Nothing is published by this call. Ten drafts per hour per user.","tags":["Submissions"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","minLength":1},"name":{"type":"string"},"tagline":{"type":"string"},"description":{"type":"string"},"categories":{"type":"array","maxItems":3,"items":{"type":"string"}},"pricing":{"enum":["free","freemium","paid","subscription","one_time","contact"],"type":"string"},"twitterUsername":{"type":"string"},"targetKeyword":{"type":"string"},"demoVideoUrl":{"type":"string"},"firstComment":{"type":"string"},"logo":{"type":"string"},"screenshots":{"type":"array","maxItems":5,"items":{"type":"string"}}},"required":["url"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"slug":{"type":"string"},"draftUrl":{"type":"string"},"reviewUrl":{"type":"string"},"existing":{"type":"boolean"},"warnings":{"type":"array","items":{"type":"string"}}},"required":["ok","slug","draftUrl","reviewUrl","existing","warnings"]}}}},"400":{"description":"The input failed validation, or the supplied site could not be reached. See `data.fieldErrors` and `data.issues`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, malformed or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The product is already listed or is currently launching. See `data.fieldErrors`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` and `data.retryAfter` both carry the wait in seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearerAuth":[]}]}},"/me/launches":{"get":{"operationId":"me.launches","summary":"List your launches","description":"Every launch owned by the caller, at any status, including drafts. The only endpoint that returns the maker's private funnel counters (impressions, clicks) and the only one that returns unpublished rows.","tags":["Me"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"status":{"enum":["draft","pending_review","scheduled","live","rejected"],"type":"string"},"launchPlan":{"anyOf":[{"enum":["free","premium_7","premium_14","premium_14_pro","premium_30"],"type":"string"},{"type":"null"}]},"requestedLaunchDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"freeWeekReservation":{"anyOf":[{"type":"object","properties":{"year":{"type":"number"},"week":{"type":"number"}},"required":["year","week"]},{"type":"null"}]},"upvotes":{"type":"number"},"impressions":{"type":"number"},"clicks":{"type":"number"},"badgeStatus":{"enum":["unchecked","ok","loose","absent","error"],"type":"string"},"rejectionReason":{"anyOf":[{"type":"string"},{"type":"null"}]},"dashboardUrl":{"type":"string"},"draftUrl":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["slug","name","status","launchPlan","requestedLaunchDate","freeWeekReservation","upvotes","impressions","clicks","badgeStatus","rejectionReason","dashboardUrl","draftUrl"]}}},"required":["items"]}}}},"401":{"description":"Missing, malformed or revoked bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` and `data.retryAfter` both carry the wait in seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"bearerAuth":[]}]}}}}