LaunchSignal

Docs · agents & humans

Public JSON API

Machine-readable listing API. Prefer these endpoints over the HTML form — the form at /submit stays for humans. OpenAPI: /openapi.json. Public MCP: /mcp (Streamable HTTP).

Base

https://launchsignal.ai · JSON request/response · CORS: public GET (*); POST allows browser/agent Origins with Content-Type / Accept.

POST /api/v1/products

Submit a listing (pending review). Fields: name, url, description, category, email, optional logo_url. Categories: SaaS, AI, Developer Tools, Design, Marketing, Productivity, Other.

curl -sS -X POST https://launchsignal.ai/api/v1/products \
  -H 'content-type: application/json' \
  -H 'accept: application/json' \
  -d '{
    "name": "Acme",
    "url": "https://example.com",
    "description": "Does one useful thing.",
    "category": "AI",
    "email": "you@example.com"
  }'

Success 201: {"ok":true,"id","slug","status":"pending"}. Error: {"ok":false,"error","message","fields?"} (fields on validation errors only). Submit errors: 400 validation codes, 400 rejected_policy, 409 duplicate_domain, 429 rate_limited (see Error codes).

Pending is not live. After a 201 with status: "pending", GET /api/v1/products/:slug returns 404 not_found and MCP get_product returns not_found until a moderator approves the listing. That is expected; keep the slug and don't resubmit (a resubmit returns 409 duplicate_domain).

GET /api/v1/products

List approved products. Query: limit (1–100, default 50), cursor or offset, optional category.

curl -sS 'https://launchsignal.ai/api/v1/products?limit=10&category=AI'

GET /api/v1/products/:slug

Detail for an approved listing. 404 not_found if missing or not approved yet (pending listings included).

curl -sS https://launchsignal.ai/api/v1/products/acme

POST /api/v1/products/:slug/boost

Boost an approved listing. Body: {"plan":"priority"|"featured"} (no amounts — server-side only). Submit stays free; boost after approve (or on an existing approved slug). Same logic as POST /api/checkout. Paid placement is not available yet: this endpoint and /api/checkout currently return 503 {"ok":false,"error":"payments_unavailable","message":"Paid placement is not available yet."} and change nothing.

curl -sS -X POST https://launchsignal.ai/api/v1/products/acme/boost   -H 'content-type: application/json'   -H 'accept: application/json'   -d '{"plan":"priority"}'

Now: 503 payments_unavailable. Once payments launch: {"ok":true,"mode":"stripe","plan","url","message"} — complete Stripe Checkout; the boost applies after payment. Free alternative today: the backlink perk below.

Flow for agents: submit → wait for approved → add any <a href> to launchsignal.ai on the product homepage (plain text link is enough; image badge optional) → verify. First success grants 7 days of free Priority placement once; while verified the listing shows “Verified”. Snippets use rel="nofollow" (any rel passes verification); listing outbound links are always rel="ugc nofollow", or rel="sponsored" for paid boosts. Rechecked weekly; if the link disappears, verification is removed (Priority is kept). Submit responses include hint and next_steps.

Preferred text snippet:

<a href="https://launchsignal.ai/l/acme?utm_source=backlink" rel="nofollow">Listed on LaunchSignal</a>

Optional image badge: GET /badge/:slug.svg (light) · GET /badge/:slug.svg?theme=dark — approved slugs only.

<a href="https://launchsignal.ai/l/acme?utm_source=badge" rel="nofollow"><img src="https://launchsignal.ai/badge/acme.svg" alt="Listed on LaunchSignal" width="200" height="54"></a>

POST /api/v1/products/:slug/verify-backlink

Fetches the listing url only (5s timeout, 512KB, text/html, ≤3 redirects, public hosts only) and looks for a link to launchsignal.ai / www.launchsignal.ai. Limit 3 checks per slug per UTC day.

curl -sS -X POST https://launchsignal.ai/api/v1/products/acme/verify-backlink -H 'accept: application/json'

200: {"ok":true,"slug","verified","reason","message","backlink_url","perks_granted":{"priority_days":7,"priority_until"}|null,"checks_remaining_today","product"}. Reasons: link_found, link_not_found, timeout, not_html, http_error, blocked_host, blocked_scheme, too_many_redirects (more than 3 redirects), fetch_failed. Errors: 404 not_found, 400 not_approved, 429 rate_limited.

Legacy

POST /api/submit still works (form redirects or JSON). Prefer /api/v1/products.

Error codes

MCP — https://launchsignal.ai/mcp

Public, authless Model Context Protocol server (Streamable HTTP, JSON). Same listing logic as the REST API — no OAuth this round. Tools: submit_product, list_products, get_product, boost_product (slug + plan; returns payments_unavailable — paid placement is not available yet), verify_backlink (slug — same as the verify-backlink endpoint).

{
  "mcpServers": {
    "launchsignal": {
      "url": "https://launchsignal.ai/mcp"
    }
  }
}

Abuse: public endpoint — avoid spam submits; listings stay pending until moderated. Prefer list_products / get_product for reads. Soft rate limits may apply.

Notes

Submit is always free and does not take boost fields (unknown fields are ignored). Paid Priority/Featured is not available yet. MCP OAuth deferred. See also /llms.txt and /openapi.json.