Skip to main content

OpenRouter vs Vercel: Same Task, 40x the Cost With Add-Ons

Our OpenRouter vs Vercel tests put the same AI task at $4.64 or $185.14 per million calls, depending on privacy controls and customer-ID reporting.

Published

Imagine you've got a million short support tickets to classify. You choose Vercel AI Gateway on its "no platform fees" promise (opens in new tab). You want zero data retention and a customer ID on each request so you can track spending. Surely the same model doing the same job should cost about the same through OpenRouter?

With Vercel's team-wide privacy enforcement and gateway-specific customer-ID field, our test requests give an estimated bill of $185.14 per million calls. OpenRouter, with account ZDR and a customer ID, comes to $4.64. That's nearly 40 times the price!

Four configurations, the same support-ticket classification. Estimated costs include funding fees on $100 credit purchases. ZDR means zero data retention; team ZDR enforces it across clients. Vercel's free per-request option puts it at $4.54. Its paid controls change the comparison.

OpenRouter advertises a 5.5% fee (opens in new tab). Vercel AI Gateway promises "no platform fees" (opens in new tab). Yet Vercel charges separately for some of the controls that make a gateway worth using in the first place. The headline price tells you very little about the bill once you enable them.

Vercel's landing page. The FAQ further down explains that some capabilities cost extra.

For a personal project, access to several models through one API might be enough. An app serving customers has other concerns. You want a privacy rule that applies across clients without relying on each one to send the right flag. You want to see which customers and features are consuming the budget. A gateway can save you from building that administration yourself.

That's why the add-ons belong in the price comparison. When you're routing short support tickets, labeling records or running an agent through several small steps, a fixed charge on every request can cost more than the model. Choosing a cheap model won't help much if the surrounding fees set most of the price.

Even the choice of field mattered. Vercel accepted the same customer ID in two documented fields and grouped both correctly in its report. One field incurred a reporting fee. The other didn't. That difference takes the Vercel estimate from $107.74 to $185.14 per million calls, with team ZDR enabled in both cases.

Then we checked Vercel's pricing tutorial. Its example reads a cost field that left out 98.3% of the charge on our request with privacy enforcement and two reporting tags enabled. The full amount was available in the same response, under a different name.

Our earlier Vercel AI Gateway review questioned the fees behind the marketing. For this comparison, Molt ran 31 test requests for Folding Sky on September 7, 2026, to see what happens to the bill when you add privacy controls and customer reporting.

The model did the same work in every configuration

We asked GPT-4.1 nano to route a support ticket:

Route this support ticket. Reply with exactly one label: billing, technical, or account.
Ticket: I was charged twice for my monthly subscription.

Both gateways used Azure, returned billing, and charged for 36 input tokens and two output tokens. Neither reported a cache hit. The inference cost was $0.0000044 on each.

OpenRouter deducted that amount. Vercel deducted $0.0001044. Its extra $0.0001 was the charge for our existing team-wide zero data retention setting. That's a 23.7-fold difference in credit usage before funding fees. The amounts are tiny because classifying a short ticket is a tiny job.

Optional controls can be the reason to use a gateway

Vercel's pricing documentation (opens in new tab) distinguishes provider token rates from optional gateway features. The token rates have no markup. Team-wide ZDR costs $0.10 per 1,000 successful requests. Our receipts matched the published charges.

Vercel also offers per-request ZDR without that surcharge (opens in new tab) on Pro and Enterprise. The paid team setting enforces the policy even when a client forgets to ask for it. If several apps or team members share the gateway, that safeguard can be part of why you chose it.

We confirmed the free option by turning team enforcement off and sending providerOptions.gateway.zeroDataRetention: true. Two otherwise identical calls each cost $0.0000044, with ZDR enabled and no privacy surcharge. Sending the flag while team enforcement was on hadn't removed the fee.

Charges didn't consistently follow the dashboard setting during these changes: some calls with team enforcement off were charged, and some with it on weren't. We don't know why. We restored team enforcement afterward.

OpenRouter's account ZDR controls (opens in new tab) were enabled across all five categories shown in its settings. None of our ten OpenRouter inference receipts contained an additional ZDR charge. Its funding fee still applies.

OpenRouter let us keep account-level ZDR restrictions on without adding a fixed charge to each request. Vercel charges for that central control.

That's where Vercel's zero-dollar illustration (opens in new tab) feels cheap to me. It leads with "no platform fees," then meters the administration a team could reasonably want from the platform. A charge for enforcing my privacy policy is a gateway fee as far as my budget is concerned. Calling it optional doesn't change the bill for a team that needs it.

Moving a customer ID changed Vercel's charge

Customer attribution helps you work out whether a subscription price or usage allowance covers what someone consumes. It's a practical reason to use gateway reporting. We checked what it cost to attach that information to a request.

We made one matched request for each of two synthetic customers on both gateways. The body included "user": "fs-audit-20260907-customer-a", with a second ID ending in customer-b.

OpenRouter stored both IDs in its generation receipts as external_user and showed them in the Logs page. Each request still cost $0.0000044.

OpenRouter recorded both customer IDs without an extra charge.

Vercel's two requests also retained their customer attribution without a write surcharge. Its report returned separate rows for A and B, each with one request and a $0.0001044 debit including team ZDR.

Then we repeated customer A's request on Vercel, changing only where we put the ID. We removed the top-level user field and sent this instead:

{
  "providerOptions": {
    "gateway": {
      "user": "fs-audit-20260907-customer-a"
    }
  }
}

This time Vercel charged $0.000075 for the user-ID write, in addition to inference and ZDR. Moving one field added $75 per million calls before funding fees!

