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
| Term | Meaning |
|---|---|
operator | The identified operator serving the reservation. Requests never go to anyone else. |
target | Either one registered Infernet node, or the operator's own OpenAI-compatible endpoint. |
models | Exact model ids. A request for any other model is refused (400 model_not_reserved). |
start_at + hours | Starts on a whole UTC hour; each hour is 60 continuous minutes. Keys only work inside the window. |
included_tokens | Prompt + completion tokens included across the reservation. When used up: 429 token_allowance_exhausted. |
per_key_rps / per_key_concurrency | Limits on each key you issue. |
shared_rps / shared_concurrency | Limits across all keys on the reservation together. |
required_minutes_per_hour | How many of an hour's 60 minutes must be confirmed for that hour to be compliant. 60 means every minute. |
gpu_class | The GPU tier the reservation is priced from (see Pricing). Sets price_per_hour and setup_fee. |
price_per_hour + currency | Post-paid price per compliant hour. Defaults to the gpu_class list price; never below it. |
setup_fee | Charged 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_class | GPU | Fits | Per hour | Setup fee |
|---|---|---|---|---|
l40s | L40S 48GB | 8B-32B models | $1.35 | $6.35 |
a100 | A100 80GB | up to 70B quantized | $1.89 | $6.89 |
h100 | H100 80GB | 70B quantized, fast | $3.99 | $8.99 |
h100x2 | 2x H100 80GB | 70B 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:
| Header | Value |
|---|---|
X-Infernet-Limit-Type | rps, concurrency or tokens |
X-Infernet-Limit-Scope | key (this key's limit) or shared (the reservation's) |
X-RateLimit-Limit / X-RateLimit-Remaining | the limit that was hit and what is left |
Retry-After | seconds |
X-Infernet-Reservation | the 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:
- Operator endpoint:
GET /modelsmust list every reserved model id. With completion probes on, a one-token completion on each model must also succeed and report that model. - Infernet node: the node's signed heartbeat must be under 90 seconds old, report itself available, and list every reserved model as served.
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 viewPost-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
| Endpoint | Auth | What |
|---|---|---|
POST /api/v1/reservations | admin | Book a reservation; returns the buyer token once |
GET /api/v1/reservations | admin | List reservations |
GET|PATCH /api/v1/reservations/:id | admin (GET: or buyer token) | Show; set price, notes, or cancel |
GET|POST /api/v1/reservations/:id/keys | admin or buyer token | List or issue keys |
DELETE /api/v1/reservations/:id/keys/:keyId | admin or buyer token | Revoke a key |
GET /api/v1/reservations/:id/report | admin or buyer token | Per-hour compliance + usage (?minutes=1 for raw records) |
GET /api/v1/reservations/:id/invoice | admin or buyer token | Post-paid invoice data |
POST /api/v1/reservations/:id/buyer-token | admin | Rotate the buyer token |
POST /v1/chat/completions, GET /v1/models | reservation key | Inference 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.