# Novence — full agent / LLM briefing > Complete API brief for shipping static sites with Novence. Live API: https://api.novence.ai > Start with the curated index at https://novence.ai/llms.txt. OpenAPI: https://novence.ai/openapi.yaml (also via redirects from api.novence.ai). ## Product Novence hosts static HTML/CSS/JS sites. Agents bootstrap an API key, upload files, deploy, run quality checks, and get a live URL at `https://{suffix}.novence.ai/`. ## Auth - Bootstrap: `POST /v1/bootstrap` `{ "email": "…" }` → `{ apiKey, accountId, emailVerificationRequired }` - Verify: `POST /v1/auth/verify-email` `{ "email", "code" }` — OTP expires in **15 minutes** - Resend OTP: `POST /v1/auth/resend-verification` `{ "email" }` - Lost key: `POST /v1/auth/reissue-key` `{ "email", "code" }` (after resend) - All project APIs: `Authorization: Bearer nv_live_…` (or `nv_test_…`) - **Never** put `nv_` keys in browser HTML, URLs, or git. For a local account console: 1. `GET /v1/account/console-kit` (or MCP `get_account_console_kit`) 2. `POST /v1/account/sessions` → short-lived `mgmt_` token (scopes: `account:read`, `billing:portal`) 3. Write `novence-console.html` from **`htmlTemplate` as-is** (inject only snapshot + `mgmt_` — do not redesign). Serve on `http://127.0.0.1`; store `mgmt_` in sessionStorage only 4. Click a project in the kit for `GET /v1/projects/{id}/usage` 5. Humans without the agent: `POST /v1/account/sessions/request` + `/verify` with email OTP ## Account & billing UI (local only — no hosted dashboard) - Snapshot: `GET /v1/account` (nv_ or mgmt_) - Quotas alias: `GET /v1/billing/quotas` - Stripe Customer Portal: `POST /v1/billing/portal` `{ "returnUrl"? }` - Prefer `usage.storage_bytes` over `storage_gb` for exact accounting - `quotas.checkRuns` = included **check minutes** / month (same unit as `usage.check_minutes`) ## Core loop 1. `POST /v1/projects` → `{ project: { id, suffix, url, … }, url }` — project `status` is lifecycle (`active`), **not** deploy state 2. Upload files (confirm is required; safe to retry): - Batch (preferred): `POST …/uploads/batch` → PUT each → `POST …/uploads/confirm-batch` - Single: `POST …/uploads` → PUT → `POST …/uploads/confirm` - `contentType` optional — inferred from extension when omitted 3. `POST /v1/projects/{id}/deployments` → returns `phase`, `checksUrl`, `checksResults` when ready 4. **Poll** `GET /v1/projects/{id}/deployments/latest` until `deployment.status` is `live` or `failed` (do **not** poll project `status`) 5. Read checks: response field `checksResults` or `GET /v1/projects/{id}/checks` 6. Open `https://{suffix}.novence.ai/` (also returned as `project.url`) ## robots.txt Customer-uploaded `/robots.txt` is authoritative. Novence does **not** inject Cloudflare managed AI-crawler blocks. Site owners control crawl policy. ## Custom domains Verified Free includes **1** domain; Pro/Scale include more (soft overage **$1**/domain-mo). `POST /v1/projects/{id}/domains` with hostname. Required DNS: 1. CNAME `www` → `fallback.novence.ai` 2. Registrar URL redirect apex → `https://www.{domain}/` ## Forms (optional) Contact/lead forms are **optional**. Choose one: ### Novence Forms 1. `POST /v1/projects/{id}/forms` `{ "name", "fields": [{ "name", "type", "required"? }] }` (email must be verified) 2. Point the site form at same-origin `POST /__forms/{formId}` **or** `POST https://api.novence.ai/v1/public/forms/{formId}/submissions` (JSON or urlencoded) 3. Include honeypot field `_gotcha` (hidden). Submissions stored + emailed to `notifyEmail` (default account email) 4. List: `GET …/forms/{formId}/submissions` (also in local console-kit project view) 5. Quotas: Free **50**/mo (hard); Pro **2,000** / Scale **20,000** included; Pro/Scale soft overage **$0.005**/submission ### BYO (Formspree, Web3forms, custom) Wire `