The Navōn API
Build on AI with Navōn’s standards built in. Every question and every answer goes through the same filter as the app, so what your users see is what you’d want them to see.
Works with the OpenAI SDKs
Change the base URL and the key. Your existing code, streaming included, keeps working.
Filtered both ways
The question is checked before it reaches a model, and the answer is checked before it reaches you. Nothing is released until it passes.
Your own policy
A key carries its account’s filter settings, so strictness, subjects to keep off and Torah-learning mode apply to your app too.
Your first request
- 1. Make a key at navon.org/developers/keys. It’s shown once, so keep it somewhere safe.
- 2. Point any OpenAI client at
https://api.navon.org/functions/v1/api/v1 - 3. Send it as
Authorization: Bearer nvn_…, from your server. Never put a key in a browser or an app people can download.
curl https://api.navon.org/functions/v1/api/v1/chat/completions \
-H "Authorization: Bearer $NAVON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "auto",
"messages": [
{ "role": "system", "content": "You help 5th graders with Chumash." },
{ "role": "user", "content": "Why did Yaakov work fourteen years for Rachel?" }
]
}'Endpoints
A reply to a conversation. OpenAI's request and response shape; `stream: true` works. `model` can be "auto" to let Navōn choose.
A picture from a prompt. `model`, `size` (1024x1024, 1536x1024, 1024x1536), `response_format` (url or b64_json).
Check text against your Navōn policy without generating anything. Up to 20 inputs at a time.
The models your key can use.
When something is refused
A chat request that Navōn won’t answer isn’t an error. Like OpenAI’s own content filter, it comes back as a normal completion with finish_reason: "content_filter" and a kind reply your app can show as it is.
Every response carries a navon object: whether anything was blocked, at which stage, and why. With model: "auto" it also says which model answered.
Streaming begins once the answer has passed the check, so a withheld answer never reaches your users half-written. Expect a few seconds for the checks on every request.
{
"object": "chat.completion",
"model": "gemini-3.7-flash",
"choices": [{
"message": { "role": "assistant", "content": "I can't help with that kind of story. How about …" },
"finish_reason": "content_filter"
}],
"navon": {
"blocked": true,
"stage": "input", // "input": the question was refused; "output": the answer was withheld
"category": "untouchable",
"reason": "The request asks for explicit content.",
"suggestion": "Perhaps a story about …"
}
}What you can ask for
Chat
Images
¹ Adult accounts only. The list your own key can use is at GET /models.
The fine print
Who can have a key. An approved adult account on a paid plan (Pro, Family, or a school’s admin). Accounts supervised by a parent or a school can’t.
Limits. 60 requests a minute per key, on top of your account’s own limits: 30 a minute and 400 an hour for text, 8 a minute and 60 an hour for pictures. Included in your plan, with no extra charge.
Your data. Requests are kept as part of your account, like your chats in the app, and never used to train a model.