Skip to main content

Overview

Model Pricing is where you tell Barndoor how much each model costs per million input and output tokens. Barndoor uses your prices to:
  • enforce spending budgets in LLM Controls
  • record per-request estimated_cost values on every audit event (input cost, output cost, total)
  • power per-team / per-user / per-model cost attribution in the Reporting area
Pricing lives in the Barndoor portal under LLM Configuration → Model Pricing.
Model Pricing tab listing showing the badge set, Review updates banner, and history controls
Without matching prices, requests still succeed — the gateway just records a cost of $0 for those requests. Token-denominated budgets are unaffected; spending budgets and cost reports show zero. Set pricing for every model you care about attributing cost to.

Before You Begin

  • A Barndoor account with admin or superadmin privileges.
  • An LLM Gateway with at least one provider and one model already configured — see Using the LLM Gateway.

Quickstart: Import Default Prices

Barndoor ships a curated catalog of market-rate prices for the most-popular providers (OpenAI, Anthropic, AWS Bedrock, Google Vertex AI, Azure OpenAI, and many more). The fastest way to get started is to import the ones you use.
1

Open LLM Configuration → Model Pricing

The tab shows your current price list (empty on a fresh org).
2

Click Import Defaults

A modal opens with one row per default model, grouped by provider. Use the search box or the per-provider checkbox to select what you want.
3

Pick a Sync behavior

At the top of the modal, choose how Barndoor should handle future changes to its default catalog for the rows you’re importing — Prompt me on updates, I’ll manage it, or Auto-sync to Barndoor. All rows in this import share the same choice; you can change any individual row’s sync behavior later. See Keeping prices in sync with Barndoor’s catalog for what each mode does.
4

Select models and click Import

Models you’ve already priced are disabled with an Imported badge so you can’t import duplicates. The footer shows the live count of selected rows.
Import Defaults modal with the Sync behavior picker and provider sections expanded

How Pricing Resolves

When a request flows through the gateway, Barndoor finds the right price by checking your rules in this order. The first match wins.
TierUse when
1. Provider-specificYou’ve negotiated a custom rate with one specific provider connection (for example one of your Azure deployments).
2. CatalogThe price applies to a whole vendor line — every OpenAI provider, every Bedrock provider, etc. — but you don’t want it to apply across vendors.
3. Organization-wideThe price applies wherever the model name matches, regardless of which provider serves it. The simplest and most common scope.
4. Platform defaultsBarndoor’s curated catalog of market-rate prices. Kicks in as a safety net even if you’ve never imported anything.
Stick to organization-wide rules for everyday pricing. Use catalog or provider-specific overrides only when you genuinely have a different price for the same model on different vendors or connections (negotiated discount, fine-tuned model variant, etc.). Fewer rules means fewer surprises.

Creating a Pricing Rule Manually

1

Click Add Pricing Rule

The Create dialog opens.
2

Model pattern

Either pick an enabled model from the dropdown (auto-populated from your Model Routes) or type a custom pattern. Patterns can be:
  • Exactgpt-4o-mini matches only that exact model.
  • Prefix wildcardgpt-4o* matches gpt-4o, gpt-4o-mini, gpt-4o-2024-08-06, and any other model whose name starts with gpt-4o.
Only trailing * is supported. Patterns like *-mini, gpt-*-mini, or regex are not.
3

Catalog (optional)

Restrict this rule to one vendor line (OpenAI, Bedrock, etc.). Leave blank for Any catalog.
4

Provider (optional)

Restrict this rule to a single configured provider connection. Use this for negotiated discounts or pricing that differs by deployment.
5

Input + output cost per million tokens

Two dollar amounts, both required. Use the same per-million-token prices the provider publishes on their pricing page.
6

When this takes effect

Choose Take effect immediately for normal price changes, or Schedule for later to pick a date and time the new price will switch on (with up to ~5 minutes activation precision). Until a scheduled price activates, the row shows a Scheduled badge.You can also enter an optional Change reason that appears in the row’s Pricing history — useful for explaining why a price moved when a future admin looks back.
7

Save

Immediate rules take effect on the next request through the gateway. Scheduled rules activate at the time you chose.
Add Pricing Rule dialog with model pattern, costs, scheduling controls, and sync behavior
Avoid overlapping rules at the same scope. If both gpt-4o (exact) and gpt-4o* (wildcard) exist at the catalog level, you’ll get inconsistent results — write rules whose patterns are mutually exclusive, or use exact-model rules only.

Editing and Scheduling Price Changes

Click the pencil icon on any row to edit. Every save creates a new version of the rule with an effective_from timestamp — Barndoor never overwrites an existing price in place. That gives you three things at once:
  • Past and active versions are an audit trail. They can’t be deleted or modified.
  • Scheduled future versions can be canceled or edited from the listing or from the row’s Pricing history.
  • Changes are forward-looking. They apply only to requests served after the new version becomes active — they don’t retroactively re-cost historical audit events or top up spending budgets that have already accumulated.

