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.
/listingsReturns published listings in a Laravel pagination envelope with data, links and meta.
/listings/{slug}Returns one published listing by slug. A withdrawn public slug returns 410; an unknown or never-published slug returns 404.
/discovery/listingsReturns the complete, unpaginated published discovery feed ordered by slug. Each item has slug, name, tagline and updated_at.
/previews/{token}Returns an active private preview addressed by its opaque token. Unknown and expired previews return 404.
/previews/{token}/conversionReports 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
/dashboard/listingsReturns every listing owned by the authenticated user, including subscription summary and deterministic receipt facts.
/dashboard/listings/{id}Returns one owned listing. A listing owned by someone else is not disclosed and returns 404.
/dashboard/listings/{id}Updates only name, tagline and description on an owned listing.
/dashboard/listings/{id}/billing-portalCreates 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.