Developer Documentation

Documentation & API Reference

Everything you need to drive Launchverse from the command line, a CI pipeline, or your own dashboard. Authentication, every public endpoint, the resource schemas behind them, and the deployment workflow from git push to live URL.

Quickstart

Mint an API token from Dashboard → API Tokens. Tokens are prefixed lvse_and are shown once at creation time — copy them straight into your secret store. Then verify it works:

curl -H "Authorization: Bearer lvse_…" \
     https://launchverse.app/api/v1/me

# {
#   "team":   { "id": "…", "name": "Acme", "plan_tier": "Pro" },
#   "scopes": ["read", "write", "deploy"],
#   "tokenId": "…"
# }

Every endpoint below is documented as plain HTTP — you can call it from any language. The dashboard itself uses the same routes.

Authentication

The public API uses bearer tokens. Pass them on every request in the Authorization header:

Authorization: Bearer lvse_<token>
  • Tokens are scoped to a single team. Switching teams in the dashboard does not affect API calls.
  • Three scopes: read, write, deploy. You choose the scopes when you mint the token.
  • Tokens can have an expiry date. Expired tokens fail with HTTP 401.
  • The dashboard's own session uses cookie-based auth and is not exposed publicly.

Failed authentication always returns 401 Unauthorized with a JSON body of { "error": "..." }. Insufficient scope returns 403 Forbidden.

Endpoints

All requests are JSON. The base URL is https://launchverse.app.

MethodPathScopeSummary
GET/api/v1/meanyIdentity probe — returns the team this token is bound to and its scopes.
GET/api/v1/projectsreadList every project owned by the token's team.
POST/api/deploydeployCreate a new project and kick off the first build.
POST/api/deploy/triggerdeployManually re-trigger a build for an existing project.
POST/api/deploy/rollbackdeployPromote a previously successful deploy back to production.
POST/api/deploy/promotedeployPromote a preview deployment to production.
POST/api/deploy/hook/[token]n/aPer-project webhook URL — POST to it to fire a build (token in path).
GET/api/projects/[id]readFetch a single project, including live engine status.
PATCH/api/projects/[id]writeUpdate project metadata (name, branch, build command, install command).
DELETE/api/projects/[id]writeTear down a project and every resource it owns.
GET/api/projects/[id]/envreadList environment variables for a project / environment.
POST/api/projects/[id]/envwriteCreate or update one environment variable.
POST/api/projects/[id]/env/bulkwriteReplace the entire env-var set in one call (idempotent).
GET/api/projects/[id]/domainsreadList every domain attached to a project.
POST/api/projects/[id]/domainswriteAttach a new custom domain (TLS issued automatically).
POST/api/projects/[id]/domains/[domainId]/verifywriteRe-run DNS / TLS verification for a pending domain.
GET/api/projects/[id]/analyticsreadPer-project deploy + build-minute + success-rate analytics.
POST/api/projects/[id]/lifecyclewriteStart, stop, restart, or redeploy a project (single endpoint, action body).
POST/api/projects/[id]/lifecycle/cancelwriteCancel an in-flight build for this project.
GET/api/projects/[id]/previewsreadList active per-PR preview environments.
DELETE/api/projects/[id]/previews/[pull_request_id]writeTear down a single PR preview without touching production.
POST/api/projects/[id]/execwriteRun a one-off shell command inside the project's running container.
GET/api/databasesreadList managed Postgres / MySQL / Redis databases for the team.
POST/api/databaseswriteProvision a new managed database.
GET/api/databases/[id]/credentialsreadFetch connection credentials for a database (audit-logged).
POST/api/databases/[id]/backupswriteTrigger an on-demand backup.
POST/api/databases/[id]/backups/restorewriteRestore a database from a previous backup.
POST/api/databases/[id]/lifecyclewriteStart, stop, or restart a database.
GET/api/cronjobsreadList scheduled jobs for a project.
POST/api/cronjobswriteSchedule a new cron job.
PATCH/api/cronjobs/[id]writeUpdate an existing cron schedule or command.
DELETE/api/cronjobs/[id]writeDelete a cron job.
GET/api/cronjobs/[id]/executionsreadList recent execution logs for a cron job.
GET/api/keysreadList SSH keys registered for the team's BYOS hosts.
POST/api/keyswriteAdd an SSH key for BYOS.
GET/api/serversreadList servers (managed + BYOS).
GET/api/servers/[id]/metricsreadLive CPU / memory / disk metrics for one server.
GET/api/teams/membersreadList teammates and their roles.
POST/api/teams/invitewriteInvite a teammate by email.

Routes prefixed /api/v1/ are stable; non-versioned routes are used by the dashboard and may change shape between releases.

