Cursor
Settings → Models → add an OpenAI key, then set the override base URL.
One endpoint. Every model. An OpenAI-compatible API funded with cryptocurrency. Point anything you already use at askr with a base URL and a key. No card, no subscription, no per-model account.
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://heyaskr.ai/install.sh | sh askr login askr
The third line is askr 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: askr "what changed in HTTP/3?" Unquoted, your shell claims the ? before askr sees it.
export ASKR_KEY="askr_live_..."
curl https://heyaskr.ai/v1/chat/completions \
-H "Authorization: Bearer $ASKR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.6-sol",
"messages": [{"role": "user", "content": "hello"}]
}'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://heyaskr.ai/v1 API key askr_live_…
Settings → Models → add an OpenAI key, then set the override base URL.
In config.json: "provider": "openai", "apiBase": "https://heyaskr.ai/v1".
--openai-api-base https://heyaskr.ai/v1 --openai-api-key $ASKR_KEY
Pass base_url and api_key. Nothing else changes.
Any OpenAI chat model class that accepts a base URL.
It is HTTP and JSON. curl works.
| Method | Path | What it does |
|---|---|---|
GET | /v1 | Connection check. Returns your balance and the key in use: plain text in a terminal, JSON everywhere else. |
GET | /v1/models | Every model you can call, in the shape the OpenAI SDKs expect. |
POST | /v1/chat/completions | The one that does the work. Streaming and non-streaming. |
Send stream:true for a standard server-sent event stream, the same frames your client already parses.
curl -N https://heyaskr.ai/v1/chat/completions \
-H "Authorization: Bearer $ASKR_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.
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 }
},
"askr": { "credits_charged": 1.5382 }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.
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.
It is prepaid access to model usage, spent only when you ask for something. It cannot be withdrawn or converted back.
Make as many as you like at your wallet. A key is shown once. Only a hash is kept, so it cannot be recovered, only replaced.
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 bounds what one key can do, and it is checked before the request runs rather than after.
Revoking stops the next request with that key. Its past usage stays on the record so you can still see what it spent.
It spends real money and it is a bearer credential: whoever holds it can use it. Environment variable, not a committed file.
The request and response shapes match. These are the deliberate differences, and there are only four.
| Difference | Why |
|---|---|
askr.credits_charged on every response | Additive, so clients that do not know about it ignore it. Knowing the cost of a call without a second round trip is most of the point. |
| 402 when the balance is short | It names how many credits the request needed, so a script can decide whether to top up or back off. |
| Chat and image models | A model that answers chat completions with a picture works here, and the picture comes back in message.images. Video runs in the workspace on its own endpoint and is not on this API yet. Audio and embedding ids are refused. |
| No fine-tuning, files or assistants | Not built. The endpoints above are the whole surface. |