Skip to main content
The Tools Gateway is BYOK’s mirror image for tools. Today we save you from juggling model keys; this saves you from juggling tool keys. Reference a reserved tool name (like tavily_orbitrage) in your normal tools=[…] array — Orbitrage runs it with our pooled key, feeds the result back to the model, and returns the final answer. You pay per call (provider price + the standard 2.5% platform fee). Your own tools always run on your side, untouched.

How it works

1

Enable + allow-list

On the Tools Gateway page, turn the feature on and check the managed tools you want to allow.
2

Reference the tool by name

Add the reserved name to your request’s tools array — in pure OpenAI format. No key, no setup.
3

We run it, you get the answer

When the model calls a managed tool, Orbitrage executes it (with our key), appends the result, and re-invokes the model until it produces a final answer — all in one request. We bill the call to your credit balance.
Tools Gateway settings page with the managed-tool allow-list

Available tools

Tool nameWhat it doesRuns via
tavily_orbitrageWeb search with a synthesized answer + sourcesTavily MCP
serper_orbitrageGoogle web search (organic results, answer box)Serper
firecrawl_orbitrageScrape a page → clean LLM-ready markdownFirecrawl MCP
jina_orbitrageRead a URL → markdown textJina Reader
weather_orbitrageCurrent weather for a cityOpenWeather
calculator_orbitrageEvaluate an arithmetic expression (local, free)Orbitrage
datetime_orbitrageCurrent date/time for any timezone (local, free)Orbitrage
Rich tools (Tavily, Firecrawl) run through the vendor’s hosted MCP server with our key injected — so the model’s tool calls are executed and billed by us, and it works for every model you route to, not just MCP-aware ones. Your key never leaves our backend.

Usage

Just list the tool name — Orbitrage expands it to the full definition for you. This is the whole point: zero boilerplate.
import os, orbitrage
orbitrage.init(os.environ["ORBITRAGE_API_KEY"], user_id="customer_42")

from openai import OpenAI
client = OpenAI()

resp = client.chat.completions.create(
    model="grok-4-fast",          # pin a model for tools (see tip below)
    messages=[{"role": "user", "content": "What's the latest on the Model Context Protocol? Cite sources."}],
    tools=["tavily_orbitrage"],   # ← that's it
)
print(resp.choices[0].message.content)
Pin a model for tool-heavy calls. claude-sonnet-4-6, grok-4-fast, and gpt-4o-mini all run managed tools reliably. model="auto" can route to a small reasoning model that truncates before emitting the tool call — use a direct model (or set max_tokens ≥ 512) when tools matter.
The SDK doesn’t matter — Orbitrage works through any OpenAI-compatible client because the gateway recognizes the reserved name on the wire.

One example per managed tool

Each is a one-liner — just name the tool. (Get the 7006652 answer, a real forecast, live search results, scraped markdown, etc., looped back automatically.)
ASK = lambda prompt, tool: OpenAI().chat.completions.create(
    model="grok-4-fast", max_tokens=300,
    messages=[{"role": "user", "content": prompt}], tools=[tool],
).choices[0].message.content

ASK("Compute 1234 * 5678. Only the number.",            "calculator_orbitrage")  # → 7006652
ASK("What time is it in Asia/Tokyo right now?",          "datetime_orbitrage")
ASK("What's the weather in Lisbon?",                     "weather_orbitrage")
ASK("Search the web: who won the 2025 F1 title? Cite.",  "tavily_orbitrage")     # Tavily
ASK("Google: best Python HTTP client 2026.",             "serper_orbitrage")     # Serper SERP
ASK("Scrape https://modelcontextprotocol.io and summarize.", "firecrawl_orbitrage")  # Firecrawl
ASK("Read https://news.ycombinator.com and list 3 titles.",  "jina_orbitrage")   # Jina Reader
Mix as many as you like in one tools=[...] array — the model picks which to call, Orbitrage runs each server-side, and you get one final answer.

Customizing + mixing with your own tools

Prefer the full OpenAI tool object? It still works — pass a normal function tool and we’ll use your schema. Your own tools sit right alongside managed ones and always run on your side:
tools=[
    "tavily_orbitrage",                       # managed — we run it
    {"type": "function", "function": {        # your own — you run it
        "name": "get_order_status",
        "parameters": {"type": "object", "properties": {"id": {"type": "string"}}, "required": ["id"]}}},
]

Managed vs. your own tools

  • Managed (*_orbitrage, allow-listed): we run them, loop until a final answer, and bill per call. The dashboard flags each one via Orbitrage with its cost.
  • Your tools: if the model calls one of your own functions, we hand that turn straight back to you to execute — exactly like a normal tool call. If a single turn mixes both, we return it for you to handle.

Billing + tracking

Each managed call is billed at the provider’s price + 2.5% and folded into the request’s cost_usd, so it debits your credits like any other usage. Per-tool spend is recorded on routing_steps (tool_calls_cost_usd, managed_tools, managed_tool_calls) and rolled up by the org_tool_spend analytics function. Streaming requests emit scaleasap.tool_call / scaleasap.tool_result progress events while the tools run.