Get going in 30 seconds
export NI_API_KEY=ni_live_YOUR_KEY_HERE
curl https://northerninference.ca/v1/chat/completions \
-H "Authorization: Bearer $NI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"bedrock/global.anthropic.claude-haiku-4-5-20251001-v1:0-global","messages":[{"role":"user","content":"hi"}],"max_tokens":20}'
The model field is the route contract. Copy exact route IDs from northerninference.ca/portal (Models page) or from curl https://northerninference.ca/api/billing/models | jq '.models[].model_id'.
Basic chat completion
curl https://northerninference.ca/v1/chat/completions \
-H "Authorization: Bearer $NI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "bedrock/global.anthropic.claude-haiku-4-5-20251001-v1:0-global",
"messages": [{"role": "user", "content": "hi"}],
"max_tokens": 20
}'
Pick a route
curl https://northerninference.ca/v1/chat/completions \
-H "Authorization: Bearer $NI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "vertex_ai/gemini-2.5-pro-ca",
"messages": [{"role": "user", "content": "Which jurisdiction am I in?"}],
"max_tokens": 80
}'
The model ID is the route contract. Copy the exact routing key from /models or /api/billing/models. API key allowed route tiers authorize which routes the key can use.
Read the custody chain from response headers
curl -sS -D /tmp/headers https://northerninference.ca/v1/chat/completions \
-H "Authorization: Bearer $NI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"bedrock/global.anthropic.claude-haiku-4-5-20251001-v1:0-global","messages":[{"role":"user","content":"hi"}],"max_tokens":5}' \
> /dev/null
grep -i '^x-ni-' /tmp/headers
You'll see something like:
x-ni-request-id: 8f2e3b7d9a1c4f08
x-ni-resolved-tier: managed_canadian_cloud
x-ni-resolved-provider: Bedrock
x-ni-resolved-region: ca-central-1
x-ni-resolved-jurisdiction: CA
x-ni-custody-path: NI-CA -> Bedrock-CA
x-ni-credential-source: platform
x-ni-resolved-litellm-model: bedrock/global.anthropic.claude-haiku-4-5-20251001-v1:0
Streaming
curl -sS https://northerninference.ca/v1/chat/completions \
-H "Authorization: Bearer $NI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "bedrock/global.anthropic.claude-haiku-4-5-20251001-v1:0-global",
"messages": [{"role": "user", "content": "count to five"}],
"max_tokens": 30,
"stream": true,
"stream_options": {"include_usage": true}
}'
Full custody pull after the call
curl https://northerninference.ca/api/usage/custody/8f2e3b7d9a1c4f08 \
-H "Authorization: Bearer $NI_API_KEY"
Disable fallbacks
curl https://northerninference.ca/v1/chat/completions \
-H "Authorization: Bearer $NI_API_KEY" \
-d '{
"model": "bedrock/global.anthropic.claude-sonnet-4-6-global",
"messages": [{"role":"user","content":"hi"}],
"max_tokens": 10,
"allow_fallbacks": false
}' \
-H "Content-Type: application/json"
Enable PII substitution
curl https://northerninference.ca/v1/chat/completions \
-H "Authorization: Bearer $NI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "bedrock/global.anthropic.claude-haiku-4-5-20251001-v1:0-global",
"messages": [{"role": "user", "content": "My name is Jane Doe, email jane@example.com"}],
"max_tokens": 30,
"pii_substitution": true
}'
Entities (name, email, phone, SSN, credit card, IP, location) are replaced with deterministic Faker-generated substitutes before leaving NI infrastructure, and the originals are restored in the response before it reaches you. The pii_audit_log table records what was substituted; admins see it under portal → Admin → PII Audit.
Vision (image input)
Send the image as an image_url content block to any route whose supports_vision is true:
B64=$(base64 -i screenshot.png | tr -d '\n')
curl -sS https://northerninference.ca/v1/chat/completions \
-H "Authorization: Bearer $NI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "vertex_ai/gemini-2.5-pro-ca",
"messages": [
{"role": "user", "content": [
{"type": "text", "text": "What does this image say?"},
{"type": "image_url", "image_url": {"url": "data:image/png;base64,'"$B64"'"}}
]}
],
"max_tokens": 300
}'
See vision-and-capabilities.md for the full guide, including how a client with a hardcoded model table can be told an NI route supports images.
Model catalog (unauthenticated)
curl https://northerninference.ca/api/billing/models | jq '.models[].model_id'
Each model entry carries a capabilities object so a capability-aware client can detect vision support, context window, and max output:
curl -sS https://northerninference.ca/v1/models \
-H "Authorization: Bearer $NI_API_KEY" \
| jq '.data[] | {id, supports_vision, capabilities}'