Build the portal to launch your AI product.

A gateway your customers call, model names you own, routing you control, metered and capped while the response is still streaming.

Get started
// stand up your product's gateway
$ seams apps create <app> --name <app>
ok <app>.gw.ourseams.com
// point OpenAI, Anthropic, or Gemini clients here
export OPENAI_BASE_URL=https://<app>.gw.ourseams.com/v1
export ANTHROPIC_BASE_URL=https://<app>.gw.ourseams.com
 
// one call proves the wire works
$ curl https://<app>.gw.ourseams.com/v1/chat/completions \
-H "Authorization: Bearer ak_app_…" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-5-mini","messages":[{"role":"user","content":"hi"}]}'
hold $0.04 · openai/gpt-5-mini
200 settled $0.0312

Monetization

Plans, balances, and your markup. See provider cost and revenue on the same ledger.

Access

Choose which models each customer can call, under your own names. Repoint without redeploying.

Control

Know who is calling and what they can spend. Caps are checked while the stream is open.

What your customers buy

The portal is the product. The gateway is how it holds.

Your customers get one page that answers what did I spend and how much is left, under your name, on your subdomain. Every answer it gives is a support ticket nobody has to read.

Four pages your customers read, not four you build
Usage, spending, keys and activity, hosted at <app>.portal.ourseams.com with your product name, your colour and your logo. Your customers never see ours.
The gateway underneath is what makes the page true
Every number on it was written on the request path: metered as the response streamed, held against a balance, settled to the cent. Nothing is reconciled overnight.
The names and the limits are yours to set
Bundles decide which models a caller can reach. Routers decide how those names resolve. Caps decide when a call stops, including mid-stream.
Portal connected to gateway through access, control and monetize

Why not build it

A proxy and a meter is a weekend. Money that is right mid-sentence is not.

What runs on every request, in order.

Forwarding the request is the easy half. The hard half is a ceiling that holds while the answer is still arriving: money held before the request leaves, re-checked against tokens that have not finished streaming, released to the cent when it ends. Check the cap only before the call and you either bill for tokens you never served or serve tokens nobody paid for.

  1. 01

    reserve

    hold the money on the balance before the request leaves, in one atomic step

  2. 02

    stream

    re-check accumulated spend every 16 chunks, and every 250ms

  3. 03

    abort

    at 98% of the hold: stop the model provider connection, send a usage block, send [DONE]

  4. 04

    settle

    release the hold, write one ledger row, reconcile to the cent

Where the line is

You still build a product. We build the layer under it.

Nothing here is a surprise on the day you integrate.

You still own

  • Stripe: invoices, tax, dunning, chargebacks
  • Your product, your sign-in, your customers
  • Which model to call, and when
  • What you charge, and collecting it

We ship

  • Stripe: invoices, tax, dunning, chargebacks
  • Your product, your sign-in, your customers
  • Which model to call, and when
  • What you charge, and collecting it
  • Invoicing, revenue recognition, dunning and tax. Stripe does those; we do not wrap them.
  • Merchant of record. Your customers pay you, and the legal relationship stays yours.
  • Embeddings, images and audio. The gateway meters text and agent traffic.
  • Your prompts and completions. There is no column for a message body and no code path that writes one.

Build with seams

Everything between the model and the invoice

From the first call to your thousandth customer: who may reach which model, how that name resolves, and how spend is metered and capped.

Access under names you own

Bundles decide which models each customer can reach. Aliases and routers decide how those names resolve. Change them without redeploying a client.

$ seams users list
END USER EMAIL BUNDLE AVAILABLE USD CALLS SPENT USD
ada ada@example.com pro 240.00 1284 12.00
grace grace@example.com free 18.40 92 0.42

Keys your team mints and revokes

One key per end user on a shared balance. Mint and rotate credentials without splitting spend. Revoked keys stay listed for audit.

$ seams keys mint --user ada --bundle pro --cap 5.00
ak_app_m8avt…SIrY
$ seams keys revoke key_01J8Q…0x2m --yes
ok revoked · history kept for audit

A portal with your name on it

Hosted at <app>.portal.ourseams.com, in your brand. Usage, spending, and keys. Your customers never see a vendor name.

$ seams portal link ada
url <app>.portal.ourseams.com/enter?t=ps_…
end user ada
one time true

Margin you can see before the invoice

See which models drive cost and margin so you know what to price and what to keep.

$ seams margin
chargedUsd 631.10
costUsd 467.48
keptUsd 163.62

Budget a job, not a request.

One support reply, one document summarised, one agent run, however many calls that takes. A key cap limits a period; an outcome limits a unit of work, and the ceiling holds across every call in the run.

Read about outcomes

How this compares

They own a box. The edges are still hand-written.

Three categories, and they do not overlap. Routers pick a model. Dashboards report what it cost. Neither one knows who your customer is or what they are allowed to spend.

A routing proxy

OpenRouter, LiteLLM, Portkey

One model name across many providers, with fallbacks.

You still write
Who may call it, what they may spend, and who pays for it.

An observability tool

Helicone, Portkey

What every call cost, once it has finished.

You still write
A ceiling that stops the call, and a page your customer can read.

Seams

Catalogue, entitlement, spend and a branded portal on one request path, checked together.

You still write
Which model to call. That judgement is your product, and we do not make it.

Frequently asked questions

Common questions

Forwarding a request and counting tokens afterwards is a weekend. The part that is not is a ceiling that holds while the answer is still arriving: money held before the request leaves, re-checked as the stream runs, released to the cent when it ends. Check the cap only before the call and you either bill for tokens you never served or serve tokens nobody paid for.

All the portal infrastructure your product needs

Gateway, aliases, and routing behind names your product owns.

Metering, holds, and spend caps that hold for the life of the stream.

A portal on <app>.portal.ourseams.com, keys, usage, and limits under your name.

<app>.portal.ourseams.com
Usage: what they spent, by model
Spending: their plan and their ceiling
Keys: the keys their application uses
Activity: ledger draws for this person

Point your clients at Seams
sign in, connect a provider, ship

Sign in, point your base URL at your application gateway, and mint a key for your first customer. Metering and caps start on the first call. Bring your own provider key to start.