Jev API Access Routes: Official Endpoint, OpenCode Zen and OpenRouter
There are three ways to put the Jev API behind your code as of November 2026: the official TypeSafe endpoint at api.typesafe.ai, OpenCode’s Zen gateway which carries both a paid and a free Jev 1.13 entry, and OpenRouter. This page is the route sheet — what each one actually serves, what the endpoints return when you probe them without a key, and what a channel costs at the request volumes people actually run.
It is written because the failure modes differ per route, and the most-asked problem is not about prompts. It is about access: a console that refuses to mint a key, a region that returns 451, a model slug that resolves on one gateway and is absent from the other’s catalogue listing. None of those are fixed by editing your request body.
What you can rely on here: every price, limit and error string on this page comes from TypeSafe’s own documentation, OpenCode’s Zen documentation, or a curl probe run on 2026-11-07 (CST) whose HTTP status is quoted alongside the claim. Where a fact could not be verified — for example whether the free Zen variant answers without billing details — the text says so instead of guessing.
The three routes at a glance
| Official TypeSafe API | OpenCode Zen | OpenRouter | |
|---|---|---|---|
| Base URL | https://api.typesafe.ai | https://opencode.ai/zen/v1 | https://openrouter.ai/api/v1 |
| Jev path | POST /v1/systemone | POST /systemone | chat-completions style; Jev Router advertised |
| Models named in docs | jev-1.14.0, jev-1.13.0, jev-latest | jev-1.13, jev-1.13-free | typesafe/jev-router, typesafe/jev-1.14 |
| Free option | none | jev-1.13-free, limited time | none documented |
| Price quoted | $42 / Btok input, output free | per-model; free variant documented | router lists -1 (no price) |
| Auth | Authorization: Bearer <TYPESAFE_API_KEY> | Zen API key, same header shape | sk-or-v1-… key |
| Verified today | 451 from CN egress | endpoint live (401 on bogus key) | catalogue + endpoint lookup 200 |
The rows are not equivalent products, and that is the point. TypeSafe is the first-party service; OpenCode Zen is a reseller that speaks the same request body on a different host; OpenRouter is a marketplace whose TypeSafe entry is a router rather than a pinned model. Pick the route by which of those three shapes your organisation can actually bill and reach.
Route A — the official endpoint
TypeSafe serves every model on one path: POST /v1/systemone, with the model field selecting jev-1.14.0, jev-1.13.0, or the jev-latest alias. The documented price is a single line: $42 per billion input tokens, or $0.042 per million; output tokens are free. Two context limits apply per request — 64k for the whole request and 32k for any single question — and both rise to 262k when you send the TypeSafe-Danger-Zone-Long-Context: true header, which works on 1.14 and 1.13.
The request rules are strict in ways that bite people who treat this as a chat API. The body must be UTF-8 JSON without a BOM, at most 32 MiB, with at most 64 levels of nesting in state, instructions and criteria. Numbers must be finite: NaN, Infinity and overflow values like 1e400 are rejected, and large identifiers must be sent as strings. Compression is supported through Content-Encoding: gzip or zstd, one layer only, with zstd’s window capped at 8 MiB.
The error map is correspondingly specific, and it is the clearest fingerprint of this route:
400— a request rule broken (bad UTF-8, too deep, non-finite number, malformed compressed body), ormax_tokens_exceededwhen the request exceeds the context length401— missing or invalid key; check theAuthorizationheader413— body over 32 MiB415— unsupported or multipleContent-Encoding422— body failed validation, e.g. a malformed question; the body names the offending field429/529— rate limited or TypeSafe overloaded; both are backoff-and-retry, and the official SDKs do that for you
The access problem on this route is billing, not code. The console gates key creation on a positive balance. TypeSafe’s own X account announced in late September 2026 that new signups no longer receive free credits, and a zero-balance organisation is refused at key creation rather than at the first request. If you are staring at a key form that will not submit, the missing step is a top-up in Billing, and no amount of re-registering changes it.
The second access problem is regional. From a Guangdong mobile connection on 2026-11-07, GET https://api.typesafe.ai/v1/models returned:
HTTP/2 451
{"title":"Typesafe is not available in your region.","status":451}
The same 451 came back on POST /v1/systemone, and the response carried a Cloudflare cf-ray header, so this is an application-level geo decision served through the CDN, not a blocked socket. 451 Unavailable For Legal Reasons does not clear with retries, different keys, or a different HTTP client on the same network. If your production egress is in a region the service declines to serve, the official route is closed to you regardless of your balance, and Route B or C is the practical answer.
Route B — OpenCode Zen, including the free variant
OpenCode’s Zen documentation lists exactly two Jev entries in its model table:
| Model | Model ID | Endpoint |
|---|---|---|
| Jev 1.13 | jev-1.13 | https://opencode.ai/zen/v1/systemone |
| Jev 1.13 Free | jev-1.13-free | https://opencode.ai/zen/v1/systemone |
The path is /zen/v1/systemone, not /v1/systemone, and the request body is the TypeSafe body — model, state, questions, with type set to noul, choice or score. The Zen docs’ own example sends "model": "jev-1.13" and a noul question about urgency, and then notes: use jev-1.13-free instead of jev-1.13 to use the limited-time free model. Inside OpenCode itself the model id is prefixed, so a config entry reads opencode/jev-1.13.
Two honest caveats, both probed rather than assumed:
- The endpoint is live but the catalogue listing disagrees with the docs.
POST https://opencode.ai/zen/v1/systemonewith a deliberately invalid credential returned401 {"error":{"type":"authentication_error","message":"Invalid credential"}}— proof the route exists and authenticates. ButGET https://opencode.ai/zen/v1/modelsreturned 81 models and none of them was ajev-*id, even though the documentation table lists two. Treat the models endpoint as authoritative for chat models only, and take the Jev ids from the docs page. - “Limited time” is not a date. The docs say the free variant is available for a limited time and give no end date. Anything you build on
jev-1.13-freeneeds a fallback path, and Zen’s setup flow asks for billing details before it hands you a key, which is the usual pattern for a free tier you can lose.
The structural catch is version lag. Zen carries 1.13. If you need Box questions, they are 1.14-only, and the free entry is not the place to find them.
Route C — OpenRouter
OpenRouter is the route this site has covered most, and the catalogue behaves in a way worth spelling out because it confuses people auditing their own integration. On 2026-11-07 the full catalogue call returned 460 models, and exactly one carried a TypeSafe prefix: typesafe/jev-router, with context_length 1000000 and pricing of -1 for both prompt and completion. The per-model endpoint lookup for the router returned an endpoints array that was empty:
GET /api/v1/models/typesafe/jev-router/endpoints → 200
{"data":{...,"pricing":{"prompt":"-1","completion":"-1"}, "endpoints":[]}}
The pinned version tells a different story. GET /api/v1/models/typesafe/jev-1.14/endpoints returned 200 with one endpoint object: upstream name typesafe/jev-1.14-20261014, context_length 262144, max_completion_tokens 235929, prompt price 0.000000042 and completion price 0, reported 30-minute and 24-hour uptime of 100. Multiplied out, 0.000000042 per token is exactly the $0.042 per million the TypeSafe docs quote, which is a useful cross-check that the marketplace listing is a passthrough of the first-party price rather than a markup.
Read together: the router is advertised without a price and without live endpoints; the pinned 1.14 entry is priced and served. A -1 price is not “free” — OpenRouter’s error documentation is explicit that 402 means insufficient credits, and a request that any provider can serve but that has no resolvable price should be treated as a routing request, not a purchase. If you need a deterministic bill, pin the version instead of the router.
OpenRouter’s failure vocabulary also differs from TypeSafe’s, which is why the route matters at the integration layer: 402 for insufficient credits (check error.metadata.limit_source — openrouter_in_flight_budget means wait for Retry-After and retry, openrouter_key_limit means the key’s cap is spent), 403 for a budget or guardrail stop, 429 for rate limiting, 502 when the chosen model is down, 503 when no provider meets your routing requirements. GET /api/v1/key reports limit_remaining, which is the cheapest possible pre-flight check before a batch run.
What a channel costs, in requests rather than tokens
Per-token pricing is hard to feel. Here is the same number expressed per thousand requests, using the documented $0.042 per million input tokens and assuming the whole request is input (output is free, so the assumption is conservative):
| Input tokens per request | Cost per request | Cost per 1,000 requests |
|---|---|---|
| 120 | $0.00000504 | $0.0050 |
| 332 | $0.0000139 | $0.0139 |
| 1,000 | $0.000042 | $0.042 |
| 2,000 | $0.000084 | $0.084 |
| 64,000 (default per-request cap) | $0.00269 | $2.69 |
The 332-token row is not invented — it is usage.input_tokens from TypeSafe’s own documented response for a short support message with one Score question. The lesson is that Jev’s cost curve is flat enough that question count barely registers and state size dominates: five short questions on a short state still land in the sub-cent-per-thousand band, while one question on a 64k contract is two orders of magnitude dearer. If you are budgeting, measure input_tokens on a real sample and multiply, rather than reasoning from the per-question count.
A five-minute verification before you commit
Do this in the network your production code will use, because the interesting failures are network-level. Four probes, no key required:
# 1. Is the first-party host willing to talk to this network at all?
curl -s -o /dev/null -w 'typesafe models: %{http_code}\n' \
https://api.typesafe.ai/v1/models
# 2. Does the Zen systemone route exist and authenticate?
curl -s -o /dev/null -w 'zen systemone: %{http_code}\n' \
-X POST https://opencode.ai/zen/v1/systemone \
-H 'Authorization: Bearer invalid' -H 'Content-Type: application/json' \
-d '{"model":"jev-1.13","state":"hi","questions":{"q":{"type":"noul","instructions":"Is this a greeting?"}}}'
# 3. Is there a priced Jev 1.14 endpoint on OpenRouter?
curl -s https://openrouter.ai/api/v1/models/typesafe/jev-1.14/endpoints \
| python3 -c "import json,sys;d=json.load(sys.stdin)['data'];[print(e['name'],e['context_length'],e['pricing']) for e in d['endpoints']]"
# 4. Does the router advertise live endpoints today?
curl -s https://openrouter.ai/api/v1/models/typesafe/jev-router/endpoints \
| python3 -c "import json,sys;d=json.load(sys.stdin)['data'];print('pricing',d['pricing'],'endpoints',len(d['endpoints']))"
Expected readings from a working network: 200 for probe 1 or a documented 451 if your region is declined; 401 for probe 2 — a 401 means the route exists, a 404 means the path moved; a printed endpoint line for probe 3; pricing {'prompt': '-1', ...} endpoints 0 for probe 4, which is the current state of the router and not a fault on your side.
Anything else — a timeout, a TLS reset, a Cloudflare challenge page — is a network fact about your egress, and it will not be fixed in application code. That distinction is worth ten minutes of measurement before a migration meeting.
Choosing between them
- You need the newest model, images, Box questions or the long-context header. Official endpoint or OpenRouter’s pinned
typesafe/jev-1.14. Box questions are 1.14-only and both the images and Box features are marked Dreamer-ready, so pin a version and expect the shape to move. - You are prototyping and want to spend nothing. OpenCode Zen’s
jev-1.13-free, with a paid fallback wired in from day one, because the offer has no published end date. - You cannot reach
api.typesafe.aifrom your network. Route B or C. A 451 does not negotiate. - You need a list price you can reconcile against an invoice. OpenRouter’s pinned endpoint, whose
0.000000042matches TypeSafe’s published $0.042 per million exactly. - You want the marketplace to choose the model for you. The router — but accept that it currently advertises
-1pricing and zero endpoints, and put a hard budget guardrail between it and production.
Whichever you pick, isolate the choice behind one client function. All three routes take the same state plus typed questions body and return the same answer shapes, so the migration cost is a base URL, a key and a model id — provided you never let the model id leak into ten files. The channel comparison and migration runbook covers that adapter in full, and the official SDK guide covers the client that speaks Route A natively.