Developer docs

Nova API

OpenAI-compatible HTTP API. Nova is a gateway/orchestration layer — upstream providers own their models.

Introduction

Positioning: Nova API is an API gateway / orchestration layer over configured providers. Do not treat model IDs as Nova-owned products.

Base URL: https://www.novabrain.online/api/v1

  • POST /chat/completions — chat (+ stream)
  • GET /models — models allowed for your key
  • GET /usage — usage summary

Quick Start

  1. Sign in and open My Studio → Nova API.
  2. Click Create Key and copy nv_live_… immediately (shown once).
  3. Send a completion request:
curl https://www.novabrain.online/api/v1/chat/completions \
  -H "Authorization: Bearer nv_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "nova-auto",
    "messages": [
      {"role": "user", "content": "Hello"}
    ]
  }'

Playground

Run a real request without writing code. The playground uses a session-authenticated server proxy — it never puts your Nova API key in the URL and never exposes provider secrets.

Live

Try Nova API

Real requests via a secure session proxy — your Nova key never goes in the URL, and provider secrets never reach the browser.

Sign in to run a real playground request against your API wallet.

Authentication

Every gateway request requires a Bearer Nova API key (not a provider secret):

Authorization: Bearer nv_live_YOUR_KEY

Keys are stored hashed. Provider API keys never appear in responses or client-facing pages.

Models Try it

nova-auto is a router alias. You may also pass explicit model IDs allowed for your key. Enabled catalog (live registry):

Live from the pricing registry · Nova markup 20% included in Nova prices · updates without redeploy

ModelProviderInput / 1MOutput / 1MStatus
gemini-1.5-flashgemini$0.090$0.360Enabled
gemini-2.0-flashgemini$0.120$0.480Enabled
gemini/gemini-2.0-flashgemini$0.120$0.480Enabled
groq/llama-3.3-70b-versatilegroq$0.708$0.948Enabled
llama-3.1-8b-instantgroq$0.060$0.096Enabled
llama-3.3-70b-versatilegroq$0.708$0.948Enabled
moonshot-v1-8kkimi$0.240$0.240Enabled
moonshot-v1-autokimi$0.240$0.240Enabled
nova-autonova$0.300$0.960Enabled
gpt-4oopenai$3.00$12.00Enabled
gpt-4o-miniopenai$0.180$0.720Enabled
openai/gpt-4oopenai$3.00$12.00Enabled
openai/gpt-4o-miniopenai$0.180$0.720Enabled
anthropic/claude-3.5-sonnetopenrouter$3.60$18.00Enabled
google/gemini-2.0-flash-001openrouter$0.120$0.480Enabled
openai/gpt-4o-miniopenrouter$0.180$0.720Enabled
openrouter/autoopenrouter$0.240$0.960Enabled
kimi-k3starimg$0.240$0.240Enabled

List models for your key: GET https://www.novabrain.online/api/v1/models

Chat Completions Try it

POST https://www.novabrain.online/api/v1/chat/completions

{
  "model": "nova-auto",
  "messages": [
    {"role": "user", "content": "Hello"}
  ],
  "temperature": 0.7,
  "max_tokens": 256
}

Successful responses are OpenAI-compatible JSON, for example:

{
  "id": "chatcmpl_…",
  "object": "chat.completion",
  "created": 1710000000,
  "model": "nova-auto",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "Hello!" },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 12,
    "completion_tokens": 4,
    "total_tokens": 16
  }
}

Response headers may include x-nova-request-id, x-nova-provider, and x-nova-charged-usd.

Streaming Try it

Set "stream": true for Server-Sent Events. Chunks are data: {...} lines ending with data: [DONE]. Usage is settled once after the stream completes.

curl https://www.novabrain.online/api/v1/chat/completions \
  -H "Authorization: Bearer nv_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -N \
  -d '{
    "model": "nova-auto",
    "messages": [{"role": "user", "content": "Say hi"}],
    "stream": true
  }'

Usage

GET https://www.novabrain.online/api/v1/usage returns token totals and remaining quota for the authenticated key. The dashboard at /my-studio?ucc=api shows balance, spent, requests, and recent usage.

Errors

Errors follow OpenAI-style JSON:

{
  "error": {
    "message": "…",
    "type": "…",
    "param": null,
    "code": "…"
  }
}
  • 401 invalid_api_key — missing/invalid Bearer key
    {
      "error": {
        "message": "Invalid API key.",
        "type": "invalid_request_error",
        "param": null,
        "code": "invalid_api_key"
      }
    }
  • 402 insufficient_credits — wallet cannot cover the estimated cost (provider is not called)
    {
      "error": {
        "message": "Insufficient Nova API credits",
        "type": "insufficient_credits",
        "param": null,
        "code": "insufficient_credits"
      }
    }
  • 429 rate_limit — per-key RPM or quota exhausted (rate_limit_exceeded / insufficient_quota)
  • Provider errors — mapped to safe codes such as provider_unavailable, provider_rate_limit, provider_auth_error (no upstream secrets leaked)
  • Invalid model — model not allowed for the key (model_not_allowed, HTTP 403)
  • Validation errors — e.g. missing messages array (invalid_request / invalid_json)

Rate Limits

Each key has an RPM limit (default applied at creation). Exceeding it returns 429 with Retry-After. Optional monthly token quotas apply per user/project.

API Keys

Create and revoke keys only from the dashboard (session auth). The public product pages never display provider secrets or internal configuration.

Open key management →

Credits

API usage debits a dedicated API credits wallet (separate from social/other wallets). New wallets may receive $1 free credit when enabled. Top up with Add API Credits — same NowPayments flow, plan api_credits.

Add API Credits

OpenAI SDK

Point the official SDK at Nova:

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.NOVA_API_KEY,
  baseURL: "https://www.novabrain.online/api/v1"
});

JavaScript

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.NOVA_API_KEY,
  baseURL: "https://www.novabrain.online/api/v1",
});

const completion = await client.chat.completions.create({
  model: "nova-auto",
  messages: [{ role: "user", content: "Hello from Nova API" }],
});

console.log(completion.choices[0]?.message?.content);

// Streaming
const stream = await client.chat.completions.create({
  model: "nova-auto",
  messages: [{ role: "user", content: "Stream a short hello" }],
  stream: true,
});
for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content || "");
}

Python

from openai import OpenAI
import os

client = OpenAI(
    api_key=os.environ["NOVA_API_KEY"],
    base_url="https://www.novabrain.online/api/v1",
)

completion = client.chat.completions.create(
    model="nova-auto",
    messages=[{"role": "user", "content": "Hello from Nova API"}],
)
print(completion.choices[0].message.content)

# Streaming
stream = client.chat.completions.create(
    model="nova-auto",
    messages=[{"role": "user", "content": "Stream a short hello"}],
    stream=True,
)
for chunk in stream:
    delta = chunk.choices[0].delta.content or ""
    print(delta, end="")

cURL

curl https://www.novabrain.online/api/v1/chat/completions \
  -H "Authorization: Bearer nv_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "nova-auto",
    "messages": [
      {"role": "user", "content": "Hello"}
    ]
  }'