Developers

One endpoint. Every model. An OpenAI-compatible API funded with cryptocurrency. Point anything you already use at Kytro with a base URL and a key. No card, no subscription, no per-model account.

Sixty seconds

The fastest route is the terminal client. It remembers your key and your model, so you choose once and then simply type. Needs Node 18 or newer.

curl -fsSL https://kytro.xyz/install.sh | sh kytro login kytro

The third line is kytro on its own, which opens a conversation and keeps it. /models to browse, /model <id> to switch without losing the thread, /exit to leave.

To ask one thing and exit, quote it: kytro "what changed in HTTP/3?" Unquoted, your shell claims the ? before Kytro sees it.

Or straight to the API

export KYTRO_KEY="kytro_live_..." curl https://kytro.xyz/v1/chat/completions \ -H "Authorization: Bearer $KYTRO_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-5.6-sol", "messages": [{"role": "user", "content": "hello"}] }'

Two settings

Anything that speaks the OpenAI API works, because the shape is the same one it already sends. There is nothing to install and no integration to wait for.

Base URL
https://kytro.xyz/v1
API key
kytro_live_…

Cursor

Settings → Models → add an OpenAI key, then set the override base URL.

Continue

In config.json: "provider": "openai", "apiBase": "https://kytro.xyz/v1".

Aider

--openai-api-base https://kytro.xyz/v1 --openai-api-key $KYTRO_KEY

OpenAI SDK

Pass base_url and api_key. Nothing else changes.

LangChain / LlamaIndex

Any OpenAI chat model class that accepts a base URL.

Your own script

It is HTTP and JSON. curl works.

Endpoints

MethodPathWhat it does
GET/v1Connection check. Returns your balance and the key in use: plain text in a terminal, JSON everywhere else.
GET/v1/modelsEvery model you can call, in the shape the OpenAI SDKs expect.
POST/v1/chat/completionsThe one that does the work. Streaming and non-streaming.

Streaming

Send stream:true for a standard server-sent event stream, the same frames your client already parses.

curl -N https://kytro.xyz/v1/chat/completions \ -H "Authorization: Bearer $KYTRO_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"gpt-5.6-sol","messages":[{"role":"user","content":"hi"}],"stream":true}'

Stop reading mid-answer and the upstream call is cancelled immediately. You are charged for what was generated up to that point and nothing after it.

What a call costs

A dollar buys 1,000 credits. Each request is priced from what it actually cost upstream, plus our margin, and the figure comes back with the response, so a script never has to guess or make a second call to find out.

"usage": { "prompt_tokens": 12, "completion_tokens": 37, "total_tokens": 49, "completion_tokens_details": { "reasoning_tokens": 0 } }, "kytro": { "credits_charged": 1.5382 }

Reasoning tokens

On a thinking model, most of a short reply can be reasoning you never see. It is billed like any other output token, so reasoning_tokens is reported separately. Check it before pointing a loop at one.

Nothing succeeds silently

A request that returns no content is an error, not an empty answer, and it is not charged. A failure before the model runs releases the reservation untouched.

Credit does not expire

It is prepaid access to model usage, spent only when you ask for something. It cannot be withdrawn or converted back.

Keys

Make as many as you like from your account. A key is shown once. Only a hash is kept, so it cannot be recovered, only replaced.

Set a daily cap

A script in a retry loop can spend a balance in minutes in a way nobody typing into a chat box ever will. A cap is checked before the request runs rather than after.

Revoke instantly

Revoking stops the next request with that key. Its past usage stays on the record so you can still see what it did.

Start with five dollars.

That is about 675 messages on Sonnet. Enough to find out whether this is useful to you.