OXYGENOxygen/ Docs
Safety & cost

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

UnitValue
1 credit$0.01
$1.00100 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

PlanMonthly priceYearly priceIncluded creditsVolume bonusRollover capBYOK
Oxygen $49 (oxygen_49)$49.00$490.004,900—4,900Yes
Oxygen $99 (oxygen_99)$99.00$990.009,900—9,900Yes
Oxygen $199 (oxygen_199)$199.00$1,990.0019,900—19,900Yes
Oxygen $499 (oxygen_499)$499.00$4,990.0052,395+5% (2,495)52,395Yes
Oxygen $999 (oxygen_999)$999.00$9,990.00109,890+10% (9,990)109,890Yes
Oxygen $1,999 (oxygen_1999)$1,999.00$19,990.00229,885+15% (29,985)229,885Yes
Scale (scale)Contact sales—1,000,000—1,000,000Yes
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

ItemValue
Trial length7 days
Trial credit grant2,000 credits
Onboarding walkthrough bonus100 credits
Past-due grace before entitlement stops7 days

Credit top-ups

PackPriceCredits
10$10.00800
25$25.002,000
100$100.008,000
250$250.0020,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.

PackPriceCredits
1000$13.001,000
2000$26.002,000
8000$104.008,000
20000$260.0020,000

AI columns, Copilot, and Agents

UnitCreditsUSDNotes
AI column, low reasoning effort1.5$0.015per cell
AI column, medium reasoning effort4$0.04per cell
AI column, high reasoning effort25$0.25per cell
AI column with web search0.6$0.006typical; 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

UnitCreditsUSDNotes
company_enrich_typical9.9$0.099per call, typical
email_find_typical8.5$0.085per call, typical
email_verify0.225$0.00225per call, typical
linkedin_profile_scrape1$0.01per call, typical
page_scrape1.6$0.016per call, typical
phone_find_typical99$0.99per call, typical
web_search0.5$0.005per call, typical
Enriched row, all columns10$0.10typical blended cost
LinkedIn URL found5$0.05per 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

UnitCreditsUSDNotes
OXYGEN-sold managed Google inbox, all-in400$4.00per 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 domain1,250$12.50per domain per year at the registrar's cost, e.g. a .com; renewed yearly, charged 30 days before expiry
Inbox-placement monitoring100$1.00per mailbox per month; includes 2 placement tests; 135 from the 2026-09 repricing's effective date
Additional placement test16.6$0.166per test beyond the included allowance; 66 from the 2026-09 repricing's effective date; 0 on your own EmailGuard key
Mailbox warmup100$1.00per 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 IP2,500$25.00per IP per 30-day period
Email send0$0.00per 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.

SeatUSDNotes
LinkedIn seat$30.00 per monthentitles one connected LinkedIn account
WhatsApp seat$30.00 per monthentitles one connected WhatsApp number
Phone number$10.00 per monthentitles one rented phone number; the number carries no separate credit charge while this seat pays for it
Email sender$1.00 per monthentitles 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

UnitCreditsUSDNotes
LinkedIn comment_post0$0.00per action
LinkedIn follow0$0.00per action
LinkedIn inmail0$0.00per action
LinkedIn invite0$0.00per action
LinkedIn like_post0$0.00per action
LinkedIn message0$0.00per action
LinkedIn visit_profile0$0.00per action
WhatsApp message send0$0.00per 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

UnitCreditsUSDNotes
Talk time5$0.05per 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.

AccountUntil the repricingFrom the repricing
LinkedIn account (outreach, publishing or both)1,000 credits / month3,400 credits / month
WhatsApp number1,000 credits / month3,000 credits / month
X accountNo credit reservation1,000 credits / month
Phone numberNo credit reservation1,000 credits / month

Workflow automation

UnitCreditsUSDNotes
Workflow step0.001$0.00001per step a live run executes, settled in aggregate
Rows written inside a run0$0.00free, however many rows a step writes
Provider call on your own API key (BYOK)0$0.00platform 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.

RailPrice in codeGateCharged today
Deliverability analytics (deliverability_unit)100 credits / monthCREDIT_COMMITMENTS_ENABLED + CREDIT_COMMITMENT_BILLING_KINDSNo
Connected LinkedIn accounts (linkedin_account)1,000 credits / monthCREDIT_COMMITMENTS_ENABLED + CREDIT_COMMITMENT_BILLING_KINDSNo
Warmup (mailbox_warmup)100 credits / monthCREDIT_COMMITMENTS_ENABLED + CREDIT_COMMITMENT_BILLING_KINDSNo
OXYGEN-sold mailboxes (managed_mailbox)300 credits / monthCREDIT_COMMITMENTS_ENABLED + CREDIT_COMMITMENT_BILLING_KINDSNo
Phone numbers (phone_number)—CREDIT_COMMITMENTS_ENABLED + CREDIT_COMMITMENT_BILLING_KINDSNo
Connected sending mailboxes (sending_mailbox)100 credits / monthCREDIT_COMMITMENTS_ENABLED + CREDIT_COMMITMENT_BILLING_KINDSNo
Connected WhatsApp numbers (whatsapp_account)1,000 credits / monthCREDIT_COMMITMENTS_ENABLED + CREDIT_COMMITMENT_BILLING_KINDSNo
Connected X accounts (x_account)—CREDIT_COMMITMENTS_ENABLED + CREDIT_COMMITMENT_BILLING_KINDSNo
Legacy credit-denominated LinkedIn account seat1,000 credits / monthLINKEDIN_SEAT_BILLING_ENABLEDNo
Legacy credit-denominated WhatsApp number seat1,000 credits / monthWHATSAPP_SEAT_BILLING_ENABLEDNo

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)FreeOxygen $49Oxygen $99Oxygen $199Oxygen $499Oxygen $999Oxygen $1,999
Unattended trigger delivery or table auto-run batch505009901,9905,24010,98925,000
Agent run default, total / model calls250 / 1501,000 / 5001,000 / 5002,500 / 1,2502,500 / 1,2505,000 / 2,50010,000 / 5,000
Copilot without an approval card, per call / per session50 / 300100 / 500100 / 500200 / 1,000200 / 1,000300 / 1,500500 / 2,500
Daily spend guard, warn / block—24,500 / 98,00049,500 / 198,00099,500 / 398,000261,975 / 1,047,900549,450 / 2,197,8001,149,425 / 4,597,700
BYOK column run max rows—25,00025,00050,00050,000100,000250,000
BYOK provider calls per day—10,00010,00025,00025,00050,000200,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.

