Developer reference · API v1

API documentation

Implemented listing and customer-dashboard routes. Public reads require no API key; customer routes require a current Firebase ID token.

Base
https://api.launchlog.ai/api/v1
Public reads
No key
Customer auth
Firebase token

Runtime base URL

https://api.launchlog.ai/api/v1

Customer authentication

Send Authorization: Bearer <firebase_id_token>. Ownership is enforced by the API.

Public surface

Public GET routes

Listing and discovery data is public. Preview tokens grant access to private preview data, so treat each token as sensitive and do not share it.

GET/listings

Returns published listings in a Laravel pagination envelope with data, links and meta.

GET/listings/{slug}

Returns one published listing by slug. A withdrawn public slug returns 410; an unknown or never-published slug returns 404.

GET/discovery/listings

Returns the complete, unpaginated published discovery feed ordered by slug. Each item has slug, name, tagline and updated_at.

GET/previews/{token}

Returns an active private preview addressed by its opaque token. Unknown and expired previews return 404.

GET/previews/{token}/conversion

Reports pending, converted or expired checkout-conversion state. A converted response includes the listing slug.

Query contract

Listing query parameters

categorystringCategory slug.
kindtechRestricts results to the implemented tech-category set.
tierenumbasic or featured.
techstringExact tech-stack entry.
tagstringTag slug.
qstringFull-text query over name, tagline and description.
sortenumpriority (default) or recent.
per_pageintegerPage size, clamped to 1–100; defaults to 24. Not valid with view=directory.
pageintegerPagination page.
viewdirectoryPaginates by the 30 visual slots of a directory page instead of by a fixed record count: a Featured row spends 2 slots for the card plus 1 for its real Standard companion, an ordinary Standard listing spends 1, and at most three Featured rows open a page. Adds slot_capacity and slots_used to meta. Requires sort=priority and cannot be combined with tier or per_page — those combinations return 422 on the conflicting field.
curl "https://api.launchlog.ai/api/v1/listings?tier=featured&sort=recent"
curl "https://api.launchlog.ai/api/v1/discovery/listings"
curl "https://api.launchlog.ai/api/v1/previews/{token}"

Authenticated surface

Customer dashboard

GET/dashboard/listings

Returns every listing owned by the authenticated user, including subscription summary and deterministic receipt facts.

GET/dashboard/listings/{id}

Returns one owned listing. A listing owned by someone else is not disclosed and returns 404.

PATCH/dashboard/listings/{id}

Updates only name, tagline and description on an owned listing.

POST/dashboard/listings/{id}/billing-portal

Creates a Stripe Billing Portal session for an owned listing with a billable subscription.

List owned listings

curl \
  -H "Authorization: Bearer {firebase_id_token}" \
  "https://api.launchlog.ai/api/v1/dashboard/listings"

Update editable fields

curl -X PATCH \
  -H "Authorization: Bearer {firebase_id_token}" \
  -H "Content-Type: application/json" \
  -d '{"name":"Updated name","tagline":"Updated tagline","description":"Updated description"}' \
  "https://api.launchlog.ai/api/v1/dashboard/listings/{id}"

Response boundaries

  • Public listing routes expose published listing fields, never owner or Stripe identifiers.
  • The discovery feed is intentionally unpaginated and narrower than the public listing resource.
  • Dashboard list responses are owner-scoped and unpaginated. The update route rejects protected fields such as tier, status, URL and slug.
  • The billing-portal route returns a short-lived Stripe URL; it does not change the subscription by itself.