Deployment workflow

  1. Push your code to GitHub. Connect the repository through the dashboard or via the GitHub App, then branch and PR like normal.
  2. A build slot is reserved.Every deploy passes through one admission gate that checks your concurrent-deploy cap, monthly build-minute quota, and the cluster's available CPU and memory. If the cluster is full, your build joins a FIFO queue and starts as soon as capacity frees up.
  3. Framework detection runs.Next.js, Remix, Vite, plain Node, Python, Go, Rust and more — we detect, install dependencies and build with the right tool for your stack.
  4. Container starts. Your project runs in an isolated container with the CPU and memory budget your plan allows. Logs stream to the dashboard live.
  5. TLS is issued and DNS is wired. A .launchverse.app preview URL is available immediately. Custom domains add a CNAME / A record and are issued certificates automatically.
  6. Build minutes are recorded.Billing is from the moment the build actually starts — queue time is free.

Every step is observable through the per-project dashboard, the Build logs view, and the analytics page.

Webhooks

GitHub

Connect the LaunchVerse GitHub App once and every push or PR automatically triggers a build. Inbound webhooks are verified with HMAC-SHA256 against a per-install secret, then deduplicated by GitHub's delivery ID — if a delivery is retried (network blip, gateway timeout) we acknowledge with 200 instead of triggering a duplicate build.

Deploy hook

Each project has a unique URL of the form /api/deploy/hook/<token>. POST to it from any external system to kick off a build:

curl -X POST https://launchverse.app/api/deploy/hook/<token>

Engine events

Build status transitions (Queued, Building, Deploying, Ready, Failed, Canceled) are pushed to the dashboard in real time over the LaunchVerse Realtime channel. Notifications fan out to teammates with guaranteed-once delivery.

Resource schemas

Every JSON response uses these top-level shapes. Optional fields are marked with ?.

Project

{
  id: string,                  // uuid
  name: string,
  status: "Live" | "Deploying" | "Building" | "Failed" | "Stopped" | "Broken",
  fqdn: string,                // comma-separated domain list
  framework: string,           // "next", "remix", "vite", "node", …
  branch: string,
  github_repo: string,
  team_id: string,
  cpu_limit?: string,          // e.g. "0.5", "2"
  memory_limit?: string,       // e.g. "512m", "2g"
  pr_previews_enabled: boolean,
  created_at: string           // ISO 8601
}

Deployment

{
  id: string,
  project_id: string,
  status: "Queued" | "Building" | "Deploying" | "Ready" | "Failed" | "Canceled" | "Skipped",
  trigger_source: "manual" | "push" | "pull_request" | "webhook",
  is_preview: boolean,
  pull_request_id?: number,
  branch?: string,
  commit_hash?: string,
  commit_message?: string,
  preview_url?: string,
  build_started_at?: string,
  build_finished_at?: string
}

Domain

{
  id: string,
  project_id: string,
  domain: string,                  // "app.example.com"
  verified: boolean,
  ssl_issued: boolean,
  dns_record_type: "A" | "CNAME",
  dns_record_value: string,
  created_at: string
}

Database

{
  id: string,
  team_id: string,
  engine: "postgres" | "mysql" | "redis",
  version: string,
  status: "Provisioning" | "Running" | "Stopped" | "Failed",
  created_at: string
  // Credentials are returned only via /api/databases/[id]/credentials
}

Domains & SSL

Every project gets a free .launchverse.app URL. Custom domains follow the standard CNAME / A-record pattern:

  • Subdomain (CNAME). Point your DNS at the CNAME shown on the Domains page (looks like edge.launchverse.app).
  • Apex domain (A record). Point your A record at the IP shown on the Domains page.
  • TLS certificates are issued automatically through Let's Encrypt and renewed before expiry. Wildcard certificates are available on Pro and Enterprise.
  • HSTS is enabled on launchverse.app and on every custom domain by default.

Plans & quotas

Every plan caps four dimensions: concurrent builds, monthly build-minutes, per-container CPU, and per-container memory. Admission control rejects requests that exceed your tier with a clean rate-limit response — no silently truncated resources.

PlanConcurrent buildsBuild minutes / monthCPU / containerMemory / container
Free11000.5512 MB
Student230011 GB
Pro51,50024 GB
Enterprise10Custom48 GB

Full plan comparison and pricing is on the Pricing page. The cluster is shared fairly — each plan has a guaranteed share so a Free workload can never starve a paid team.

Need something not in the docs?

The dashboard, the Engine API and the public REST surface all share the same underlying logic, so anything you can do in the UI can be scripted. If you hit a wall, head to Support or email [email protected] and we'll route a usable answer within one business day.