Infernet Protocol

Managed endpoints

One operator, exact models, reserved by the hour.

For resellers who manage their own customers and billing. Instead of access to a pool of nodes, you get a reservation: a named operator serving the exact model ids you agreed, from a whole-hour start for a fixed number of hours, under limits you agreed. You hand out API keys; we keep a minute-by-minute record of availability that you can check yourself, and only compliant hours are billable.

What a reservation fixes

TermMeaning
operatorThe identified operator serving the reservation. Requests never go to anyone else.
targetEither one registered Infernet node, or the operator's own OpenAI-compatible endpoint.
modelsExact model ids. A request for any other model is refused (400 model_not_reserved).
start_at + hoursStarts on a whole UTC hour; each hour is 60 continuous minutes. Keys only work inside the window.
included_tokensPrompt + completion tokens included across the reservation. When used up: 429 token_allowance_exhausted.
per_key_rps / per_key_concurrencyLimits on each key you issue.
shared_rps / shared_concurrencyLimits across all keys on the reservation together.
required_minutes_per_hourHow many of an hour's 60 minutes must be confirmed for that hour to be compliant. 60 means every minute.
gpu_classThe GPU tier the reservation is priced from (see Pricing). Sets price_per_hour and setup_fee.
price_per_hour + currencyPost-paid price per compliant hour. Defaults to the gpu_class list price; never below it.
setup_feeCharged once, when the reservation delivers its first compliant hour. Covers warming the GPU.

Pricing

Priced by the dedicated GPU your models need, per compliant hour, post-paid. Non-compliant hours cost nothing. Machine-readable at GET /api/v1/reservations/pricing.

gpu_classGPUFitsPer hourSetup fee
l40sL40S 48GB8B-32B models$1.35$6.35
a100A100 80GBup to 70B quantized$1.89$6.89
h100H100 80GB70B quantized, fast$3.99$8.99
h100x22x H100 80GB70B full precision or long context$7.99$12.99

The setup fee is $5 + one hour at the tier price, once per booking (GPU warm-up). The operator, the models and the SLA threshold are agreed per reservation before it is booked. Write to hello@infernetprotocol.com.

Keys for your customers

Each reservation can have any number of API keys (prefix ifr_res_). You issue and revoke them yourself with the reservation's buyer token (see below), one per customer if you like; the shared limits still cap all of them together. A key is shown once. Revocation takes effect on the next request. Keys work with any OpenAI client:

export OPENAI_BASE_URL=https://infernetprotocol.com/v1
export OPENAI_API_KEY=ifr_res_...

curl -sS $OPENAI_BASE_URL/models -H "Authorization: Bearer $OPENAI_API_KEY"   # only the reserved models

curl -sS $OPENAI_BASE_URL/chat/completions \
  -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: application/json" \
  -d '{"model":"<reserved model id>","messages":[{"role":"user","content":"Classify: ..."}]}'

When a limit is hit

Refusals are HTTP 429 with headers that say which limit and when to retry:

HeaderValue
X-Infernet-Limit-Typerps, concurrency or tokens
X-Infernet-Limit-Scopekey (this key's limit) or shared (the reservation's)
X-RateLimit-Limit / X-RateLimit-Remainingthe limit that was hit and what is left
Retry-Afterseconds
X-Infernet-Reservationthe reservation id

Successful responses carry X-RateLimit-Remaining-Requests, X-Infernet-Shared-Remaining-Requests and the concurrency limits. Every refusal is counted in the report as a limit hit.

How availability is proven

Every minute of the window, whether or not anyone sends a request, the control plane probes the pinned target and stores one record for that minute:

A minute is confirmed when its probe succeeded and no real request failed upstream in that minute. A minute with no record (for example if the prober itself did not run) is unconfirmed; it is never assumed to be fine. An hour is compliant when its confirmed minutes reach required_minutes_per_hour. Hours with no requests are judged the same way, so an idle reserved hour that stayed up is compliant.

The report you can check

Each reservation comes with a buyer token (prefix ifr_buy_) scoped to that one reservation. With it you can issue and revoke keys, and read the per-hour verdicts, the failures behind them, every per-minute record, and usage (requests, tokens, limit hits). It cannot change the reservation's terms or see anything else:

curl -sS https://infernetprotocol.com/api/v1/reservations/<id>/report?minutes=1 \
  -H "X-Buyer-Token: ifr_buy_..."

curl -sS https://infernetprotocol.com/api/v1/reservations/<id>/invoice \
  -H "X-Buyer-Token: ifr_buy_..."

Or from the CLI:

INFERNET_BUYER_TOKEN=ifr_buy_... infernet reservation key-issue <id> --label customer-a
INFERNET_BUYER_TOKEN=ifr_buy_... infernet reservation report <id>
INFERNET_BUYER_TOKEN=ifr_buy_... infernet reservation invoice <id>
INFERNET_BUYER_TOKEN=ifr_buy_... infernet reservation watch <id>    # live view

Post-paid billing

Nothing is charged up front and nothing is charged by this system. The invoice view lists each reserved hour with its status and computes amount_due = compliant hours × price_per_hour + setup_fee (the setup fee only once an hour is compliant). Non-compliant and cancelled hours are owed nothing. The figure is final only once every hour has ended. You verify it against the report, then pay as agreed.

API, CLI and MCP

EndpointAuthWhat
POST /api/v1/reservationsadminBook a reservation; returns the buyer token once
GET /api/v1/reservationsadminList reservations
GET|PATCH /api/v1/reservations/:idadmin (GET: or buyer token)Show; set price, notes, or cancel
GET|POST /api/v1/reservations/:id/keysadmin or buyer tokenList or issue keys
DELETE /api/v1/reservations/:id/keys/:keyIdadmin or buyer tokenRevoke a key
GET /api/v1/reservations/:id/reportadmin or buyer tokenPer-hour compliance + usage (?minutes=1 for raw records)
GET /api/v1/reservations/:id/invoiceadmin or buyer tokenPost-paid invoice data
POST /api/v1/reservations/:id/buyer-tokenadminRotate the buyer token
POST /v1/chat/completions, GET /v1/modelsreservation keyInference on the pinned target

The same operations are in the CLI as infernet reservation … (run infernet reservation --help) and as MCP tools via infernet mcp, e.g. claude mcp add infernet -- infernet mcp.

Back to the documentation.