Skip to content

Using the API

Routstr is OpenAI-compatible. Almost any AI application, SDK, or tool that supports custom endpoints will work out of the box. Just change two things:

BASE_URL  →  https://api.routstr.com/v1
API_KEY   →  sk-... or cashuA...

Both work as API keys: - sk-7f8e9d... — Session key (from Lightning invoice or Cashu import) - cashuA3s8j... — Raw Cashu token (use directly from your wallet)

If the app lets you set a base URL and API key, you're good to go.


Quick Setup Examples

OpenAI SDK (Python/JS)

client = OpenAI(base_url="https://api.routstr.com/v1", api_key="sk-...")  # or any provider's URL

Claude Code

export ANTHROPIC_BASE_URL=https://api.routstr.com/v1
export ANTHROPIC_AUTH_TOKEN=sk-...

Any OpenAI-compatible app

Look for "Custom API endpoint", "Base URL", or "OpenAI-compatible" in settings. Paste the URL and key.


Detailed Examples

Python (Official SDK)

from openai import OpenAI

# 1. Initialize with Routstr URL and your funded key
client = OpenAI(
    base_url="https://api.routstr.com/v1",
    api_key="sk-7f8e9d..." 
)

# 2. Call the API normally
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}],
    stream=True
)

for chunk in response:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")

Node.js

import OpenAI from 'openai';

// You can use a session key OR a raw Cashu token directly
const openai = new OpenAI({
  baseURL: 'https://api.routstr.com/v1',
  apiKey: 'cashuA3s8jKx9...', // or 'sk-7f8e9d...'
});

async function main() {
  const completion = await openai.chat.completions.create({
    messages: [{ role: 'user', content: 'Say this is a test' }],
    model: 'gpt-3.5-turbo',
  });

  console.log(completion.choices[0]);
}

main();

cURL

# Works with session key or raw Cashu token
curl https://api.routstr.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer cashuA3s8jKx9..." \
  -d '{
    "model": "gpt-4o-mini",
    "messages": [{"role": "user", "content": "Hello!"}]
  }'

Error Handling

Insufficient Balance (402 Payment Required)

If your session runs out of funds, the API will return a 402 error.

{
  "error": {
    "message": "Insufficient balance. Current: 1000 msat, Required: 5000 msat",
    "type": "insufficient_balance",
    "code": 402
  }
}

Action: Top up your key using the /lightning/invoice (topup purpose) or /v1/balance/topup endpoints.

Rate Limiting

Routstr passes through rate limits from the upstream provider. Handle 429 Too Many Requests with standard exponential backoff.


Advanced: Tor Access

If the node is running as a hidden service, use a SOCKS5 proxy (like 127.0.0.1:9050).

Python:

import httpx
from openai import OpenAI

proxy_mounts = {
    "http://": httpx.HTTPTransport(proxy="socks5://127.0.0.1:9050"),
    "https://": httpx.HTTPTransport(proxy="socks5://127.0.0.1:9050"),
}

client = OpenAI(
    base_url="http://verylongonionaddress.onion/v1",
    api_key="sk-...",
    http_client=httpx.Client(mounts=proxy_mounts),
)