Editing an active price

  1. Click the pencil icon on the row.
  2. Adjust the input or output cost.
  3. Choose Take effect immediately for a normal change, or Schedule for later to pin the new price to a future date and time.
  4. Optionally fill in Change reason — it shows up in Pricing history so you (or whoever inherits the rule) know why.
  5. Save. Immediate edits apply on the very next request; scheduled edits activate at the time you chose, with up to ~5 minutes activation precision.

Editing or canceling a scheduled change

Rows with a pending future version display a Scheduled badge (N scheduled if more than one is queued). To change or cancel a scheduled price before it activates, open the Pricing history dialog (clock icon on the row) and use the pencil or trash icon next to the scheduled entry. The trash icon on a scheduled version cancels that change — it does not affect any active or past version.
You cannot edit the Model pattern, Catalog, or Provider fields after a rule is created. To change those, create a new rule with the right scope — Barndoor’s resolution order will decide which one wins. Deleting an active rule is not supported; create a new version (or new rule) instead.

Reset to Default

If you’ve drifted from Barndoor’s curated default for a model, the row shows a Custom badge and a Reset to default action appears next to it (and inside the Edit dialog). Clicking it creates a new version of the rule whose input and output costs match the current default — Barndoor records Reset to default as the change reason automatically so it’s clear in the history.
Reset to default uses the current default catalog, not the one you originally imported from. If Barndoor has raised or lowered the default since your import, Reset will move you to the new value. Edit and save your existing number explicitly if you want to keep what you had.

Pricing History

Each row in the listing has a clock icon that opens its Pricing History dialog — a timeline of every version of that rule, newest first. Each entry shows:
  • The input and output costs at that version.
  • The effective_from timestamp.
  • Who made the change (actor email, when available).
  • How the change was made — manual edit, scheduled change, Reset to default, or an automatic sync from Barndoor’s catalog.
  • The optional Change reason you (or another admin) entered at the time.
Use the History dialog to:
  • Audit who changed what, when, and why.
  • Cancel a pending scheduled change before it activates — click the trash icon next to a scheduled entry. Active and past entries are immutable.
  • Edit a pending scheduled change — click the pencil icon to re-pick the date / time or adjust the price before it goes live.
Past versions stay in the timeline indefinitely. There’s no manual “delete” for them — they’re what Barndoor uses to know what a historical request would have cost at the time it was made.

Keeping Prices in Sync with Barndoor’s Catalog

Barndoor refreshes its default catalog as upstream provider prices change. Each pricing row in your org carries a Sync behavior that decides what happens when one of those refreshes affects a model you’ve imported. You pick a sync behavior when you import defaults, and you can change it later from the Edit dialog.
Sync behaviorWhat it does
TrackingPrompt me on updatesImports the default at the moment of import. When Barndoor changes the default afterward, the row gets an Update available badge and the Review updates banner appears at the top of the tab. Apply the update from the banner (or pin the row to your current price).
PinnedI’ll manage itA fixed price you maintain manually. Barndoor never prompts you about catalog changes for this row. The row shows a Custom badge with a lock icon.
Auto-syncAuto-sync to BarndoorBarndoor’s defaults flow through automatically — typically within a minute of the catalog updating. The row shows an Auto-sync badge.

Reviewing updates

When at least one of your tracking rows is out of sync with Barndoor’s current default, a blue Review updates banner appears at the top of the Model Pricing tab. Clicking it opens a dialog listing every affected row with the old vs new default price. From there you can:
  • Apply the update to one or more rows — Barndoor creates a new version of each accepted rule with the latest default.
  • Pin a row instead — switches its sync behavior to I’ll manage it so you stop getting prompted.
Apply-or-pin is a per-row decision; the banner stays up until every tracking row is reconciled.
Auto-sync vs Tracking: Auto-sync keeps you on Barndoor’s prices with no interaction — at the cost of having those prices change underneath you. Tracking surfaces every change for review first. Pick Auto-sync when pricing only feeds cost telemetry; pick Tracking when prices feed spending budgets you don’t want quietly shifting.

Badges in the Pricing Listing

Each row carries one or more badges that summarize its state at a glance.
BadgeMeaning
DefaultA Barndoor default exists for this pattern, the row’s sync behavior is Prompt me on updates, and your costs match the current default.
CustomA Barndoor default exists, but you’ve either changed the costs or pinned the row to I’ll manage it. A lock icon distinguishes pinned rows.
ManualNo Barndoor default exists for this pattern — you created the rule from scratch.
Update availableA Prompt me on updates row whose Barndoor default has changed since you imported it. Click Review updates at the top of the tab to apply or pin.
Auto-syncThe row’s sync behavior is Auto-sync to Barndoor — Barndoor’s defaults flow through automatically.
Scheduled (or N scheduled)The row has at least one future-dated version waiting to activate. Click the clock icon to open Pricing history and inspect, edit, or cancel it.

