Jev API Access Routes: Official Endpoint, OpenCode Zen and OpenRouter

Updated Applies to Jev 1.14

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 APIOpenCode ZenOpenRouter
Base URLhttps://api.typesafe.aihttps://opencode.ai/zen/v1https://openrouter.ai/api/v1
Jev pathPOST /v1/systemonePOST /systemonechat-completions style; Jev Router advertised
Models named in docsjev-1.14.0, jev-1.13.0, jev-latestjev-1.13, jev-1.13-freetypesafe/jev-router, typesafe/jev-1.14
Free optionnonejev-1.13-free, limited timenone documented
Price quoted$42 / Btok input, output freeper-model; free variant documentedrouter lists -1 (no price)
AuthAuthorization: Bearer <TYPESAFE_API_KEY>Zen API key, same header shapesk-or-v1-… key
Verified today451 from CN egressendpoint 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:

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:

ModelModel IDEndpoint
Jev 1.13jev-1.13https://opencode.ai/zen/v1/systemone
Jev 1.13 Freejev-1.13-freehttps://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:

  1. The endpoint is live but the catalogue listing disagrees with the docs. POST https://opencode.ai/zen/v1/systemone with a deliberately invalid credential returned 401 {"error":{"type":"authentication_error","message":"Invalid credential"}} — proof the route exists and authenticates. But GET https://opencode.ai/zen/v1/models returned 81 models and none of them was a jev-* 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.
  2. “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-free needs 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 requestCost per requestCost 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

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.

Frequently asked questions

+ Can I use the Jev API for free?

There is no free tier from TypeSafe itself. OpenCode's Zen service documents two Jev models, jev-1.13 and jev-1.13-free, and states that the free one is available for a limited time with no end date published. The TypeSafe console Playground is usable without spending, but it is not an API. Everything else — the official API and OpenRouter — is prepaid.

+ Why does creating a TypeSafe API key fail with 'this organization has no available credits'?

Because key creation is gated on a positive credit balance. A new TypeSafe account gets no free credit (TypeSafe's own announcement in late September 2026 says new signups no longer receive free credits), and with a zero balance the console refuses to create or reactivate a key. The fix is a top-up first; a second account does not help because the gate is on the account's billing state, not on a per-account free allowance.

+ Is api.typesafe.ai reachable from mainland China?

In a probe run on 2026-11-07 from Guangdong, every request to api.typesafe.ai — with and without an Authorization header — returned HTTP 451 with the body 'Typesafe is not available in your region'. That is a product-level block served through Cloudflare, not a network timeout, so it will not clear by retrying. The OpenRouter route answered normally from the same network at the same time.

+ Does OpenRouter list Jev 1.14 as a normal model?

Partly. The catalogue endpoint /api/v1/models returned 460 models on 2026-11-07 and only typesafe/jev-router carried a TypeSafe prefix. The separate endpoint lookup /api/v1/models/typesafe/jev-1.14/endpoints answered 200 and named the upstream endpoint typesafe/jev-1.14-20261014 with a 262,144-token context and a prompt price of 0.000000042 per token ($0.042 per million tokens, completion free). The router entry itself reported pricing -1 and an empty endpoints array.

+ How much does a Jev request actually cost?

At the documented $42 per billion input tokens ($0.042 per million) with free output, a request carrying about 2,000 input tokens costs roughly $0.000084, and 1,000 such requests cost about $0.084. A request that fills the default 64k per-request context costs about $0.0027, so 1,000 of those cost about $2.69. Token counts come back in usage.input_tokens, so measure your own shape instead of assuming.

+ Should I send images through the official endpoint or through OpenRouter?

Read the current docs before either. Images and Box questions are marked Dreamer-ready — the request format, answers and limits can change between releases — and they are off unless you send the TypeSafe-Danger-Zone-Images: true header. Box questions additionally require Jev 1.14. OpenRouter's description of typesafe/jev-1.14 declares the output modality as decisions rather than text, which tells you the routing path is not a generic chat completion.

Keep reading