Dev.to AI 🤖 Ai 👁 0 📖 4 min read

How to Manage Multi-Client AI API Costs: A Technical Guide for Agencies

If you're running an AI agency, you've probably hit this wall: your API costs are eating your margins alive. You land a client, build a solution, and everything seems fine. But by month three, you're spending $4,000+ on

How to Manage Multi-Client AI API Costs: A Technical Guide for Agencies

If you're running an AI agency, you've probably hit this wall: your API costs are eating your margins alive.

You land a client, build a solution, and everything seems fine. But by month three, you're spending $4,000+ on API calls while charging a flat retainer. Your profit margin has disappeared.

I've seen this pattern dozens of times. The good news? It's solvable with the right technical architecture.

Let me walk you through the exact setup we use to help agencies cut API costs by 60% while maintaining quality.

The Root Cause: One Model for Everything

Most agencies start with a simple setup:

import openai

client = openai.OpenAI(
    api_key="your-key",
    base_url="https://api.rolltok.com/v1"
)

response = client.chat.completions.create(
    model="gpt-6-astra",
    messages=[{"role": "user", "content": prompt}]
)

Every task goes through GPT-6-Astra. Email drafts. Data extraction. Content generation. Complex reasoning. All using the most expensive model.

Here's the problem: GPT-6-Astra costs $17.00 per million input tokens. But Doubao-Seed-2.0-Mini costs $0.03 per million input tokens. That's a 566x price difference.

For 80% of your tasks, the cheap model works just as well. You're paying 566x more for no reason.

The Solution: Model Routing

The fix is to implement model routing. Automatically select the right model based on task requirements.

Here's a basic implementation:

def route_model(prompt: str, task_type: str) -> str:
    """Select the cheapest model that meets quality requirements."""

    # Simple tasks: use cheapest model
    if task_type in ["email_draft", "data_extraction", "classification"]:
        return "doubao-seed-2.0-mini"  # $0.03/$0.29

    # Medium tasks: use mid-tier model
    elif task_type in ["content_generation", "analysis", "summarization"]:
        return "qwen3.7-plus"  # $0.40/$1.20

    # Complex tasks: use premium model
    elif task_type in ["reasoning", "coding", "complex_analysis"]:
        return "gpt-6-astra"  # $17.00/$63.75

    # Default to mid-tier
    return "qwen3.7-plus"

def generate(prompt: str, task_type: str):
    model = route_model(prompt, task_type)

    client = openai.OpenAI(
        api_key="your-key",
        base_url="https://api.rolltok.com/v1"
    )

    response = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": prompt}]
    )

    return response.choices[0].message.content

This simple routing logic can cut your costs by 40-60% immediately.

Advanced Routing: Token-Based Rules

You can make routing smarter by considering input size:

def route_by_tokens(prompt: str, task_type: str) -> str:
    """Route based on task type and input size."""

    token_count = len(prompt.split()) * 1.3  # Rough estimate

    # Small inputs: use cheap model
    if token_count < 500:
        return "doubao-seed-2.0-mini"

    # Medium inputs: use mid-tier
    elif token_count < 5000:
        return "qwen3.7-plus"

    # Large inputs: use premium
    else:
        return "gpt-6-astra"

Client Isolation: The Missing Piece

Most agencies use one API key for all clients. This is a mistake.

Without client isolation, you can't:

  • Track costs per client
  • Set budget limits per project
  • Identify profitable vs unprofitable clients
  • Prevent one client from blowing your budget

Here's how to implement client isolation:

class ClientManager:
    def __init__(self):
        self.clients = {}

    def create_client(self, client_id: str, budget_limit: float):
        """Create isolated API key for client."""
        # In practice, this would call your API gateway
        api_key = generate_unique_key(client_id)

        self.clients[client_id] = {
            "api_key": api_key,
            "budget_limit": budget_limit,
            "usage": 0.0
        }

        return api_key

    def track_usage(self, client_id: str, cost: float):
        """Track API cost per client."""
        self.clients[client_id]["usage"] += cost

        # Alert if approaching budget
        if self.clients[client_id]["usage"] > self.clients[client_id]["budget_limit"] * 0.8:
            send_alert(client_id, "Approaching budget limit")

    def get_usage_report(self, client_id: str):
        """Get usage report for client."""
        return self.clients[client_id]

Now every client has their own API key, their own usage tracking, and their own budget limits.

Putting It All Together

Here's the complete architecture:

class AgencyAPIManager:
    def __init__(self):
        self.client_manager = ClientManager()
        self.gateway_url = "https://api.rolltok.com/v1"

    def generate(self, client_id: str, prompt: str, task_type: str):
        """Generate with model routing and client isolation."""

        # Route to appropriate model
        model = route_model(prompt, task_type)

        # Get client-specific API key
        client_config = self.client_manager.clients[client_id]
        api_key = client_config["api_key"]

        # Make API call
        client = openai.OpenAI(
            api_key=api_key,
            base_url=self.gateway_url
        )

        response = client.chat.completions.create(
            model=model,
            messages=[{"role": "user", "content": prompt}]
        )

        # Estimate cost (simplified)
        input_tokens = len(prompt.split()) * 1.3
        output_tokens = len(response.choices[0].message.content.split()) * 1.3
        cost = estimate_cost(model, input_tokens, output_tokens)

        # Track usage
        self.client_manager.track_usage(client_id, cost)

        return response.choices[0].message.content

The Results

One agency implemented this architecture. Here's what happened:

Before:

  • Total API cost: $4,200/month
  • All tasks using GPT-6-Astra
  • No client isolation
  • No visibility into profitability

After 1 month:

  • Total API cost: $2,800/month (33% reduction)
  • 80% of tasks routed to cheaper models
  • Client isolation implemented
  • Clear visibility into per-client costs

After 3 months:

  • Total API cost: $1,600/month (62% reduction)
  • Continuous optimization of routing rules
  • Identified 2 unprofitable clients (adjusted pricing)
  • Increased overall margin by 25%

Available Models on RollTok

RollTok provides 49 models across 9 families. Here are the key ones for agencies:

Budget models (simple tasks):

  • Doubao-Seed-2.0-Mini: $0.03/$0.29 per million tokens
  • qwen3.7-flash: $0.10/$0.20
  • deepseek-v4-flash: $0.15/$0.30

Mid-tier models (most tasks):

  • qwen3.7-plus: $0.40/$1.20
  • GPT-5.4-Nano: $0.25/$0.75
  • Claude-Sonnet-5: $2.00/$10.00

Premium models (complex tasks):

  • GPT-6-Astra: $17.00/$63.75
  • Claude-Opus-5: $5.00/$25.00

The price difference between budget and premium is up to 566x. Most of your tasks don't need premium.

Next Steps

If your API costs are more than 15% of revenue, start here:

  1. Audit your usage: Pull your last 3 months of API bills
  2. Categorize tasks: Simple, medium, complex
  3. Map to models: Match each category to the cheapest viable model
  4. Implement routing: Use the code above as a starting point
  5. Isolate clients: Create separate API keys per client

You'll see results in week 1.

Want to test this with your own tasks?

RollTok offers a cost calculator with all 49 models. Plug in your typical usage and see the price difference.

Check it out at rolltok.com

📰 Read the original article on Dev.to AI

Originally published by Dev.to AI. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.