Last updated: 2026-04-20

Frameworks

Integrate SpendLil with popular web frameworks: Next.js, Express, FastAPI, Django, Rails, and more.

SpendLil uses provider-specific gateway subdomains. Your existing provider auth header (Authorization: Bearer, x-api-key, or x-goog-api-key) passes through unchanged — the official provider SDKs all work. You just point them at the gateway base URL and add one X-SpendLil-Key header. Below are copy-paste patterns for popular frameworks.

SDKs work out of the box

The OpenAI, Anthropic, and @ai-sdk/openai SDKs all support a custom baseURL plus default headers. LangChain, Vercel AI SDK, LlamaIndex, and most higher-level frameworks compose over these — no special proxy required.

Next.js

javascript app/api/chat/route.ts
import OpenAI from 'openai';
import { NextResponse } from 'next/server';

const client = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
  baseURL: 'https://openai.gateway.spendlil.ai/v1',
  defaultHeaders: { 'X-SpendLil-Key': process.env.SPENDLIL_KEY },
});

export async function POST(req: Request) {
  const { message } = await req.json();
  const response = await client.chat.completions.create({
    model: 'gpt-4o-mini',
    messages: [{ role: 'user', content: message }],
  });
  return NextResponse.json({ reply: response.choices[0].message.content });
}

Express.js

javascript routes/ai.js
import { Router } from 'express';
import OpenAI from 'openai';

const router = Router();
const client = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
  baseURL: 'https://openai.gateway.spendlil.ai/v1',
  defaultHeaders: { 'X-SpendLil-Key': process.env.SPENDLIL_KEY },
});

router.post('/chat', async (req, res) => {
  const response = await client.chat.completions.create({
    model: 'gpt-4o-mini',
    messages: [{ role: 'user', content: req.body.message }],
  });
  res.json({ reply: response.choices[0].message.content });
});

export default router;

FastAPI (Python)

python main.py
import os
from fastapi import FastAPI
from pydantic import BaseModel
from openai import OpenAI

app = FastAPI()
client = OpenAI(
    api_key=os.environ['OPENAI_API_KEY'],
    base_url='https://openai.gateway.spendlil.ai/v1',
    default_headers={'X-SpendLil-Key': os.environ['SPENDLIL_KEY']},
)

class ChatRequest(BaseModel):
    message: str

@app.post('/chat')
async def chat(req: ChatRequest):
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': req.message}],
    )
    return {'reply': response.choices[0].message.content}

Django

python views.py
import os
import json
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from openai import OpenAI

client = OpenAI(
    api_key=os.environ['OPENAI_API_KEY'],
    base_url='https://openai.gateway.spendlil.ai/v1',
    default_headers={'X-SpendLil-Key': os.environ['SPENDLIL_KEY']},
)

@csrf_exempt
def chat(request):
    body = json.loads(request.body)
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': body['message']}],
    )
    return JsonResponse({'reply': response.choices[0].message.content})

Flask

python app.py
import os
from flask import Flask, request, jsonify
from openai import OpenAI

app = Flask(__name__)
client = OpenAI(
    api_key=os.environ['OPENAI_API_KEY'],
    base_url='https://openai.gateway.spendlil.ai/v1',
    default_headers={'X-SpendLil-Key': os.environ['SPENDLIL_KEY']},
)

@app.post('/chat')
def chat():
    data = request.get_json()
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': data['message']}],
    )
    return jsonify(reply=response.choices[0].message.content)

Ruby on Rails

ruby app/services/ai_client.rb
require 'net/http'
require 'json'

class AiClient
  def self.chat(message, model: 'gpt-4o-mini')
    uri = URI('https://openai.gateway.spendlil.ai/v1/chat/completions')
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true

    request = Net::HTTP::Post.new(uri)
    request['Authorization'] = "Bearer #{ENV['OPENAI_API_KEY']}"
    request['X-SpendLil-Key'] = ENV['SPENDLIL_KEY']
    request['Content-Type'] = 'application/json'
    request.body = {
      model: model,
      messages: [{ role: 'user', content: message }]
    }.to_json

    response = http.request(request)
    JSON.parse(response.body)
  end
end

Go

go main.go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
	"os"
)

func main() {
	body, _ := json.Marshal(map[string]interface{}{
		"model": "gpt-4o-mini",
		"messages": []map[string]string{
			{"role": "user", "content": "Hello"},
		},
	})

	req, _ := http.NewRequest("POST",
		"https://openai.gateway.spendlil.ai/v1/chat/completions",
		bytes.NewBuffer(body))
	req.Header.Set("Authorization", "Bearer "+os.Getenv("OPENAI_API_KEY"))
	req.Header.Set("X-SpendLil-Key", os.Getenv("SPENDLIL_KEY"))
	req.Header.Set("Content-Type", "application/json")

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	var result map[string]interface{}
	json.NewDecoder(resp.Body).Decode(&result)
	fmt.Println(result)
}

LangChain

python LangChain with the SpendLil gateway
import os
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model='gpt-4o-mini',
    api_key=os.environ['OPENAI_API_KEY'],
    base_url='https://openai.gateway.spendlil.ai/v1',
    default_headers={'X-SpendLil-Key': os.environ['SPENDLIL_KEY']},
)

response = llm.invoke('Hello from LangChain')
print(response.content)

Vercel AI SDK

typescript Vercel AI SDK with the SpendLil gateway
import { createOpenAI } from '@ai-sdk/openai';
import { generateText } from 'ai';

const openai = createOpenAI({
  apiKey: process.env.OPENAI_API_KEY,
  baseURL: 'https://openai.gateway.spendlil.ai/v1',
  headers: { 'X-SpendLil-Key': process.env.SPENDLIL_KEY! },
});

const { text } = await generateText({
  model: openai('gpt-4o-mini'),
  prompt: 'Hello from Vercel AI SDK',
});