Platform
Hosting & deploysPush to a branch, get a live linkDatabaseReal Postgres, one per appSign-inEmail and Google, users includedFile storageUploads, photos and documentsPaymentsCheckout and plans, same projectAI gatewayEvery model, with a hard spend cap
Solutions
Moving an app overFrom Lovable, Bolt, Replit or v0Your first real appNever shipped anything beforeSide project → businessWhen people start paying youPricing$20/month plus prepaid credits
Resources
DocsGuides written for people who are newFor AI agentsClaude Code, Cursor, MCP, JSON CLIChangelogWhat shipped, most recent firstComponentsPaste-ready UI for sign-in and moreSupportA person answers, not a queue botRefer a friendBoth of you get credits Start for $20
Open in ChatGPT Open in Claude Last updated 2026-09-24

REST API

Everything the console can do is a JSON endpoint under https://camplax.dev/v1 — which credential to use, and where the surface is split.

The console is a client of the same API you can call. The base is https://camplax.dev/v1; GET /v1/ returns a small index. This page is the map — pick the right credential, find the route family, and the per-feature docs cover the shapes.

Which credential

PrefixCarried asWhat it reaches
(session cookie)browser sign-ineverything the console can do, including the session-only routes below
cx_cli_…Authorization: Beareryour user — projects, deploys, CLI flows, /v1/mcp; set via camplax login or CAMPLAX_TOKEN
cx_live_… / cx_test_…Authorization: Bearerone project's data surface, limited to the key's scopes
cak_live_…Authorization: Bearer or x-camplax-analytics-keythe write-only ingest routes only — analytics, errors, flags
cxm_…Authorization: Bearerthe MCP endpoint, minted by OAuth

Three things follow. Session-only routes — team admin, billing, deploy-hook management — refuse project API keys outright. cx_live_ keys work on project routes and on the MCP endpoint for project-scoped tools (they cannot create_project, import_project or probe_project, and /v1/cli refuses them). And public ingest keys cannot read anything back.

The route map

Account-level:

FamilyCovers
/v1/projects · /v1/imports · /v1/templatescreate, import and template projects
/v1/cliCLI session — whoami, device login
/v1/billingsummary across projects, credits/:slug wallet + ledger
/v1/uploads · /v1/mcpupload tokens · the MCP transport
/v1/integrations/githubconnect repos

Per-project, all under /v1/projects/:slug/:

FamilyCovers
probe · deploys · import · deletionhealth checks, builds and rollback, moving in or out
database · storage · users · settings · emailthe data layer and its knobs
keys · teams · domainsAPI keys, seats, custom domains
logs · errors · error-alerts · uptimethe observe surface — streams, issues, monitors
analytics · flags · widgets · realtimeproduct telemetry, feature flags, hosted widgets, realtime channels
webhooks · cron · payments · integrations · ai · leeoutbound events, schedules, Stripe Connect, third-party keys, the AI gateway, the console assistant

GET /v1/projects/:slug itself is the dashboard rollup.

Public and inbound surfaces

Some routes answer without any of your credentials — they are public by design and rate limited:

RoutePurpose
POST /v1/analytics/i · POST /v1/errors/itelemetry ingest keyed by cak_live_…
GET /v1/flags/iflag evaluation, keyed by cak_live_…
GET /v1/status/:slugpublic uptime JSON for a project's status page
GET /v1/deploy-logs/:slug/:deployId?token=…shareable deploy log
GET /v1/realtime · /v1/w/*realtime handshake · public widget assets
POST /v1/hooks/:tokendeploy webhooks — 202 + deployId, 401 on a bad x-camplax-signature/x-hub-signature-256, 409 while production is busy
POST /v1/webhooks/{github,stripe,stripe/connect,resend}inbound events — the signature header is the auth; replays are deduplicated

There is also a small POST /v1/logs/ingest family the tenant runtime uses to ship runtime logs — see Logs. /v1/ai is the public AI gateway endpoint your app calls with a project key.

Shape of a response

Everything is JSON. Successes return the resource; failures return a machine-readable code first, with a human string when it helps:

{ "error": "not_found" }
{ "error": "invalid_signature" }
{ "error": "production_deploy_busy", "activeDeployId": "dep_…" }
{ "error": "delta_required" }

Treat error as the contract and message as display text. Public surfaces rate-limit by caller — an 429 means back off, not retry harder.

© 2026 Camplax $20 / month · credits stop at zero
Ask about Camplax