Candor API

OpenAI-compatible chat completions for uncensored models. Streaming, tool calling and usage reporting work with the official OpenAI SDKs.

Quickstart in 60s

New accounts get $0.47 of free credit to try the API, once per person.

  1. Sign in to the app.
  2. Subscribe when the free credit runs out, at Account: Monthly $19.99/month, includes 8,500 credits ($20.00 of API usage), or Plus $99/month, includes 42,500 credits ($100.00 of API usage).
  3. Optional top-ups on the same page: $9.99 for 4,250 credits ($10.00 of API usage), subscribers only.
  4. Create a key under Account > API keys (shown once) and export CANDOR_API_KEY=sk-unc-...
  5. Paste one command:
Claude Code
claude mcp add --transport http candor https://candorai.dev/mcp --header "Authorization: Bearer $CANDOR_API_KEY"

That's it: ask your agent to use candor. Tools: chat, list_models, candor_balance, list_characters, web_search.

Try it

Send one request from this page with your own key. The key stays in this field: it is sent only to this site's /v1, and it is not saved. The request uses your credits like any other.


Building with a coding assistant

Give your assistant this one address and it has everything it needs, written for it: https://candorai.dev/agents.md. It covers the models and prices, the smallest working call, and the rules that avoid the usual mistakes (always send max_tokens, never retry a 402, wait on a 429).

Other agents (remote MCP)

Endpoint https://candorai.dev/mcp (Streamable HTTP) with header Authorization: Bearer sk-unc-.... Nothing to install.

Cursor: ~/.cursor/mcp.json
{
  "mcpServers": {
    "candor": {
      "url": "https://candorai.dev/mcp",
      "headers": {
        "Authorization": "Bearer sk-unc-..."
      }
    }
  }
}
Windsurf: ~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "candor": {
      "serverUrl": "https://candorai.dev/mcp",
      "headers": {
        "Authorization": "Bearer sk-unc-..."
      }
    }
  }
}
Codex: ~/.codex/config.toml (export CANDOR_API_KEY first)
[mcp_servers.candor]
url = "https://candorai.dev/mcp"
bearer_token_env_var = "CANDOR_API_KEY"
Claude Desktop: claude_desktop_config.json (via mcp-remote)
{
  "mcpServers": {
    "candor": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://candorai.dev/mcp",
        "--header",
        "Authorization:${CANDOR_AUTH}"
      ],
      "env": {
        "CANDOR_AUTH": "Bearer sk-unc-..."
      }
    }
  }
}

OpenAI-compatible SDKs

Base URL https://candorai.dev/v1, your key as the API key.

curl
curl https://candorai.dev/v1/chat/completions \
  -H "Authorization: Bearer $CANDOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"candor-classic","max_tokens":512,"messages":[{"role":"user","content":"Hello"}]}'
Python (openai)
# pip install openai
import os
from openai import OpenAI

client = OpenAI(base_url="https://candorai.dev/v1", api_key=os.environ["CANDOR_API_KEY"])
stream = client.chat.completions.create(
    model="candor-fast",
    messages=[{"role": "user", "content": "Write a limerick about the sea."}],
    max_tokens=512,
    stream=True,
)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")
JavaScript (openai)
// npm install openai
import OpenAI from "openai";

const client = new OpenAI({ baseURL: "https://candorai.dev/v1", apiKey: process.env.CANDOR_API_KEY });
const completion = await client.chat.completions.create({
  model: "candor-smart",
  messages: [{ role: "user", content: "Explain quicksort in three sentences." }],
  max_tokens: 512,
});
console.log(completion.choices[0].message.content);
LangChain (Python)
# pip install langchain-openai
import os
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="candor-classic", max_tokens=512, base_url="https://candorai.dev/v1", api_key=os.environ["CANDOR_API_KEY"])
print(llm.invoke("Give me three blunt tips for a first marathon.").content)
Vercel AI SDK
// npm install ai @ai-sdk/openai-compatible
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
import { generateText } from "ai";

const candor = createOpenAICompatible({ name: "candor", baseURL: "https://candorai.dev/v1", apiKey: process.env.CANDOR_API_KEY });
const { text } = await generateText({ model: candor("candor-fast"), maxOutputTokens: 512, prompt: "Summarise the plot of Hamlet in two lines." });
console.log(text);

Guides by tool

Any tool that speaks the OpenAI format works with three values: the base URL https://candorai.dev/v1, your key, and a model id (candor-fast, candor-classic, candor-smart). Prefer Postman? Download the collection, import it, and set its CANDOR_API_KEY variable.

Cline and Roo Code (VS Code): Settings > API Provider > OpenAI Compatible
Base URL:  https://candorai.dev/v1
API Key:   sk-unc-...
Model ID:  candor-smart
Continue (VS Code, JetBrains): ~/.continue/config.yaml, under models
models:
  - name: Candor Smart
    provider: openai
    model: candor-smart
    apiBase: https://candorai.dev/v1
    apiKey: sk-unc-...
