NemoRouter
SDKs

cURL Examples

Use NemoRouter with cURL from the command line

cURL Examples

cURL is the fastest way to test NemoRouter from the command line. Every example on this page is copy-paste ready — just set your API key and go.

Setup

Set your API key as an environment variable:

export NEMOROUTER_API_KEY="sk-nemo-your-key-here"

All examples below reference $NEMOROUTER_API_KEY. Make sure it's set in your shell before running them.

Chat Completions

Basic Chat

curl https://api.nemorouter.ai/v1/chat/completions \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "messages": [
      {"role": "user", "content": "What is an LLM gateway?"}
    ]
  }'

With System Message

curl https://api.nemorouter.ai/v1/chat/completions \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "messages": [
      {"role": "system", "content": "You are a concise technical writer. Answer in 2-3 sentences."},
      {"role": "user", "content": "Explain API rate limiting."}
    ],
    "temperature": 0.5,
    "max_tokens": 256
  }'

Multi-Turn Conversation

curl https://api.nemorouter.ai/v1/chat/completions \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "messages": [
      {"role": "system", "content": "You are a helpful assistant."},
      {"role": "user", "content": "What is Python?"},
      {"role": "assistant", "content": "Python is a high-level, interpreted programming language known for its simplicity and readability."},
      {"role": "user", "content": "What are its main use cases?"}
    ]
  }'

Using Different Models

Switch providers by changing the model field:

# Anthropic Claude
curl https://api.nemorouter.ai/v1/chat/completions \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-4-sonnet",
    "messages": [
      {"role": "user", "content": "Write a haiku about cloud computing."}
    ]
  }'
# Google Gemini
curl https://api.nemorouter.ai/v1/chat/completions \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-2.5-pro",
    "messages": [
      {"role": "user", "content": "What are the key differences between REST and GraphQL?"}
    ]
  }'
# Meta Llama
curl https://api.nemorouter.ai/v1/chat/completions \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama-4-scout",
    "messages": [
      {"role": "user", "content": "Explain microservices architecture."}
    ]
  }'

Streaming

Stream the response token by token using server-sent events:

curl https://api.nemorouter.ai/v1/chat/completions \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "messages": [
      {"role": "user", "content": "Write a short poem about APIs."}
    ],
    "stream": true
  }'

Each line in the response is a server-sent event:

data: {"id":"chatcmpl-abc","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant"},"finish_reason":null}]}

data: {"id":"chatcmpl-abc","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"In"},"finish_reason":null}]}

data: {"id":"chatcmpl-abc","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":" circuits"},"finish_reason":null}]}

data: [DONE]

JSON Mode

Force the model to output valid JSON:

curl https://api.nemorouter.ai/v1/chat/completions \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "messages": [
      {"role": "system", "content": "You output JSON. Return a list of 3 colors with name and hex fields."},
      {"role": "user", "content": "Give me colors."}
    ],
    "response_format": {"type": "json_object"}
  }'

Function Calling

Define tools for the model to call:

curl https://api.nemorouter.ai/v1/chat/completions \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "messages": [
      {"role": "user", "content": "What is the weather in Tokyo?"}
    ],
    "tools": [
      {
        "type": "function",
        "function": {
          "name": "get_weather",
          "description": "Get the current weather in a given location",
          "parameters": {
            "type": "object",
            "properties": {
              "location": {
                "type": "string",
                "description": "City name, e.g. Tokyo, Japan"
              },
              "unit": {
                "type": "string",
                "enum": ["celsius", "fahrenheit"]
              }
            },
            "required": ["location"]
          }
        }
      }
    ],
    "tool_choice": "auto"
  }'

Embeddings

Single Text

curl https://api.nemorouter.ai/v1/embeddings \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "text-embedding-3-small",
    "input": "NemoRouter is an enterprise LLM gateway."
  }'

Batch Embeddings

curl https://api.nemorouter.ai/v1/embeddings \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "text-embedding-3-small",
    "input": [
      "First document about AI gateways.",
      "Second document about API management.",
      "Third document about cost optimization."
    ]
  }'

Custom Dimensions

curl https://api.nemorouter.ai/v1/embeddings \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "text-embedding-3-large",
    "input": "NemoRouter simplifies LLM access.",
    "dimensions": 256
  }'

List Models

List all available models:

curl https://api.nemorouter.ai/v1/models \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY"

Pretty-Print with jq

curl -s https://api.nemorouter.ai/v1/models \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY" | jq '.data[] | .id'

Get a Specific Model

curl https://api.nemorouter.ai/v1/models/gpt-4o \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY"

Useful cURL Flags

FlagPurposeExample
-sSilent mode (no progress bar)curl -s https://...
-vVerbose (show headers)curl -v https://...
-o file.jsonSave response to filecurl -o response.json https://...
-w "\n"Add trailing newlinecurl -w "\n" https://...
--max-time 30Timeout after 30 secondscurl --max-time 30 https://...

View Response Headers

Use -v or -i to see NemoRouter's response headers:

curl -i https://api.nemorouter.ai/v1/chat/completions \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "messages": [{"role": "user", "content": "Hello"}]
  }'

Look for NemoRouter-specific headers in the response:

x-nemo-org-id: your-org-uuid
x-nemo-key-alias: sk-...xxxx

Shell Script Example

A complete shell script that calls NemoRouter:

#!/bin/bash
set -euo pipefail

# Check for API key
if [ -z "${NEMOROUTER_API_KEY:-}" ]; then
  echo "Error: NEMOROUTER_API_KEY is not set"
  exit 1
fi

BASE_URL="https://api.nemorouter.ai/v1"
MODEL="${1:-gpt-4o}"
PROMPT="${2:-Hello, NemoRouter!}"

echo "Model: $MODEL"
echo "Prompt: $PROMPT"
echo "---"

curl -s "$BASE_URL/chat/completions" \
  -H "Authorization: Bearer $NEMOROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d "$(cat <<EOF
{
  "model": "$MODEL",
  "messages": [{"role": "user", "content": "$PROMPT"}],
  "max_tokens": 256
}
EOF
)" | jq -r '.choices[0].message.content'

Usage:

chmod +x nemo-chat.sh
./nemo-chat.sh gpt-4o "What is NemoRouter?"
./nemo-chat.sh claude-4-sonnet "Write a haiku about APIs."

Error Responses

Common errors you'll encounter:

401 Unauthorized

{
  "error": {
    "message": "Invalid API key provided.",
    "type": "authentication_error",
    "code": "invalid_api_key"
  }
}

Fix: Check that $NEMOROUTER_API_KEY is set and valid.

402 Payment Required

{
  "error": {
    "message": "Insufficient credits.",
    "type": "billing_error",
    "code": "insufficient_credits"
  }
}

Fix: Add credits from the Billing page in your dashboard.

429 Too Many Requests

{
  "error": {
    "message": "Rate limit exceeded.",
    "type": "rate_limit_error",
    "code": "rate_limit_exceeded"
  }
}

Fix: Wait and retry, or upgrade your plan for higher rate limits.

Next Steps