AI gateway and control plane

Your applications
stop hardcoding
models.

Switchyard sits between everything you run and every AI provider. Each application gets one key and asks for auto. You decide — centrally — which model answers, what it may spend, and what happens when a provider breaks.

OpenAI-compatible · point an existing SDK at it and change one line

email-marketingsales-crmonboardingSWITCHYARDauthenticate · policyroute · meterglm-flashprimary routeupstream 500 · circuit openinggpt-miniapproved fallbackanswered · logged · costedclaude-sonnetpremium · not permitted
live route · The primary fails, the approved fallback answers, and the premium model stays out of it because this application does not permit premium fallback. The calling application sees a normal response.

The problem

A model id in twelve repositories is twelve deploys.

Without a gateway

  • Every service holds a provider key in its own environment.
  • The model id is compiled into the application. Changing it is a pull request and a release.
  • Spend is one invoice at the end of the month with no idea which app caused it.
  • A provider outage takes down whatever happened to call it.
  • Nobody can answer what a given feature costs per request.

With Switchyard

  • One credential per application, issued and revoked from the dashboard.
  • The model is configuration. Repoint a route and the next request follows it.
  • Spend is attributed per application, per model, per task, as it happens.
  • A failing provider is retried, then routed around, then taken out of rotation.
  • Every request carries its token count, latency and estimated cost.

How it works

Five things happen between the request and the model.

None of them live in your application. All of them are visible afterwards.

01

Authenticate

The application presents its own key. Switchyard matches the hash, checks it is live and unexpired, and resolves which application and organization it belongs to.

02

Clear policy

Data classification, token ceiling, rate limit and month-to-date budget are all checked before a provider is contacted. A refusal here costs nothing.

03

Set the route

An explicit approved model wins, then the task rule, then the policy default. Any model with an open circuit is skipped.

04

Run and recover

Transient failures retry, then fail over down the approved chain. Premium models stay out of it unless the application explicitly permits them.

05

Meter

Tokens in and out, estimated cost, latency, provider, and which model actually answered — written before the response returns.

Capabilities

Built for the day a provider lets you down.

model portability

Change the model without a deploy

Applications ask for an alias or for auto — never a provider's model id. Repoint the route here and every application follows on its next request.

spend control

Budgets that actually stop traffic

Per application and per organization, enforced server-side against recorded spend. At the cap the request is refused with a 402, not logged and paid for.

reliability

Failover down an approved chain

One retry on the primary, then each approved fallback in order. The requesting application sees a normal response and the failover shows up in the logs.

circuit breakers

A sick model leaves the rotation

Five consecutive failures pulls a model out for two minutes. Routing skips it automatically and an alert opens.

accounting

Every request costed

Input, output and cached tokens, estimated cost, latency and the model that served it. Dashboard totals reconcile to the underlying records.

prompt registry

Prompts versioned centrally

System prompts live here rather than in application code. Every save is a new version; publishing an older one is the rollback.

governance

Regulated workloads refused

Legal and medical classifications are denied outright, whether declared on the application or on the request. No allowlist overrides it.

secrets

Provider keys never leave

Encrypted with AES-256-GCM and returned by no endpoint. Application keys are stored as hashes and shown once, at creation.

Pricing

You pay for the control plane. Model spend stays yours.

Switchyard bills for the gateway. What your applications spend upstream is billed by your provider, on your own account, and shown here to the cent.

Free

Put one application behind the gateway and see what it costs.

$0

free forever

  • 1 application
  • 10,000 requests a month
  • Budgets, rate limits and failover
  • 7-day request history
  • Shared provider credential
Request access
Most teams

Team

A product team running AI across several services.

$49

per month · $490 billed yearly

  • 5 applications
  • 250,000 requests a month
  • Bring your own provider keys
  • Prompt registry and test console
  • 90-day request history
  • Budget and outage alerts
Request access

Scale

Several teams, or several organizations, under one control plane.

$199

per month · $1990 billed yearly

  • 25 applications
  • 2,000,000 requests a month
  • Multi-organization super admin
  • Audit trail export
  • 1-year request history
  • Priority support
Request access

Enterprise

Self-hosted, or beyond what the Scale limits allow.

Custom

talk to us

  • Unlimited applications and requests
  • Self-hosted or dedicated deployment
  • Custom retention and data residency
  • SSO and role mapping
  • Onboarding and migration help
Talk to us

Yearly billing is ten months for twelve. Request allowances are a fair-use ceiling — cross one and we raise it with you rather than cutting your traffic off mid-month. We never take a percentage of what you spend upstream, and we never mark up tokens.

Accounts are currently created by invitation — get in touch and we will set yours up.

Get started

Three steps, and one line of your code.

  1. 1Register the applicationName it, set its budget, rate limit and model allowlist.
  2. 2Issue a keyShown once. Store it in that application's environment.
  3. 3Change the base URLEverything else about your call stays as it is.
curl
curl https://switchyard.click/v1/chat/completions \
  -H "Authorization: Bearer $SWITCHYARD_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "auto",
    "task": "draft",
    "messages": [
      { "role": "user", "content": "Hello" }
    ]
  }'
openai sdk
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.SWITCHYARD_KEY,
  baseURL: "https://switchyard.click/v1",
});

const res = await client.chat.completions.create({
  model: "auto",
  messages: [{ role: "user", content: "Hello" }],
});

The response carries an extra gateway object naming the request id, the model that actually answered, whether a fallback fired, the latency and the estimated cost. Standard SDK fields are untouched. Full API reference.

Make the model a dependency, not a decision you keep redeploying.