Section 8

8. Registering your own models

Point any name at any provider Nozzle supports. Registration needs the catalog:write scope on your key (plus catalog:read). It is deliberately not instances:write: filing an alias never lets a key rent compute.

bash
# What can I register against?
curl "$BASE/v1/providers" -H "Authorization: Bearer $KEY"
# → [{"name":"cerebras","credential":"platform","wire_family":"openai_chat_completions"}, …]

credential tells you who pays: platform (Nozzle holds the key), byok (you must supply one), or self_hosted (we run the weights).

bash
curl -X POST "$BASE/v1/models" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "name": "my-fast-model",
    "provider": "cerebras",
    "upstream_model": "gemma-4-31b",
    "input_cents_per_mtok": 50,
    "output_cents_per_mtok": 100
  }'

What it serves. modality is text (the default, chat), embedding, or audio (transcription), and it decides both the surface the model answers on and the unit it bills in — tokens for text and embeddings, cents_per_audio_minute for audio:

bash
curl -X POST "$BASE/v1/models" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"name": "my-scribe", "provider": "openai",
       "upstream_model": "gpt-4o-mini-transcribe",
       "modality": "audio", "cents_per_audio_minute": 0.35}'
# then: curl -X POST "$BASE/v1/audio/transcriptions" -F file=@clip.wav -F model=my-scribe …

A rate in the wrong unit is refused by name rather than ignored. Modalities whose rate this body cannot express yet (image, video, speech, rerank) are refused with the supported list.

Then call my-fast-model like any other model. It bills at your rate.

  • name is whatever you want to type. It may shadow a platform model — point gpt-4.1-mini at your own account and only your traffic moves.
  • upstream_model is the provider's own name, which routinely differs (Qwen/Qwen3.8-27B at DeepInfra, qwen3.8-27b at Groq).
  • Prices are optional only when the catalog already prices that model. Otherwise both are required — supplying one side is refused, because half a price is far likelier to be a half-finished thought than "output is free".

Registration is atomic: catalog row, binding and price commit together or not at all.

bash
curl "$BASE/v1/registrations" -H "Authorization: Bearer $KEY"       # yours only
curl -X DELETE "$BASE/v1/models/my-fast-model" \
     -H "Authorization: Bearer $KEY" -H "Idempotency-Key: $(uuidgen)"

Deregistering removes your binding. If you were shadowing a platform model, you fall back to it rather than deleting it.