Require Pricing for Model Mappings

The toggle at the top of the Model Pricing tab — Require pricing for model mappings — is a safety net for organizations that want every billable model to have a price set before it can be enabled in a route.
'Require pricing for model mappings' toggle at the top of the Model Pricing tab
When on:
  • The Models and Model Routes tabs in LLM Configuration show a No pricing badge next to any model that has no matching rule.
  • You can’t enable a route that points at an unpriced model — Barndoor blocks the save with a message explaining what’s missing.
When off (default): unpriced models can be served normally; they just record cost as $0. Turn this on if you want to guarantee that nobody silently introduces a route whose cost won’t show up in reports.

How Pricing Plugs into the Rest of the Platform

FeatureHow it uses pricing
Token budgets (LLM Controls)Doesn’t use pricing. Caps total tokens; independent of pricing.
Spending budgets (LLM Controls)Uses pricing. Each successful request debits (prompt_tokens × input_rate) + (completion_tokens × output_rate). Without matching pricing the spending counter stays at 0 for that model.
Per-request audit eventsUses pricing. estimated_cost, input_cost, and output_cost fields are populated on the audit event for every successful LLM request.
Reporting → LLM UsageUses pricing. Aggregates the per-request estimated_cost recorded on audit events.
Cost is computed after a successful upstream response, using the actual prompt + completion token counts reported by the provider. Failed requests record no cost.

Troubleshooting

The models being called don’t have matching pricing rules in your org. Check Model Pricing for rows that cover those models (exact pattern, prefix wildcard, or one of the default rows imported into your org).Spending budgets only debit cost when a price matches — they don’t auto-fall-back to the platform default catalog. Importing the relevant defaults is the fastest fix.
Same root cause as above — no pricing rule matched. Either:
  • The model name in the request didn’t match any pattern (look for trailing-* wildcard mismatches).
  • The request resolved to a provider whose provider-specific pricing override has zero rates.
Audit events for unpriced requests omit the cost fields entirely rather than writing $0, so you’ll see them as missing in some report views.
Price changes are forward-looking — both immediate and scheduled. They affect any request that happens after the new version becomes active; they don’t retroactively re-cost historical audit events. Spending budgets keep the running totals they already accumulated under the old price.If you need to true up a budget after a price correction, contact [email protected].
Refresh the Model Pricing tab — it occasionally serves cached UI data right after a save. If you used Schedule for later rather than Take effect immediately, the new price won’t appear in the row until the scheduled time arrives; click the clock icon on the row to confirm the Scheduled entry is in Pricing history. Pricing changes that have already activated apply to subsequent gateway requests immediately — if the row’s costs look right in the listing, they’re live.
Open Pricing history on the affected row (clock icon) and click the trash icon next to the scheduled entry. Cancellation only affects pending future versions — past and active versions are immutable.
See How Pricing Resolves for the four-tier lookup order. The most specific scope (provider-specific) beats less specific ones (catalog, org-wide, defaults).If you have two rules at the same scope tier that both match (e.g. an exact gpt-4o and a wildcard gpt-4o* both at the org-wide scope), behavior is not guaranteed — the gateway uses the first match it finds. Remove the duplicate or tighten one of the patterns so only one matches each model.

Frequently Asked Questions

That’s your choice — set the Sync behavior on each imported row:
  • Prompt me on updates (default) — Barndoor flags catalog changes with an Update available badge and a top-of-tab Review updates banner; you apply or pin per row.
  • I’ll manage it — Barndoor never changes your prices; you maintain them by hand.
  • Auto-sync to Barndoor — Barndoor’s defaults flow through automatically, typically within a minute of a catalog change.
See Keeping Prices in Sync with Barndoor’s Catalog for the full story. You can change sync behavior on any row at any time from the Edit dialog, and the Import Defaults modal asks you to pick a sync behavior up front so all the rows in a single import share one default.
Currently USD only. All input and output costs are entered and recorded in US dollars. Reporting also surfaces USD.
Not directly — pricing is keyed on model name + scope, not request type. The simplest workaround is to expose distinct model aliases in Model Routes (for example gpt-4o-realtime vs gpt-4o-batch) and price each one independently.
Multiply by 1,000. Barndoor stores costs as USD per million tokens; if your provider quotes $0.0025 per 1K input tokens, enter 2.50 as the input cost per million.
Yes, if you want embedding requests to show up in spending budgets and cost reports. Embedding requests consume tokens (input only), so set the input rate for them and leave the output rate at 0.
You can pick. The Import Defaults modal lets you select individual models or use the per-provider checkbox to select an entire vendor’s catalog. The footer shows the live count of selected rows.

Need Help?

Reach out to [email protected] with:
  • The model name (and provider) you’re trying to price.
  • The pattern + costs you’ve configured (a screenshot of the row helps).
  • The behavior you’re seeing — $0 cost in reports, budget not debiting, unpriced-model warning, etc.