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.
| Method | Path | Scope | Summary |
|---|---|---|---|
| GET | /api/v1/me | any | Identity probe — returns the team this token is bound to and its scopes. |
| GET | /api/v1/projects | read | List every project owned by the token's team. |
| POST | /api/deploy | deploy | Create a new project and kick off the first build. |
| POST | /api/deploy/trigger | deploy | Manually re-trigger a build for an existing project. |
| POST | /api/deploy/rollback | deploy | Promote a previously successful deploy back to production. |
| POST | /api/deploy/promote | deploy | Promote a preview deployment to production. |
| POST | /api/deploy/hook/[token] | n/a | Per-project webhook URL — POST to it to fire a build (token in path). |
| GET | /api/projects/[id] | read | Fetch a single project, including live engine status. |
| PATCH | /api/projects/[id] | write | Update project metadata (name, branch, build command, install command). |
| DELETE | /api/projects/[id] | write | Tear down a project and every resource it owns. |
| GET | /api/projects/[id]/env | read | List environment variables for a project / environment. |
| POST | /api/projects/[id]/env | write | Create or update one environment variable. |
| POST | /api/projects/[id]/env/bulk | write | Replace the entire env-var set in one call (idempotent). |
| GET | /api/projects/[id]/domains | read | List every domain attached to a project. |
| POST | /api/projects/[id]/domains | write | Attach a new custom domain (TLS issued automatically). |
| POST | /api/projects/[id]/domains/[domainId]/verify | write | Re-run DNS / TLS verification for a pending domain. |
| GET | /api/projects/[id]/analytics | read | Per-project deploy + build-minute + success-rate analytics. |
| POST | /api/projects/[id]/lifecycle | write | Start, stop, restart, or redeploy a project (single endpoint, action body). |
| POST | /api/projects/[id]/lifecycle/cancel | write | Cancel an in-flight build for this project. |
| GET | /api/projects/[id]/previews | read | List active per-PR preview environments. |
| DELETE | /api/projects/[id]/previews/[pull_request_id] | write | Tear down a single PR preview without touching production. |
| POST | /api/projects/[id]/exec | write | Run a one-off shell command inside the project's running container. |
| GET | /api/databases | read | List managed Postgres / MySQL / Redis databases for the team. |
| POST | /api/databases | write | Provision a new managed database. |
| GET | /api/databases/[id]/credentials | read | Fetch connection credentials for a database (audit-logged). |
| POST | /api/databases/[id]/backups | write | Trigger an on-demand backup. |
| POST | /api/databases/[id]/backups/restore | write | Restore a database from a previous backup. |
| POST | /api/databases/[id]/lifecycle | write | Start, stop, or restart a database. |
| GET | /api/cronjobs | read | List scheduled jobs for a project. |
| POST | /api/cronjobs | write | Schedule a new cron job. |
| PATCH | /api/cronjobs/[id] | write | Update an existing cron schedule or command. |
| DELETE | /api/cronjobs/[id] | write | Delete a cron job. |
| GET | /api/cronjobs/[id]/executions | read | List recent execution logs for a cron job. |
| GET | /api/keys | read | List SSH keys registered for the team's BYOS hosts. |
| POST | /api/keys | write | Add an SSH key for BYOS. |
| GET | /api/servers | read | List servers (managed + BYOS). |
| GET | /api/servers/[id]/metrics | read | Live CPU / memory / disk metrics for one server. |
| GET | /api/teams/members | read | List teammates and their roles. |
| POST | /api/teams/invite | write | Invite 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
- Push your code to GitHub. Connect the repository through the dashboard or via the GitHub App, then branch and PR like normal.
- 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.
- 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.
- Container starts. Your project runs in an isolated container with the CPU and memory budget your plan allows. Logs stream to the dashboard live.
- TLS is issued and DNS is wired. A
.launchverse.apppreview URL is available immediately. Custom domains add a CNAME / A record and are issued certificates automatically. - 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.
| Plan | Concurrent builds | Build minutes / month | CPU / container | Memory / container |
|---|---|---|---|---|
| Free | 1 | 100 | 0.5 | 512 MB |
| Student | 2 | 300 | 1 | 1 GB |
| Pro | 5 | 1,500 | 2 | 4 GB |
| Enterprise | 10 | Custom | 4 | 8 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.