Fill in the blanks
Enrich accounts and contacts where the work happens
Enrichment goes wrong when it happens somewhere else. Run it as columns on the rows you are already working and the answer, its source, and its cost stay attached to what you act on.
Enrichment is usually bought as a bulk job: upload a file, wait, download a wider file, and hope the mapping survived the round trip. What comes back is a snapshot with no memory of which vendor said what, which is why nobody can ever answer where a wrong field came from.
Here enrichment is a column. Each cell records the provider that answered, the inputs it was given, the outputs it produced, the cost, and any error. Dependencies between columns are explicit, so a company lookup feeding a contact lookup runs in that order without anyone sequencing it by hand.
Example searches
Ask for it the way you'd say it
Every search below runs on the same hosted Tables, with the cost previewed before anything is spent.
Widen an account list
add headcount, funding stage, and country to every company sitting in this table
Three columns, one run, and each cell names the lane that filled it so a surprising value is checkable.
Standing fill on new records
whenever a new company record appears, fill in its firmographics automatically
The saved configuration is the standing permission, so new records arrive filled rather than queued.
Refresh what has gone stale
reenrich anything we last touched more than six months ago and leave the rest
A filter on the last-run timestamp keeps a refresh off rows that were already updated last week.
Plays
Three motions you can run this week
Each one is a chain of Oxygen primitives — the same hosted objects your workspace already has, composed.
Enrich once, then promote
Fields you decide to trust become part of the account record with the run that produced them.
- 1Run the enrichment columns on the working table and inspect a sample of the cells by hand.
- 2Promote the fields you accept. The ones you reject stay in the table rather than in your CRM.
oxygen enrich-column runA standing rule for new records
Records created by a form, an import, or a webhook get filled without anyone remembering to.
- 1Enable enrichment on the object and choose which attributes it is permitted to write.
- 2Read the backfill preview first, then let records enrich as they arrive from then on.
oxygen crm enrichment enableRefresh a segment on a schedule
A market map stays roughly current without the quarterly rebuild nobody has time for.
- 1Schedule the run against rows whose last enrichment is older than the threshold you set.
- 2Cap each delivery, then promote only the differences that changed the account's shape.
oxygen tables schedule set
Capabilities
What you get
Columns, not a bulk upload
Enrichment runs where the rows already live. No export, no re-import, and no mapping step that silently drops a field on the way back in.
Dependencies that resolve themselves
A column that reads another column runs after it. The order comes from the references you wrote, not from somebody remembering the sequence.
Every cell explains itself
Provider, inputs, outputs, cost, retries, and errors are inspectable on the cell. Tracing a wrong value takes a click rather than an argument.
Your own keys where you have them
Managed access is the default lane. Where you already pay a vendor directly, connect that key on a paid plan and the call runs on your vendor account rather than drawing credits.
Boundaries
What Tables does not own
Enrichment is Tables work. The enriched row is a candidate until you promote it onto Records, which owns canonical attributes and their merge history. Scheduling a recurring refresh across several steps belongs to Workflows.
Data sources
What the data actually comes from
Every value lands with its provider and cost recorded on the cell.

People Data Labs
Firmographic and person attributes for the broad fill, which is where most of the blanks on a fresh table are.

Crustdata
Headcount trend, funding, and job-posting context, the fields that turn a static row into a moving one.

Blitz API
Company and profile detail from LinkedIn, and the head lane when a row needs a work email next.
LeadMagic
Company and contact attributes that plug gaps the broad firmographic pass leaves behind on smaller companies.
LinkedIn Scraper
The cookieless LinkedIn Scraper for public profile and company detail without touching a connected account.
Run these on Oxygen's managed credits, or connect your own provider keys and pay the vendor directly — the same columns, the same runs, the same provenance either way. See every integration.
Limits
Where this stops
- Every provider sounds confident and some of them are wrong. Sample a dozen rows by hand before promoting a field across a whole table, headcount and revenue bands most of all.
- Enrichment only surfaces what a source already holds. A company nobody has indexed stays mostly empty however many lanes you stack behind it.
FAQ
Questions people ask first
Is this a bulk upload job?
How do I know which provider filled a cell?
Can enrichment run on new records automatically?
What stops a run from enriching everything?
Do enriched fields overwrite what I already have?
What does enrichment cost?
Run enrich accounts and contacts where the work happens on your own workspace
Sign up, get a working workspace with a one-time credit grant, and run the first play from the web app, the CLI, or your AI assistant over MCP.