Customer attribution in our HTTP requestModel chargeTeam ZDRUser-ID writeComplete credit debit
OpenRouter: top-level user
$0.0000044
$0
$0
$0.0000044
Vercel: top-level user
$0.0000044
$0.0001000
$0
$0.0001044
Vercel: providerOptions.gateway.user
$0.0000044
$0.0001000
$0.0000750
$0.0001794

Each request returned the support-ticket label billing, ran through Azure, and was billed for 36 input tokens and two output tokens. Once the report caught up, customer A's row contained both Vercel requests, totaling $0.0002838. Customer B had one, totaling $0.0001044. The charged and uncharged ID formats both worked for the grouping we tested.

Vercel itemized the user-ID charge. The dashboard rounds it to $0.0001 and the total to $0.0002; our API receipt gives the exact amounts, $0.000075 and $0.0001794.

Vercel's Custom Reporting documentation (opens in new tab) shows both submission formats and prices each distinct user or tag write at $0.000075. It doesn't explain why moving the field changed our bill. This was one HTTP comparison, so I'd ask Vercel to clarify the difference before relying on the uncharged format.

OpenRouter reporting isn't a drop-in equivalent

Vercel's reporting endpoint gave us aggregated spend by customer ID, at a published price of $0.005 per query. OpenRouter gave us customer IDs and costs on individual receipts and dashboard rows. We'd need to sum those ourselves to produce the same report.

OpenRouter documents its management-key Analytics API workflow as free (opens in new tab). Its user breakdown refers to organization members, though, rather than the app customer IDs we sent. We didn't test that API. OpenRouter captured our attribution for free; Vercel also provided the customer-level aggregation.

Both gateways charge to fund the balance

OpenRouter's standard card funding fee (opens in new tab) is 5.5%, with a $0.80 minimum. At $100 of credits, that's $5.50. Vercel charges payment processing too: the checkout screenshot below shows $3.20 for $100 of credits.

Vercel's fee on a $100 credit purchase: $3.20.

At those funding rates, here's what a million of our support-ticket requests would cost:

Estimated usage cost, including the funding fees on $100 credit purchases. Features differ as labeled; report queries, plans and tax are extra.

OpenRouter's higher funding percentage doesn't close this gap: the comparison is still about 23 times for the two central-enforcement configurations with top-level customer IDs.

Vercel's larger charge here comes from enforcing team ZDR on every small call. If you can use its free per-request option reliably and don't need metered reporting, its lower funding fee in this example favors Vercel when inference prices match.

Our OpenRouter vs direct API comparison covers the other choice: keeping separate provider accounts instead of a gateway balance.

Vercel's pricing tutorial left fees out of the calculation

A separate test used Vercel's AI SDK with two reporting tags, billing-pilot and support-triage. The tags cost $0.00015. Together with $0.0001 for team ZDR and $0.0000044 for inference, the request cost $0.0002544.

Vercel's pricing tutorial (opens in new tab) reads result.finalStep.providerMetadata?.gateway?.cost as the actual cost and says it should match the dashboard. We checked it with our support-ticket request.

The tutorial's cost field covered only inference in our SDK requests.

Our tagged response included all of these amounts:

{
  "cost": "0.0000044",
  "zeroDataRetentionCost": "0.0001",
  "reportingTagWriteCost": "0.00015",
  "surchargeCost": "0.00025",
  "gatewayCost": "0.0002544"
}

Privacy enforcement and two reporting tags accounted for 98.3% of this request's charge.

This matters if your app uses the returned cost to bill customers or enforce a spending limit. Charging twice cost for this request would recover only 3.46% of what left the Vercel balance. The tutorial's field would make a losing request look profitable!

Vercel returned the information needed to account for the whole request. The dashboard itemized it. The tutorial should use gatewayCost when it means the complete debit, and show inference separately. OpenRouter's usage.cost matched the generation debit on all ten of our calls; its funding fee was separate.

Larger requests can reverse the pricing comparison

Fixed fees don't always outweigh inference. We tested longer inputs too:

Fixture, without reporting tagsOpenRouter credit debitVercel debit with team ZDRZDR share of Vercel debit
Nano: classify one support ticket
$0.0000044
$0.0001044
95.8%
Nano: classify three reviews in one request
$0.0000102
$0.0001102
90.7%
Nano: 1,029-token input control
$0.0001037
$0.0002037
49.1%
Haiku: 1,031-token input control
$0.0010510
$0.0011510
8.7%

The longer inputs were filler followed by a request to reply OK. Haiku ran through Anthropic on Vercel and Amazon Bedrock on OpenRouter, at matching token prices.

Under our $100 funding assumptions, Vercel's lower processing fee offsets a $0.0001 team ZDR charge once the shared inference cost exceeds about $0.00449 per request. Paid tags or users raise that break-even point.

For short calls, reducing the model price can accomplish very little. Halving inference on our tagged SDK request would reduce its complete debit by less than 1%. Combining work into fewer calls could cut fixed fees, provided the combined task still gives you the answers you need.

Record the complete charge in your app

We build Cumbersome, where people connect their own API accounts on iPhone and Mac. When an app displays the cost of a request, it should distinguish the model charge from what left the connected balance.

For a single Vercel SDK generation, record both:

const receipt = result.finalStep.providerMetadata?.gateway;

console.log({
  inference: receipt?.cost,
  surcharges: receipt?.surchargeCost,
  creditDebit: receipt?.gatewayCost,
  generationId: receipt?.generationId,
});

For HTTP, our Vercel responses used usage.cost for inference and usage.gateway_cost for the complete debit. Its generation endpoint (opens in new tab) returned the latter as total_cost. Save the generation ID so you can check the receipt once it's available.

An agent with several steps needs every generation's complete cost. A customer margin calculation also needs funding and reporting-query charges allocated appropriately. Before trusting any field, check it against a completed request using your intended account settings and metadata format.

Bless up! 🙏✨