Bring your own model key

The control plane between your agent and your model vendor.

REA ControlPlane is the gateway on that path. Your agent keeps its model. REA does not host it, bill the vendor’s tokens, or rewrite the answer. LoopGuard probes a repeated code structure in a Firecracker microVM. PreFlight applies the deny rules you declared. TraceGuard applies the tool list for that key. All three are included on every plan.

7-day trial · Card required · Or start a plan today
Your model key is used for that call and is not stored.

Request flow API live
Your agent Hermes · Claude Code · Codex · Cursor · Gemini CLI · Cline · Continue · and 8 more
REA ControlPlane One hop
PreFlightCheck declared policy01
LoopGuardProbe a runaway in a Firecracker microVM02
TraceGuardThe tool list for this key03
Your model vendor Your key · Your model
  • 3controls on every plan
  • 1base URL for every agent
  • 7 daystrial, card required

API live LoopGuard · Firecracker microVM · PreFlight · TraceGuard Bring your own key OpenAI · Anthropic · xAI · Gemini · Mistral · DeepSeek · Groq · Together · Fireworks · Amazon Bedrock · OpenRouter 7-day trial, or start a plan today

The change is the base URL

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_REA_API_KEY",
    base_url="https://api.reacontrolplane.com/v1",
    default_headers={"X-Upstream-Api-Key": "YOUR_MODEL_KEY"},
)

resp = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Reply with exactly: REA LIVE"}],
)
print(resp.choices[0].message.content)
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: "YOUR_REA_API_KEY",
  baseURL: "https://api.reacontrolplane.com/v1",
  defaultHeaders: { "X-Upstream-Api-Key": "YOUR_MODEL_KEY" },
});

const resp = await client.chat.completions.create({
  model: "gpt-4o-mini",
  messages: [{ role: "user", content: "Reply with exactly: REA LIVE" }],
});
console.log(resp.choices[0].message.content);
curl -s https://api.reacontrolplane.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_REA_API_KEY" \
  -H "X-Upstream-Api-Key: YOUR_MODEL_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"Reply with exactly: REA LIVE"}]}'

Same shape as an OpenAI chat completion, including streaming. Your REA key and your vendor key both go to REA. Use a header, or put them in one API key with a dot between them. The vendor key is used for that call and is not stored. REA keeps no backup vendor key. You pay that vendor directly. Claude Code, Codex, and Gemini CLI use their own paths. Set up each one.

Three controls. One hop.

Your agent still chooses the work. These three decide what is allowed to leave, and each one has its own page.

LoopGuard

Do not pay for the same broken loop again.

A retry of broken code can be another vendor bill. LoopGuard hashes the structure of the code, not the wording of the prompt. A new structure is probed in a Firecracker microVM. If the probe finds the loop, the model is not called. If the pool cannot run the probe, the check is skipped and the call can still be forwarded. A later repeat of a stopped structure is the stored stop. Unique chat still pays the vendor.

How LoopGuard decides

PreFlight

Refuse the call before the vendor sees it.

PreFlight checks the deny rules you declared. A secret marker on a declared path is refused the same way. The prompt is not read for that check. A match costs $0, and the vendor is never called. A clean call continues on the same hop.

How PreFlight decides

TraceGuard

Choose the tools this key may use.

Lock the names this key may use, or keep up to 25 lists and apply one. A repeated tool is Contain. The first attempt to leave the sandbox is Contain. Kill is a second escape, or a secret-shaped call after the session was already contained. Contain still calls the model. Kill returns HTTP 403 traceguard_killed and ends the hop. Until you lock, every tool is recorded and the call is not stopped. A name off a locked list is Direct, and Direct does not stop the call. No message and no tool arguments are stored.

How TraceGuard decides
LoopGuard in the REA console. The chart compares model calls with calls that were not sent. The cache table is below it.
LoopGuard. Model calls against calls that were not sent.
PreFlight in the REA console. Allow, deny, and skip counts, then the last checks. The message is not in the table.
PreFlight. Allow, deny, and skip. The message is not stored.
TraceGuard in the REA console. Observe, Direct, Contain, Kill, and Inform. No tool arguments are shown.
TraceGuard. Observe, Direct, Contain, Kill, and Inform.

Included with the gateway

Your vendor account

REA does not host the model, store the vendor key, or keep a backup key. The vendor bills you for the calls that are forwarded.

