Documentation

Build with NeverMetered

Everything you need to send your first request, stay within your parallel limits and get the most from prefix caching.

Quickstart#

Point any OpenAI or Anthropic client at the gateway. Your prompts, tools and streaming code stay the same.

  1. 1Create an API key — it's shown once, so store it in your secret manager.
  2. 2Set the base URL to https://api.nevermetered.com/v1 (Anthropic SDKs: https://api.nevermetered.com).
  3. 3Send a request. Pick a model id from GET /v1/models.
curl https://api.nevermetered.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3.8-27b",
    "messages": [{"role": "user", "content": "Hello!"}]
  }'
Using a coding agent or editor?
Step-by-step setup for Claude Code, Codex CLI, OpenCode, Cline, Cursor, Continue, Aider and popular SDKs. Integration guides

Authentication#

Send your key with either header — both work on every endpoint.

Authorization: Bearer nfk_
# or
x-api-key: nfk_
Keep keys server-side
Never ship a key in a browser or mobile app. Each key can have its own parallel-stream cap, so give background jobs their own key.

Endpoints#

MethodPathNotes
GET/v1/modelsList the models your key can call.
POST/v1/chat/completionsOpenAI Chat Completions — streaming, tools, images.
POST/v1/responsesOpenAI Responses API. previous_response_id follow-ups are routed to the engine holding the state.
POST/v1/messagesAnthropic Messages API, streaming and non-streaming.
POST/v1/messages/count_tokensAnthropic token counting. Not queued; rate limited per minute by plan.

Parallel limits & queueing#

Tokens are unlimited. Your plan controls how many generations run at the same time across all your keys.

  • Within your limit, a request is scheduled onto an engine slot as soon as one is available.
  • Over your parallel limit, up to max queued extra requests wait for one of your streams to finish. Beyond that you get 429 concurrency_limit_exceeded immediately.
  • When the whole pool is busy, requests queue fairly: users with less recent usage go first, recent usage decays over time, and waiting raises a request's priority over time.
  • If a request waits longer than the queue timeout it fails with 503/504 request_queue_timeout. Nothing was generated, so it is safe to retry.
  • max_tokens is capped (and defaulted) by your plan's max output tokens, and a single stream may have a maximum duration.
Size your client to your limit
Capping your client's concurrency at your parallel-stream limit (plus queue allowance) avoids 429s from your own traffic.

Free tier#

Every account can send 10 generation requests a day for free, with the same unlimited tokens per request as paid plans. Paid plans have no daily request limit.

  • Verify your email first. Until you do, free requests return 403 email_verification_required.
  • Resets at 00:00 UTC. Requests that fail before generating anything (for example a queue timeout) aren't counted.
  • One allowance per person. Free requests are shared between accounts used from the same browser or device, and between accounts calling from the same network. Most people never notice; if you're on a shared office or campus connection and run out early, a paid plan removes the limit.
  • Model listing and token counting (/v1/models, count_tokens) don't use the allowance.
Response headerMeaning
x-ratelimit-limit-requestsYour free requests per UTC day.
x-ratelimit-remaining-requestsHow many are left today, after this request.
x-ratelimit-reset-requestsSeconds until the allowance resets, e.g. 18720s.

Every successful free request carries these headers. When the allowance is used up you get a 429 with the time it resets:

HTTP/1.1 200 OK
x-ratelimit-limit-requests: 10
x-ratelimit-remaining-requests: 3
x-ratelimit-reset-requests: 18720s

HTTP/1.1 429 Too Many Requests
retry-after: 18720
x-ratelimit-remaining-requests: 0

{
  "error": {
    "message": "You've used all 10 free requests for today. The allowance resets at 2026-09-15T00:00:00Z. …",
    "type": "rate_limit_error",
    "param": null,
    "code": "daily_quota_exceeded"
  }
}
Check the remaining count before batch jobs
Read x-ratelimit-remaining-requests and stop scheduling work at 0 instead of retrying — retries before the reset return 429 again. Compare plans

Getting the most out of caching#

Requests in the same conversation are routed to the same engine for a while, so a prompt prefix it already processed can be served from cache instead of recomputed. Cache hits show up as cached input tokens and as your cache hit rate on the dashboard, and usually shorten time to first token.

  • Keep the system prompt and tool definitions byte-for-byte stable between turns — no timestamps or random ids at the top.
  • Append new messages to the end of the history instead of rewriting or reordering earlier ones.
  • With the Responses API, chain turns with previous_response_id, or send a stable prompt_cache_key per conversation.
  • A conversation that sits idle for a while loses its engine; the next request simply runs cold once.

How tokens are counted#

Every request reports three numbers, both in API responses and in your dashboard.

Input

Everything in the prompt: system prompt, tools, history and the new message. Includes cached input.

Cached input

The part of the input served from the engine's prefix cache instead of being recomputed.

Output

Generated tokens, including any reasoning tokens the model produced before answering.

Uncached input is input minus cached input. Streams you cancel before the engine reports usage are estimated and marked est. in the request log. Usage is informational — tokens are never billed.

Errors#

StatusCodeMeaningRetry?
401Missing, unknown or revoked API key.No
403The key is valid but not allowed to use this model, or the account is suspended.No
403email_verification_requiredFree requests need a verified email address. Click the link in your verification email, or upgrade.No
403free_tier_unavailableFree requests are turned off for this account. Upgrade to a paid plan or contact support.No
429concurrency_limit_exceededAll your parallel streams are busy and your queue allowance is full.With backoff
429daily_quota_exceededToday's free requests are used up. Retry after the reset in retry-after (00:00 UTC), or upgrade.After reset
503 / 504request_queue_timeoutThe service stayed busy longer than the queue timeout. Nothing was generated.With backoff