Plenty of enrichment work starts with a list, not a pipeline. A spreadsheet of conference leads. A column of domains from a market map. A few hundred LinkedIn URLs someone pasted into a doc. Writing an integration for a one-off list is more work than the list deserves, and that is where most of these jobs stall.
Data Legion is now on the Apify Store as an Actor, Apify's name for a packaged cloud program you run with an input and get a dataset back from. Paste the list, pick a product, press Start, and the enriched records come back as a table you can export or pipe somewhere else. You don't need a Data Legion account: Apify handles the billing, and you pay for matched records only.
What goes in, what comes out
The Actor takes the identifiers you already have:
- Emails, phone numbers (with country code), and social profile URLs for people.
- Domains and company names for companies.
- A name with one more detail, such as a company, school, city, or job title, through the advanced Records input.
Each run uses one product. There are six, mirroring Data Legion's API tiers: Person Base and Person Premium, each with or without contact data, and Company Base and Company Premium. Base covers identity, the current role and company, work history, education, and skills. Premium adds seniority, job function, decision-maker flags, tenure, and data freshness for people, and headcount, growth, and turnover for companies. The contact-data products add emails, phones, location, age, and sex. The contact-data and Premium products need a paid Apify plan, while Person Base without contact data and Company Base run on any plan. The Actor page lists the current price of each.
Every unique input record becomes one row in the run's dataset, with a status of matched, no_match, invalid_input, or error, and the person or company record attached on a match. Apify shows the dataset in three views. People and Companies lay out the fields most lists need (name, title, company, domain, LinkedIn, and contact details where the product includes them) as columns. Overview shows each row's status, input, and match confidence. From there it exports to CSV, JSON, or Excel like any other Apify dataset.
You pay for matches, once
We built the billing around a few rules that matter more on a pasted list than in an API integration.
A no-match is free, and so are inputs the Actor can't look up and errors that persist after retries. You're charged when a record comes back, not when a lookup is attempted.
Duplicates don't cost twice. Inputs are compared after normalizing case, scheme, www., and trailing slashes, so Microsoft.com and https://www.microsoft.com/ are one lookup. And when two different inputs resolve to the same person, say a work email and a LinkedIn URL for the same engineer, the record is charged once. Both rows come back, and the one that didn't pay is marked charged: false with a duplicate_of pointer to the row that did.
The spending limit is respected. Apify lets you set a maximum cost per run, and the Actor stops looking records up once the next match wouldn't fit under it. Every record it charged for is in the dataset and none beyond that. The run's status message says how many records were left, so raising the limit and running the rest is a deliberate choice rather than a surprise.
Running it from code
The same Actor runs through Apify's API, which is useful when the list lives in a job rather than a browser tab. With Apify's client, you pass the input, optionally cap the cost, and read the dataset when the run finishes.
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("datalegion/data-legion-enrichment").call(
run_input={
"product": "company_base",
"domains": ["hubspot.com", "atlassian.com", "dropbox.com"],
},
max_total_charge_usd=1,
)
items = client.dataset(run.default_dataset_id).list_items().items
for row in items:
if row["status"] == "matched":
company = row["company"]
print(company["domain"], company.get("industry"), company.get("size"))import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("datalegion/data-legion-enrichment").call(
{
product: "company_base",
domains: ["hubspot.com", "atlassian.com", "dropbox.com"],
},
{ maxTotalChargeUsd: 1 },
);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const row of items) {
if (row.status === "matched") {
const { company } = row;
console.log(company.domain, company.industry, company.size);
}
}Apify's schedules and integrations work on top of this too: run the Actor nightly against a list in a storage, or send the dataset to a webhook, Google Sheets, or Zapier when it finishes.
Running it from an agent
Apify publishes an MCP server that lets assistants such as Claude search the Store and call Actors as tools. Point an assistant at it and it can find this Actor, pass it a list, and read the results in the same conversation, with the cost limit and per-match billing above applying the same way. If you'd rather connect an assistant to Data Legion directly, our own MCP server and CLI do that with a Data Legion API key.
Where the API fits better
The Actor is for lists and for teams that already work in Apify: no account, no code required, a table at the end, and Apify's scheduling and integrations around it. It covers enrichment, one record per input.
The Data Legion API is for systems. It's what you want when records should be enriched the moment they arrive, when you need search over the full dataset rather than lookups from a list you already have, or when the volume calls for bulk delivery and an enterprise agreement. If your lists live in Clay instead, the Clay guide covers that path.
Like every Data Legion product, the Actor never returns people who have opted out, and contact data is for lawful use under our Acceptable Data Use policy. The quickest test is a list you already know the answers for. Open Data Legion on the Apify Store, paste a dozen of those records, and compare. If you're new to enrichment, What Is Data Enrichment covers what to expect from the records.