All three controls

LoopGuard, PreFlight, and TraceGuard are on every plan. They are not an add-on, and a refused or stopped call is not a forwarded call.

A receipt, not a transcript

Each forwarded call returns the outcome, the model, and the token counts. Message text and tool arguments are not stored. The field names are on Architecture.

Vendors

Agents and CLIs

Names identify products a user can point at REA. They are not partners, and the marks are not an endorsement. Bedrock and OpenRouter have their own routes. Agents and CLIs each have a page.

Where it sits

  1. Your agent

    Hermes, Cursor, Continue, Cline, OpenCode, Aider, or an SDK.

    POST /v1/chat/completions

    Authorization is Bearer rea_., or the REA key alone with X-Upstream-Api-Key.

  2. REA ControlPlane

    https://api.reacontrolplane.com

    1. Checks your REA key and the forwarded-call allowance.
    2. PreFlight checks policy, including a secret marker on a declared path. A refusal is $0. The vendor is not called.
    3. TraceGuard applies this key's tool list. Contain is the first step. Kill is the next. Contain still calls the model. Kill returns HTTP 403 traceguard_killed and ends the hop.
    4. LoopGuard fingerprints the code structure. A known trap returns from cache. Otherwise the snippet is probed in a Firecracker microVM. The probe is time-boxed.
    5. The TraceGuard receipt stores no message text.
  3. Your vendor

    OpenAI, Anthropic, xAI, Gemini, Mistral, DeepSeek, Groq, Together, Fireworks, Amazon Bedrock, or OpenRouter. Your key. Your bill.

    A non-stream answer comes back with a small rea_meta receipt. Normal streams do not carry it.

You do not change models. You point the base URL at REA. An SDK uses that same address. REA does not ship one. Claude Code, Codex, and Gemini CLI use their own paths. SDKs are on Set up.

Q&A

What is REA ControlPlane?

REA sits between your agent and your model vendor. You set a tool list for a key. A repeated tool is Contain. The first attempt to leave the sandbox is Contain. Kill is a second escape, or a secret-shaped call after the session was already contained. Contain still calls the model. Kill returns HTTP 403 traceguard_killed and ends the hop. Until the list is locked, the call is not stopped. PreFlight checks policy before the call. LoopGuard is the cost control: a repeated code structure is not sent again.

Is this the same as Control Plane?

No. REA ControlPlane is a product of REA Research Labs, Inc. It is not the product at controlplane.com, and it is not a Kubernetes control plane. The short description is on Facts.

What is a forwarded call?

A forwarded call is one request REA sends to your vendor. A PreFlight refusal, a LoopGuard stop, and a TraceGuard Kill are not counted. Contain still calls the vendor, so it counts. You pay your vendor for tokens on the calls that go through. When the forwarded-call allowance runs out, REA returns 402. Going over the plan's requests per minute returns 429.

What happens on a cache hit?

REA replays the stored stop from an earlier LoopGuard decision. It never replays a vendor answer, and a cache hit does not create a new vendor call.

What do I need for a Trial key?

Signup asks for your name, work email, company, and a password. Phone and role are optional. Stripe collects the billing address. The trial needs a card and lasts 7 days. Calls stop at 2,000 forwarded calls, and the card is not charged early. Cancel before the 7 days end and the card is not charged. You can start Developer Pro or Growth Team today instead. The key is shown once, so copy it immediately. The monthly letter is a separate list. An account does not join it unless the signup box is checked. The box is not checked.

Which agents can use REA?

Hermes, Claude Code, Codex CLI, Cursor, Gemini CLI, Cline, Continue, OpenCode, Kilo Code, Roo Code, Aider, Goose, Qwen Code, Zed, and Pi. Claude Code, Codex, and Gemini CLI use their own paths and a combined key. Cursor chat uses the chat path. Tab completion in Cursor does not. The others use the chat path. Subscription logins are refused. The setup page has the settings.

Is Firecracker live?

Yes. The probe on api.reacontrolplane.com runs in a Firecracker microVM. If the pool cannot run it, the code check is skipped and the call can still be forwarded. The status name is on Architecture.

How much will REA save?

There is no universal savings percentage. A repeated failure can be answered from the stored stop. A new failure the probe does not stop still calls the model. Results depend on your traffic, models, and repeat patterns.