Pricing reference
Every billable unit in OXYGEN, generated from the constants that charge for it.
Every unit OXYGEN charges for, generated from the constants the billing code reads. Prices that exist in code but sit behind a feature flag that is off by default are listed under Built, not currently charged rather than shown as live prices; per-operation provider prices are resolved per descriptor and are read with oxygen tools get <tool-id> --json.
What a credit is worth
| Unit | Value |
|---|---|
| 1 credit | $0.01 |
| $1.00 | 100 credits |
| Plan credits | $1.00 per 100 at face value, down to $0.87 per 100 with the volume bonus |
| Top-up credits | $1.25 per 100; $1.30 from the 2026-09 repricing's effective date |
Plans
| Plan | Monthly price | Yearly price | Included credits | Volume bonus | Rollover cap | BYOK |
|---|---|---|---|---|---|---|
Oxygen $49 (oxygen_49) | $49.00 | $490.00 | 4,900 | — | 4,900 | Yes |
Oxygen $99 (oxygen_99) | $99.00 | $990.00 | 9,900 | — | 9,900 | Yes |
Oxygen $199 (oxygen_199) | $199.00 | $1,990.00 | 19,900 | — | 19,900 | Yes |
Oxygen $499 (oxygen_499) | $499.00 | $4,990.00 | 52,395 | +5% (2,495) | 52,395 | Yes |
Oxygen $999 (oxygen_999) | $999.00 | $9,990.00 | 109,890 | +10% (9,990) | 109,890 | Yes |
Oxygen $1,999 (oxygen_1999) | $1,999.00 | $19,990.00 | 229,885 | +15% (29,985) | 229,885 | Yes |
Scale (scale) | Contact sales | — | 1,000,000 | — | 1,000,000 | Yes |
Enterprise (enterprise) | Contact sales | — | Custom | — | — | Yes |
Included credits are face value ($1 = 100 credits) plus the plan's volume bonus, which is already counted in the column. An existing subscriber to a bonus plan receives the bonus from their next renewal. A yearly plan (2026-09 repricing) costs 10 months' price and still grants its included credits monthly; it is sold once yearly billing is switched on, and until then a yearly request is refused with annual_billing_unavailable (yearly billing).
Trial, grants, and grace
| Item | Value |
|---|---|
| Trial length | 7 days |
| Trial credit grant | 2,000 credits |
| Onboarding walkthrough bonus | 100 credits |
| Past-due grace before entitlement stops | 7 days |
Credit top-ups
| Pack | Price | Credits |
|---|---|---|
10 | $10.00 | 800 |
25 | $25.00 | 2,000 |
100 | $100.00 | 8,000 |
250 | $250.00 | 20,000 |
A custom top-up runs from 800 credits to 100,000 credits in steps of 100. Purchased credits stack like plan grants and do not expire.
From the 2026-09 repricing's effective date a top-up costs $1.30 per 100 credits and these packs are sold instead; oxygen billing topup --json reports the rate and packs in force, and the ones scheduled once the date is set.
| Pack | Price | Credits |
|---|---|---|
1000 | $13.00 | 1,000 |
2000 | $26.00 | 2,000 |
8000 | $104.00 | 8,000 |
20000 | $260.00 | 20,000 |
AI columns, Copilot, and Agents
| Unit | Credits | USD | Notes |
|---|---|---|---|
| AI column, low reasoning effort | 1.5 | $0.015 | per cell |
| AI column, medium reasoning effort | 4 | $0.04 | per cell |
| AI column, high reasoning effort | 25 | $0.25 | per cell |
| AI column with web search | 0.6 | $0.006 | typical; 4.6 reserved per cell |
Copilot and Agent turns bill managed inference against the same credit balance, inside the session or run budget approved when they start. On a BYOK model credential the provider bills you directly and OXYGEN charges no credits.
Enrichment and research
| Unit | Credits | USD | Notes |
|---|---|---|---|
company_enrich_typical | 9.9 | $0.099 | per call, typical |
email_find_typical | 8.5 | $0.085 | per call, typical |
email_verify | 0.225 | $0.00225 | per call, typical |
linkedin_profile_scrape | 1 | $0.01 | per call, typical |
page_scrape | 1.6 | $0.016 | per call, typical |
phone_find_typical | 99 | $0.99 | per call, typical |
web_search | 0.5 | $0.005 | per call, typical |
| Enriched row, all columns | 10 | $0.10 | typical blended cost |
| LinkedIn URL found | 5 | $0.05 | per URL found that matches the person, 0 when none is found, from the 2026-09 repricing's effective date; until then each provider the lookup tries bills its own per-call price, found or not |
These are the sheet's typical values. The price that actually bills is the one on the operation descriptor, which varies by provider and request shape — read it with oxygen tools get <tool-id> --json, or preview the exact request with a dry run before spending.
Email infrastructure
| Unit | Credits | USD | Notes |
|---|---|---|---|
| OXYGEN-sold managed Google inbox, all-in | 400 | $4.00 | per inbox per month: the mailbox, its sending connection and warm-up; 500 from the 2026-09 repricing's effective date (a flat 400 mailbox plus the 100-credit connection, warm-up included), when Microsoft mailboxes and Azure tenants, still priced from the vendor's cost, add the same connection. Inbox placement is an optional add-on |
| OXYGEN-registered domain | 1,250 | $12.50 | per domain per year at the registrar's cost, e.g. a .com; renewed yearly, charged 30 days before expiry |
| Inbox-placement monitoring | 100 | $1.00 | per mailbox per month; includes 2 placement tests; 135 from the 2026-09 repricing's effective date |
| Additional placement test | 16.6 | $0.166 | per test beyond the included allowance; 66 from the 2026-09 repricing's effective date; 0 on your own EmailGuard key |
| Mailbox warmup | 100 | $1.00 | per mailbox per month; 0 on your own mailbox from the 2026-09 repricing, included in its 100-credit monthly connection once that connection is billed |
| Dedicated egress IP | 2,500 | $25.00 | per IP per 30-day period |
| Email send | 0 | $0.00 | per message |
Sending seats
Connecting a sender occupies a sending seat. Seats are sold in dollars on their own subscription — separate from the plan and from credits — and the gate that enforces them (OXYGEN_SENDING_SEAT_GATE_ENABLED) is armed in production: the senders a workspace already had when the gate was armed are grandfathered, and every further sender needs a purchased seat. oxygen billing seats --json reports the price, what is purchased, what is grandfathered, what is connected, and what is left.
| Seat | USD | Notes |
|---|---|---|
| LinkedIn seat | $30.00 per month | entitles one connected LinkedIn account |
| WhatsApp seat | $30.00 per month | entitles one connected WhatsApp number |
| Phone number | $10.00 per month | entitles one rented phone number; the number carries no separate credit charge while this seat pays for it |
| Email sender | $1.00 per month | entitles one connected sending mailbox, warm-up included |
Seats belong to the billing owner. A workspace linked to another organization's plan with oxygen orgs billing-link connects senders against that organization's seats and buys them there — oxygen billing seats set inside a linked workspace is refused with shared_billing. An OXYGEN-sold managed mailbox already includes its seat; the email seat above is for a mailbox you bring yourself.
LinkedIn and WhatsApp
| Unit | Credits | USD | Notes |
|---|---|---|---|
LinkedIn comment_post | 0 | $0.00 | per action |
LinkedIn follow | 0 | $0.00 | per action |
LinkedIn inmail | 0 | $0.00 | per action |
LinkedIn invite | 0 | $0.00 | per action |
LinkedIn like_post | 0 | $0.00 | per action |
LinkedIn message | 0 | $0.00 | per action |
LinkedIn visit_profile | 0 | $0.00 | per action |
| WhatsApp message send | 0 | $0.00 | per message |
LinkedIn and WhatsApp are priced as pure connected-account seats (above): every individual action is 0 credits, so a sequence's LinkedIn steps never draw against its credit cap.
Voice
| Unit | Credits | USD | Notes |
|---|---|---|---|
| Talk time | 5 | $0.05 | per connected minute, both call legs and answering-machine detection included |
Voice settles on the telephony provider's status webhook after the call ends. A connected call bills its talk time, with a started minute counted as a whole one; a call nobody answered costs nothing. There is no separate per-call charge. A rented phone number is priced under connected-account reservations.
Connected-account reservations
From the 2026-09 repricing, every connected account reserves its monthly credits from the balance on its own monthly anchor instead of occupying a dollar sending seat. The new prices take effect on the repricing's effective date; until then the price in force is the one in the second column. oxygen billing commitments --json shows what a workspace reserves today.
| Account | Until the repricing | From the repricing |
|---|---|---|
| LinkedIn account (outreach, publishing or both) | 1,000 credits / month | 3,400 credits / month |
| WhatsApp number | 1,000 credits / month | 3,000 credits / month |
| X account | No credit reservation | 1,000 credits / month |
| Phone number | No credit reservation | 1,000 credits / month |
Workflow automation
| Unit | Credits | USD | Notes |
|---|---|---|---|
| Workflow step | 0.001 | $0.00001 | per step a live run executes, settled in aggregate |
| Rows written inside a run | 0 | $0.00 | free, however many rows a step writes |
| Provider call on your own API key (BYOK) | 0 | $0.00 | platform fee per call; your provider bills the call itself |
From the 2026-09 repricing date a provider call on your own API key pays a 0.05-credit platform fee, settled in aggregate like workflow steps. AI calls on your own model key are not charged this fee.
Built, not currently charged
These prices exist in code behind a feature flag that is off unless explicitly set. Each reader requires the environment variable to be exactly true, so an unset or malformed value means no reservation and no charge.
| Rail | Price in code | Gate | Charged today |
|---|---|---|---|
Deliverability analytics (deliverability_unit) | 100 credits / month | CREDIT_COMMITMENTS_ENABLED + CREDIT_COMMITMENT_BILLING_KINDS | No |
Connected LinkedIn accounts (linkedin_account) | 1,000 credits / month | CREDIT_COMMITMENTS_ENABLED + CREDIT_COMMITMENT_BILLING_KINDS | No |
Warmup (mailbox_warmup) | 100 credits / month | CREDIT_COMMITMENTS_ENABLED + CREDIT_COMMITMENT_BILLING_KINDS | No |
OXYGEN-sold mailboxes (managed_mailbox) | 300 credits / month | CREDIT_COMMITMENTS_ENABLED + CREDIT_COMMITMENT_BILLING_KINDS | No |
Phone numbers (phone_number) | — | CREDIT_COMMITMENTS_ENABLED + CREDIT_COMMITMENT_BILLING_KINDS | No |
Connected sending mailboxes (sending_mailbox) | 100 credits / month | CREDIT_COMMITMENTS_ENABLED + CREDIT_COMMITMENT_BILLING_KINDS | No |
Connected WhatsApp numbers (whatsapp_account) | 1,000 credits / month | CREDIT_COMMITMENTS_ENABLED + CREDIT_COMMITMENT_BILLING_KINDS | No |
Connected X accounts (x_account) | — | CREDIT_COMMITMENTS_ENABLED + CREDIT_COMMITMENT_BILLING_KINDS | No |
| Legacy credit-denominated LinkedIn account seat | 1,000 credits / month | LINKEDIN_SEAT_BILLING_ENABLED | No |
| Legacy credit-denominated WhatsApp number seat | 1,000 credits / month | WHATSAPP_SEAT_BILLING_ENABLED | No |
Connected LinkedIn accounts and WhatsApp numbers are charged today as the dollar-priced sending seats above, not through these credit rows. Managed mailboxes, warmup, and inbox-placement monitoring are sold today as recurring subscriptions carrying the prices listed above; the credit-commitment rail and the legacy credit seat rail are second, currently dark mechanisms for the same resources — oxygen billing commitments may list them as tracked, but they are never an additional charge on top of a seat or a subscription.
Default spend ceilings
Spend defaults scale with plan size. An autonomous trigger or table auto-run armed without an explicit cap is backstopped by its plan's default, resolved when it fires; an explicit cap always wins.
| Guard (credits) | Free | Oxygen $49 | Oxygen $99 | Oxygen $199 | Oxygen $499 | Oxygen $999 | Oxygen $1,999 |
|---|---|---|---|---|---|---|---|
| Unattended trigger delivery or table auto-run batch | 50 | 500 | 990 | 1,990 | 5,240 | 10,989 | 25,000 |
| Agent run default, total / model calls | 250 / 150 | 1,000 / 500 | 1,000 / 500 | 2,500 / 1,250 | 2,500 / 1,250 | 5,000 / 2,500 | 10,000 / 5,000 |
| Copilot without an approval card, per call / per session | 50 / 300 | 100 / 500 | 100 / 500 | 200 / 1,000 | 200 / 1,000 | 300 / 1,500 | 500 / 2,500 |
| Daily spend guard, warn / block | — | 24,500 / 98,000 | 49,500 / 198,000 | 99,500 / 398,000 | 261,975 / 1,047,900 | 549,450 / 2,197,800 | 1,149,425 / 4,597,700 |
| BYOK column run max rows | — | 25,000 | 25,000 | 50,000 | 50,000 | 100,000 | 250,000 |
| BYOK provider calls per day | — | 10,000 | 10,000 | 25,000 | 25,000 | 50,000 | 200,000 |
The delivery default is 10% of the plan's monthly credits (50 on free). Grandfathered plans take 10% of their own monthly credits: Starter 990 (otherwise the Oxygen $99 column), Pro 2,490 (otherwise the Oxygen $199 column), Team 7,490 (otherwise the Oxygen $999 column). Legacy scale plans read the Oxygen $1,999 column, and enterprise plans have no default. oxygen limits show names your plan size and returns every size's values under plan_bands; the web app shows the same values under Settings → Plan limits.
An Agent run may spend up to the smaller of its approved max_credits and the Agent run ceiling above. That ceiling is a default: one run or trigger may carry a higher max_credits when you approve it explicitly (--approve-above-default, or the card in the web app), up to 25,000 credits, and an enterprise contract can set its own default. The Copilot allowance covers paid work up to its per-call and per-session amounts without an approval card; sends, launches and other external writes always ask, at any price, and one attended Copilot turn is bounded at 3,000 credits on every plan. A dash means no default. The daily spend guard is a runaway backstop, not a spend ceiling: on paid plans it warns at 5x and hard-blocks at 20x the plan's monthly credits spent in one day, monthly reservations and managed mailbox subscriptions do not count toward it, and your own org daily budget replaces it. Run oxygen limits show or oxygen budget list to see the exact credit thresholds for your plan. BYOK daily call caps are monitoring thresholds and warn rather than stop a run unless OXYGEN_BYOK_DAILY_CAPS is set to enforce.
API rate limits
Request rates scale with plan size. Every /api/cli/* call counts against a per-key and a per-workspace total a minute; the operation limits below apply first to the calls a script makes most. Limits guard against runaway loops: they are never sold and never billed.
| Requests | Free | Oxygen $49 | Oxygen $99 | Oxygen $199 | Oxygen $499 | Oxygen $999 | Oxygen $1,999 |
|---|---|---|---|---|---|---|---|
| All calls, per workspace, a minute | 1,200 | 3,000 | 3,000 | 6,000 | 6,000 | 12,000 | 30,000 |
| All calls, per key, a minute | 1,200 | 3,000 | 3,000 | 6,000 | 6,000 | 12,000 | 30,000 |
| Table reads, per key, a minute | 120 | 600 | 600 | 1,200 | 1,200 | 2,400 | 5,000 |
| Table writes, per key, a minute | 60 | 600 | 600 | 1,200 | 1,200 | 2,400 | 5,000 |
| Live tool and AI calls, per key, a minute | 40 | 300 | 300 | 600 | 600 | 1,200 | 3,000 |
| Live tool and AI calls, per workspace, an hour | 200 | 25,000 | 25,000 | 60,000 | 60,000 | 150,000 | 500,000 |
| Dry runs, per key, a minute | 120 | 600 | 600 | 600 | 600 | 600 | 600 |
| Tables created by imports, per workspace, an hour | 200 | 2,500 | 2,500 | 5,000 | 5,000 | 10,000 | 25,000 |
| Rows read, per workspace | 1,000,000 an hour | 125,000,000 a day | 125,000,000 a day | 250,000,000 a day | 250,000,000 a day | 500,000,000 a day | 2,500,000,000 a day |
| Rows written, per workspace | 200,000 an hour | 25,000,000 a day | 25,000,000 a day | 50,000,000 a day | 50,000,000 a day | 125,000,000 a day | 500,000,000 a day |
Windows are fixed: a per-minute limit resets at the start of each minute, an hourly one at the start of each hour. A request over a limit is refused with HTTP 429 and rate_limit_exceeded; wait the seconds in the Retry-After header (also error.details.retry_after_seconds) before retrying. error.details.bucket names the limit that was hit, error.details.limits_url opens the web app's Plan limits page with every plan size's rates, and the CLI exits with code 6. Live AI calls and live tool calls are separate buckets with the same limits. A row budget counts one unit per row a request reads or writes, shared by every key in the workspace; a single-row request still counts toward it but is never refused by it, only by the per-minute rates. Bulk work belongs in a durable table run, which these per-request limits do not pace. oxygen limits show --json returns your plan's rates under api_rate_limits and every plan size's under plan_bands.
Webhook ingress
Inbound webhooks accept more deliveries a minute on bigger plans. The limit applies to each target on its own: a Table webhook endpoint, a workflow or Agent webhook trigger, and the workspace's RB2B receiver. The target and the sender IP are counted separately, and one sender IP may use the whole per-target rate, so a form tool or CRM posting from one address is not held to less. A second endpoint has its own allowance. A delivery counts once however many rows it carries.
| Deliveries a minute | Free | Oxygen $49 | Oxygen $99 | Oxygen $199 | Oxygen $499 | Oxygen $999 | Oxygen $1,999 |
|---|---|---|---|---|---|---|---|
| Per target | 600 | 1,500 | 1,500 | 3,000 | 3,000 | 6,000 | 12,000 |
| Per sender IP, per target | 600 | 1,500 | 1,500 | 3,000 | 3,000 | 6,000 | 12,000 |
Windows are fixed and reset at the start of each minute. A delivery over the limit gets HTTP 429 with a Retry-After header; redeliver after that many seconds. Nothing is written for a refused delivery, so a sender that retries loses nothing. For a steady flow above your plan's rate, batch several rows into one delivery with --items-path on oxygen tables webhook create; a delivery may be up to 1 MB of JSON. A refused delivery is not recorded in oxygen tables webhook deliveries. oxygen limits show --json returns your plan's rate under webhook_ingress, the tables webhook commands report the endpoint's under rate_limit, and a workflow or Agent webhook trigger reports its own under rate_limit in oxygen workflows get, oxygen workflows apply, oxygen agent trigger-create and oxygen agent triggers.
Table and signal limits
Storage, import size, columns per auto-run and the signals feed scale with plan size too. Like the rates above they are guards, never sold and never billed.
| Limit | Free | Oxygen $49 | Oxygen $99 | Oxygen $199 | Oxygen $499 | Oxygen $999 | Oxygen $1,999 |
|---|---|---|---|---|---|---|---|
| Rows per Table | 3,000,000 | 3,000,000 | 3,000,000 | 3,000,000 | 3,000,000 | 3,000,000 (5,000,000 after the capacity test) | 3,000,000 (10,000,000 after the capacity test) |
| Table rows per workspace | 25,000,000 | 25,000,000 | 25,000,000 | 25,000,000 | 25,000,000 | 50,000,000 | 100,000,000 |
| Workspace Table database | 30 GiB | 30 GiB | 30 GiB | 30 GiB | 30 GiB | 60 GiB | 120 GiB |
| Rows per write request | 5,000 | 50,000 | 50,000 | 50,000 | 50,000 | 50,000 | 50,000 |
| Import file size | 500 MiB | 1 GiB | 1 GiB | 2 GiB | 2 GiB | 5 GiB | 5 GiB |
| Columns per action run or auto-run | 10 | 25 | 25 | 25 | 25 | 50 | 50 |
| Signal events per read | 100 | 200 | 200 | 500 | 500 | 1,000 | 1,000 |
| Signals look-back, days | 30 | 90 | 90 | 180 | 180 | 365 | 365 |
CSV and JSONL files stream, so they import up to the file size above. JSON and XLSX files are read whole, so on every plan they stop at 100 MiB; save a larger file as CSV or JSONL. Rows per Table still cap how many rows one import can load.
A request over one of these is refused with an error that names the limit. oxygen limits show --json returns every plan size's values under plan_bands.
Ledger categories
Every credit ledger entry carries one of these 19 categories. oxygen billing usage --json returns them.
| Category | What it records |
|---|---|
free | Free-tier allowance. |
trial | The 7-day trial grant. |
subscription | The monthly plan grant. |
purchase | A one-time credit top-up. |
managed_ai | AI columns, Copilot, and Agent inference on OXYGEN's model credentials. |
managed_enrichment | Provider enrichment and research calls on OXYGEN's credentials. |
managed_domain | OXYGEN-registered cold-email domains. |
managed_mailbox | Connected sending mailboxes. |
managed_inbox | OXYGEN-sold managed mailboxes. |
managed_warmup | Per-mailbox warmup cycles. |
managed_deliverability | Per-mailbox inbox-placement monitoring cycles. |
managed_seat | Recurring per-seat infrastructure (connected accounts, dedicated egress IPs). |
linkedin_action | Per-action LinkedIn charges wired at sequence dispatch. |
voice_call | Per-call voice charges settled on the telephony status webhook. |
automation | Aggregated workflow and automation action settlement. |
byok | Usage recorded against your own provider key. No OXYGEN credits are charged. |
admin | Staff adjustment. |
bonus | Product-earned one-off grant. |
partner_bonus | The agency partner bonus granted beside each monthly plan grant. |
Ledger transaction types
| Type | What it records |
|---|---|
grant | Credits added by a plan, trial, purchase, or bonus. |
reserve | Credits held against an approved ceiling before a run executes. |
capture | The reservation settled at actual cost. |
release | The unused remainder of a reservation returned to the balance. |
refund | Credits returned after settlement. |
adjustment | A manual correction. |
byok_usage | Usage metered on your own key; no credits move. |
What costs nothing
| Action | Why |
|---|---|
| Previews and dry runs | --mode dry_run and preview-by-default commands make no provider call and reserve nothing. |
| Sourcing and search plans | oxygen sourcing plan and oxygen search plan cost out the work without executing it. |
| Applying a blueprint | Creates a disabled workflow and its tables; nothing runs. |
| Sequence enrollment | Enrolling leads sends nothing — dispatch begins at oxygen sequences start. |
| Email and WhatsApp sends | 0 credits per message; sending infrastructure is priced per mailbox, not per send. At the default of 25 emails a day, one mailbox sends 550 to 750 emails a month (22 to 30 sending days). |
| LinkedIn actions | Every per-action LinkedIn charge is 0 credits; LinkedIn is priced per connected account. |
| BYOK provider calls | Metered as byok_usage against your own key; no OXYGEN credits move. |