Connect your tools to the Reeva AI API in five minutes
By Reeva Team · October 2, 2026 · Updated October 15, 2026
The Reeva AI Models API speaks the OpenAI API. If a tool or library can talk to OpenAI, it can talk to Reeva: you change two settings and pick a model. Here’s how.
What you need
- A Reeva AI API key. Choose a plan on the AI Models API page. Your first key is issued as soon as the PayPal payment clears.
- The base URL:
https://api.reeva.me/v1 - A model name:
deepseek-v4.1-flashfor chat, text, code and agents, orqwen-imagefor images. - Also available:
qwen3.6-35b-a3b(Qwen 3.6), a light model for short, quick tasks. - Embeddings, on Pro and Scale:
nemotron-embed-8bfor documents andnemotron-embed-8b-queryfor search questions.
Create a separate key for each tool, with a name you’ll recognize. You can have up to 10, and
revoking one doesn’t affect the others. Keep keys in an environment variable, not in your code.
The examples below read the key from REEVA_API_KEY.
Python
Install the official OpenAI library with pip install openai, then point it at Reeva:
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.reeva.me/v1",
api_key=os.environ["REEVA_API_KEY"],
)
r = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[{"role": "user",
"content": "Summarize this email in three bullets"}],
)
print(r.choices[0].message.content)
Node.js
Install the library with npm install openai, then save this as index.mjs and run it with
node index.mjs:
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.reeva.me/v1",
apiKey: process.env.REEVA_API_KEY,
});
const r = await client.chat.completions.create({
model: "deepseek-v4.1-flash",
messages: [{ role: "user", content: "Write a Python function that checks a number with the Luhn algorithm." }],
});
console.log(r.choices[0].message.content);
curl
A chat request:
curl https://api.reeva.me/v1/chat/completions \
-H "Authorization: Bearer $REEVA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4.1-flash",
"messages": [{"role": "user", "content": "Translate to French: Same-day repairs, guaranteed."}]
}'
An image:
curl https://api.reeva.me/v1/images/generations \
-H "Authorization: Bearer $REEVA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-image",
"prompt": "A winter campaign banner in pink and purple, no text",
"n": 1
}'
An image takes longer to come back than a text answer.
Coding tools
opencode, Cline, Continue, Aider and Roo Code can all use an OpenAI-compatible provider. Each one has its own settings screen or config file, but you set the same things in each:
- Provider: OpenAI-compatible, or OpenAI with a custom base URL
- Base URL:
https://api.reeva.me/v1 - API key: your Reeva key
- Model:
deepseek-v4.1-flashfor coding, agents, quick edits and chat
In Aider, for example, it takes two environment variables and a model name:
export OPENAI_API_BASE=https://api.reeva.me/v1
export OPENAI_API_KEY=$REEVA_API_KEY
aider --model openai/deepseek-v4.1-flash
Embeddings (Pro and Scale)
Pro and Scale include embeddings on /v1/embeddings, from nvidia’s Nemotron-3-Embed-8B. The model has
two ids, and a search needs both: nemotron-embed-8b for the documents you store and
nemotron-embed-8b-query for the questions you search with. Using one id for both returns no error,
but the search ranks the results much worse.
docs = ["Invoices are due 30 days after issue.",
"Refunds go back to the original card."]
d = client.embeddings.create(model="nemotron-embed-8b", input=docs)
q = client.embeddings.create(model="nemotron-embed-8b-query",
input="When is an invoice due?")
# The vectors are normalized: a dot product is the cosine similarity.
qv = q.data[0].embedding
scores = [sum(a * b for a, b in zip(qv, x.embedding)) for x in d.data]
print(docs[scores.index(max(scores))])
The vectors have 4096 dimensions. A request takes up to 64 inputs and 120,000 characters in total.
Each input is embedded up to 4,096 tokens, and longer text is cut without an error (the response’s
usage.prompt_tokens stops at 4,096), so split long documents into chunks before you embed them.
Your plan’s per-request size limit is for chat and does not apply here, but embedding tokens count
the same as chat tokens.
Limits and errors
Tokens are unlimited, but each plan sets limits per minute, on requests at once and per request. This is what happens when you go over one.
- HTTP 429, too many requests per minute. The window resets every minute, so retry within a minute. Mini allows 5 requests a minute, Starter 20, Pro 60 and Scale 120.
- Too many requests at once: the request waits. It starts as soon as one of your own running requests finishes. If no slot frees up within two minutes, it is refused with HTTP 429. Mini runs 1 request at a time, Starter 2, Pro 4 and Scale 8.
- HTTP 429, too many images in one request. One request can ask for up to 3 images (
n) on Mini, 10 on Starter and 16 on Pro and Scale. A biggernis refused at once; ask for fewer. - Fair use. Heavy use slows your requests down. Only extreme use sustained over a full day is paused until it eases; requests get HTTP 429 during the pause.
- HTTP 400,
request_too_large. The request is bigger than your plan allows: 32k tokens on Mini and 128k on Starter and Pro. Scale has no cap of its own, only DeepSeek v4.1’s 256k-token context. The size counts your prompt plus themax_tokensyou ask for, and it is checked before the request runs. Shorten the prompt or lowermax_tokens. Qwen 3.6 has its own limit of 32k tokens per request on every plan; a request over it is also refused with HTTP 400.gpt-oss-20bhas been retired, and requests that name it are refused. Usedeepseek-v4.1-flashfor code and agents. - HTTP 401. The key isn’t valid, for example because it was revoked.
The OpenAI SDKs for Python and Node.js retry a 429 on their own, with backoff.
Next steps
Choose your plan on the AI Models API page, or read the launch announcement for the full plan comparison.