RequestsFreeOxygen $49Oxygen $99Oxygen $199Oxygen $499Oxygen $999Oxygen $1,999
All calls, per workspace, a minute1,2003,0003,0006,0006,00012,00030,000
All calls, per key, a minute1,2003,0003,0006,0006,00012,00030,000
Table reads, per key, a minute1206006001,2001,2002,4005,000
Table writes, per key, a minute606006001,2001,2002,4005,000
Live tool and AI calls, per key, a minute403003006006001,2003,000
Live tool and AI calls, per workspace, an hour20025,00025,00060,00060,000150,000500,000
Dry runs, per key, a minute120600600600600600600
Tables created by imports, per workspace, an hour2002,5002,5005,0005,00010,00025,000
Rows read, per workspace1,000,000 an hour125,000,000 a day125,000,000 a day250,000,000 a day250,000,000 a day500,000,000 a day2,500,000,000 a day
Rows written, per workspace200,000 an hour25,000,000 a day25,000,000 a day50,000,000 a day50,000,000 a day125,000,000 a day500,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 minuteFreeOxygen $49Oxygen $99Oxygen $199Oxygen $499Oxygen $999Oxygen $1,999
Per target6001,5001,5003,0003,0006,00012,000
Per sender IP, per target6001,5001,5003,0003,0006,00012,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.

LimitFreeOxygen $49Oxygen $99Oxygen $199Oxygen $499Oxygen $999Oxygen $1,999
Rows per Table3,000,0003,000,0003,000,0003,000,0003,000,0003,000,000 (5,000,000 after the capacity test)3,000,000 (10,000,000 after the capacity test)
Table rows per workspace25,000,00025,000,00025,000,00025,000,00025,000,00050,000,000100,000,000
Workspace Table database30 GiB30 GiB30 GiB30 GiB30 GiB60 GiB120 GiB
Rows per write request5,00050,00050,00050,00050,00050,00050,000
Import file size500 MiB1 GiB1 GiB2 GiB2 GiB5 GiB5 GiB
Columns per action run or auto-run10252525255050
Signal events per read1002002005005001,0001,000
Signals look-back, days309090180180365365

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.

CategoryWhat it records
freeFree-tier allowance.
trialThe 7-day trial grant.
subscriptionThe monthly plan grant.
purchaseA one-time credit top-up.
managed_aiAI columns, Copilot, and Agent inference on OXYGEN's model credentials.
managed_enrichmentProvider enrichment and research calls on OXYGEN's credentials.
managed_domainOXYGEN-registered cold-email domains.
managed_mailboxConnected sending mailboxes.
managed_inboxOXYGEN-sold managed mailboxes.
managed_warmupPer-mailbox warmup cycles.
managed_deliverabilityPer-mailbox inbox-placement monitoring cycles.
managed_seatRecurring per-seat infrastructure (connected accounts, dedicated egress IPs).
linkedin_actionPer-action LinkedIn charges wired at sequence dispatch.
voice_callPer-call voice charges settled on the telephony status webhook.
automationAggregated workflow and automation action settlement.
byokUsage recorded against your own provider key. No OXYGEN credits are charged.
adminStaff adjustment.
bonusProduct-earned one-off grant.
partner_bonusThe agency partner bonus granted beside each monthly plan grant.

Ledger transaction types

TypeWhat it records
grantCredits added by a plan, trial, purchase, or bonus.
reserveCredits held against an approved ceiling before a run executes.
captureThe reservation settled at actual cost.
releaseThe unused remainder of a reservation returned to the balance.
refundCredits returned after settlement.
adjustmentA manual correction.
byok_usageUsage metered on your own key; no credits move.

What costs nothing

ActionWhy
Previews and dry runs--mode dry_run and preview-by-default commands make no provider call and reserve nothing.
Sourcing and search plansoxygen sourcing plan and oxygen search plan cost out the work without executing it.
Applying a blueprintCreates a disabled workflow and its tables; nothing runs.
Sequence enrollmentEnrolling leads sends nothing — dispatch begins at oxygen sequences start.
Email and WhatsApp sends0 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 actionsEvery per-action LinkedIn charge is 0 credits; LinkedIn is priced per connected account.
BYOK provider callsMetered as byok_usage against your own key; no OXYGEN credits move.

On this page