aider: your shell
export OPENAI_API_BASE=https://candorai.dev/v1
export OPENAI_API_KEY=$CANDOR_API_KEY
aider --model openai/candor-smart
Open WebUI: Admin Panel > Settings > Connections > OpenAI API > add a connection
URL:  https://candorai.dev/v1
Key:  sk-unc-...
LibreChat: librechat.yaml (set CANDOR_API_KEY in .env)
endpoints:
  custom:
    - name: "Candor"
      apiKey: "${CANDOR_API_KEY}"
      baseURL: "https://candorai.dev/v1"
      models:
        default: ["candor-fast", "candor-classic", "candor-smart"]
        fetch: true
      titleConvo: true
      titleModel: "candor-fast"
SillyTavern: API Connections > API: Chat Completion > Chat Completion Source: Custom (OpenAI-compatible)
Custom Endpoint (Base URL):  https://candorai.dev/v1
Custom API Key:              sk-unc-...
Model ID:                    candor-classic
n8n: Credentials > OpenAI, then pick the credential in an OpenAI Chat Model node and type the model id
API Key:   sk-unc-...
Base URL:  https://candorai.dev/v1
Model:     candor-smart (by ID)
LiteLLM (Python): your code
# pip install litellm
import os
from litellm import completion

reply = completion(
    model="openai/candor-smart",
    api_base="https://candorai.dev/v1",
    api_key=os.environ["CANDOR_API_KEY"],
    max_tokens=300,
    messages=[{"role": "user", "content": "Hello"}],
)
print(reply.choices[0].message.content)

Models and pricing

USD per 1M tokens.

ModelInputCached inputOutputContextNotes
candor-fast$0.45$0.045$1.45200kFastest and cheapest. Uncensored general chat with optional reasoning and tool calls. Accepts images.
candor-classic$1.00$0.10$3.00128kBalanced default. The least filtered model, tuned for open-ended dialogue and roleplay. Accepts images.
candor-smart$3.00$0.30$5.001,000kStrongest reasoning, coding and agentic tool use. 1M-token context.

Give a model fresh facts. Add "web_search": true to a chat request: Candor searches the web for the user's message, hands the results to the model, and returns them with the answer (web_search.results) so you can show the sources. Or call POST /v1/web/search yourself and get up to 6 results as JSON. A search costs about $0.029 (the exact charge is in the response); $0.080 is set aside while it runs. A search that could not run costs nothing. Only the search words leave Candor.

Answer from the web
curl https://candorai.dev/v1/chat/completions \
  -H "Authorization: Bearer $CANDOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"candor-smart","web_search":true,"max_tokens":400,"messages":[{"role":"user","content":"What changed in the latest Python release?"}]}'
Search only
curl https://candorai.dev/v1/web/search \
  -H "Authorization: Bearer $CANDOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"price of a monthly Navigo pass in 2026"}'

Characters

Candor's characters can be played through the API. GET /v1/characters lists them (companions, roleplay, stories, games, advisors) with a name, a tagline, tags, a picture and a first message. Add "character" to a chat request and the model answers as that character, on the model you name and at that model's price; the character's instructions are added by the server and billed as input (each character says about how many tokens). The API keeps nothing between requests: send the whole conversation each time.

Talk to a character
curl https://candorai.dev/v1/chat/completions \
  -H "Authorization: Bearer $CANDOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"candor-classic","character":"brooke","max_tokens":300,"messages":[{"role":"user","content":"hey, how was your day?"}]}'

Billing

New accounts get $0.47 of free credit to try the API, once per person. While an account has only free credit, it is allowed 10 requests per minute and max_tokens is capped at 2,000 per request (larger values are clamped). Free credit is spent first. The API spends the same wallet as the app: subscription credits (Monthly $19.99/month, includes 8,500 credits ($20.00 of API usage); Plus $99/month, includes 42,500 credits ($100.00 of API usage)) and top-ups ($9.99 for 4,250 credits ($10.00 of API usage), subscribers only), bought at Account. 1 USD = 425 credits. Each request is charged exactly from the token usage the model reports. You can never spend more than your balance: before a request runs, the most it could cost (the prompt at one token per byte, plus max_tokens of output) is set aside, then replaced by the actual charge. Set max_tokens to set aside less. Requests are refused with 402 insufficient_quota below $0.01 of credit, or when the balance cannot cover the request, with this message: Subscribe at https://candorai.dev/?panel=account: Monthly $19.99/month, includes 8,500 credits ($20.00 of API usage), or Plus $99/month, includes 42,500 credits ($100.00 of API usage). Subscribers can also add top-ups there: $9.99 for 4,250 credits ($10.00 of API usage). Then retry. Rate limit: 60 requests per minute per account.

Endpoints

Errors use the OpenAI shape {"error":{"message","type","param","code"}}. The complete reference is in llms-full.txt and openapi.json; the same endpoints as a Postman collection.

PrivacyTermsSupport