Retriever AI logo
Retriever AI
PricingBlogDashboard

Core Agent

Getting StartedWeb AgentSheets Workflows

Building Blocks

Recordings & GroundingTool CallingKnowledge Base (RAG)Enrichment Datasets

Platform Access

CLI & SDKAPI OverviewAgent APIScrape APIBrowser as API/MCP

Automation

ShortcutsTriggersWebhooksSchedules

Account & Security

Cookie SyncPermissions & Privacy
DocsEnrichment Datasets

Enrichment Datasets

Append external data to your sheets and extractions using Bright Data marketplace datasets — LinkedIn, Crunchbase, Instagram, Amazon, Zillow, Indeed, and Google Maps.

6 min read

Retriever Enrich appends external data to your extracted results and sheets by matching them against Bright Data's dataset marketplace — LinkedIn people and companies, Crunchbase, Instagram, Amazon, Zillow, Indeed, and Google Maps. It runs inside a code plan via the rtrvr.enrich(...) helper, is billed in credits at cost, and every paid call asks for your approval first.

Enable Retriever Enrich under Settings → Labs to use it. Discovering datasets and inspecting their fields is always free — you only spend credits on a lookup or scrape you explicitly approve.

Available Datasets

Reference a dataset in a plan with the rtrvr.datasets constants (e.g. rtrvr.datasets.linkedinPeople) so generated code never retypes a raw gd_ id. The links below open each dataset's page in the Bright Data marketplace.

Datasetrtrvr.datasets keyBright Data IDModes
LinkedIn people profileslinkedinPeoplegd_l1viktl72bvl7bjuj0Instant lookup + Live scrape
LinkedIn people + business contact info (emails)linkedinPeopleContactgd_me5ppxjr2ge6icjuh0Instant lookup + Live scrape
LinkedIn company informationlinkedinCompaniesgd_l1vikfnt1wgvvqz95wInstant lookup + Live scrape
Crunchbase companiescrunchbaseCompaniesgd_l1vijqt9jfj7olijeLive scrape only
Instagram profilesinstagramProfilesgd_l1vikfch901nx3by4Live scrape only
Amazon productsamazonProductsgd_l7q7dkf244hwjntr0Live scrape only
Zillow propertieszillowPropertiesgd_lfqkr8wm13ixtbd8f5Live scrape only
Indeed job listingsindeedJobsgd_l4dx9j9sscpvs7no2Live scrape only
Google Maps businessesgoogleMapsgd_m8ebnr0q2qlklc02fzLive scrape only
Live-scrape datasets enrich rows you already have a URL for — an Amazon product page, a Zillow listing, an Indeed posting, a Google Maps place. They cannot search or discover ("find homes in 78704"). Only the three LinkedIn datasets support instant lookup by field; Bright Data's Search API rejects every other dataset id outright.

Fields

Each dataset exposes dozens of fields. The most commonly used ones are below — call field discovery (rtrvr.enrich({ dataset, fields: true }), free) to get the full, live list before you filter, since wrong field names fail the job.

DatasetKey fields
linkedinPeople / linkedinPeopleContactid (profile slug — the lookup key), url, name, position (role/title), current_company_name, city, about (bio), experience. The contact variant adds email and cellphone_number — partial coverage, most profiles return null for both.
linkedinCompaniesurl, name, website, industries, company_size, headquarters
crunchbaseCompaniesCompany profile fields — name, about, industries, founded date, size, region, website, socials — use field discovery for the full list
instagramProfilesProfile fields — profile name/id, followers, posts, website, bio, verification — use field discovery for the full list
amazonProductsasin, url, title, brand, initial_price, currency, availability, reviews_count, categories — 113 fields in total, use field discovery
zillowPropertieszpid, url, address, price, bedrooms, bathrooms, homeStatus, yearBuilt — 140 fields in total, use field discovery
indeedJobsjobid, url, job_title, company_name, location, salary_formatted, job_type, date_posted_parsed, description_text
googleMapsplace_id, url, name, address, category, reviews_count, open_hours, business_details

Two Modes: Instant Lookup vs Live Scrape

Enrichment runs one of two ways. Instant lookup queries Bright Data's pre-collected index and is the default for people and company enrichment; live scrape fetches fresh data on demand for exact URLs or datasets the index doesn't serve.

Instant LookupLive Scrape
APIBright Data Search APIWeb Scraper API (/scrape, sync)
SpeedSub-second~10–30s per input
Cost0.25 credits / returned record0.15 credits / successful record
DatasetsThe 3 LinkedIn datasets onlyAny scraper-backed dataset (Amazon, Zillow, Indeed, Google Maps, Crunchbase, Instagram)
How to call{ dataset, filter, fields }{ dataset, scrapeUrls, fields }
Best forBulk lookups by field (e.g. profile id)Exact URLs, non-LinkedIn data, or lookup misses
LimitsPass all keys in one in filter — batching is server-sideMax 20 inputs per call — chunk larger lists with rtrvr.mapLimit

Slow Scrapes: Pending Jobs

Bright Data serves a scrape inline only while it fits their one-minute window. A heavier job (20 Zillow listings, say) hands back a job handle instead, and the call returns { pending: true, snapshotId } having billed nothing. Do other work, then collect the records later in the same plan:

js
let { records, pending, snapshotId } = await rtrvr.enrich({ dataset: rtrvr.datasets.zillowProperties, scrapeUrls: listingUrls, // max 20 per call fields: ['zpid', 'address', 'price', 'bedrooms'], }); // ...do other free work here while Bright Data finishes... if (pending) { ({ records, pending } = await rtrvr.enrich({ collect: snapshotId, fields: ['zpid', 'address', 'price', 'bedrooms'] })); } // Never re-scrape a pending job — collecting it is how you avoid paying twice.

Cost & Credits

  • Instant lookup — 0.25 credits per returned record; zero matches cost nothing.
  • Live scrape — 0.15 credits per successful record; failed inputs are free.
  • Discovery — listing datasets and inspecting fields is always free.
  • Pending jobs — a scrape that exceeds the sync window bills nothing until you collect it.
  • Credits are billed at cost (1 credit = $0.01), and every paid call is estimated and approved before it runs.

Approval Flow

Retriever Enrich never spends credits without your explicit go-ahead. For every paid run, the agent:

  • Builds the entity list locally for free (from your sheet rows or extracted data).
  • Estimates the credit cost (records × the per-record rate).
  • Asks you to approve the spend via a prompt inside the task.
  • Runs the paid lookup or scrape only after you approve, then joins the results back onto your rows.

Example: Enrich LinkedIn Profiles

You do not have to write this yourself — ask in plain English (e.g. "enrich these LinkedIn profile URLs with name, title, and company") and the agent generates and runs the plan. The code below is what it runs under the hood.

js
// Build lookup keys from your sheet rows — match on the lowercase LinkedIn // profile slug (the segment after /in/), NOT the full URL. const ids = rows .map(r => r.linkedinUrl?.split('/in/')[1]?.split(/[/?#]/)[0].toLowerCase()) .filter(Boolean); // Estimate cost and get explicit approval before any paid call. const estCredits = Math.ceil(ids.length * 0.25); const { answers } = await rtrvr.askUser({ questions: [{ key: 'enrichApproval', query: `Enrich ${ids.length} LinkedIn profiles for ~${estCredits} credits?`, choices: ['Yes', 'No'], }], }); if (answers.enrichApproval !== 'Yes') return { summary: 'Enrichment declined.' }; // Instant lookup — pass ALL ids in ONE `in` filter (batching is server-side). const { records } = await rtrvr.enrich({ dataset: rtrvr.datasets.linkedinPeople, filter: { name: 'id', operator: 'in', value: ids }, fields: ['id', 'name', 'position', 'current_company_name', 'city'], }); // records → join back onto your rows on `id`, then write the enriched columns.
Match on the lowercase id slug, not the full profile URL — stored URLs vary by country subdomain and trailing slash, so URL equality matches nothing. Always pass fields to keep records small (full records are tens of KB each); the join keys id, url, and input_url are always returned so you can match records back to your rows.

Enriching LinkedIn URLs with Emails

To add emails and phone numbers, use the linkedinPeopleContact dataset — same instant lookup by id slug, but request the email and cellphone_number fields explicitly (they are dropped unless named). Coverage is partial: this is partner-sourced B2B contact data, and most profiles return null for both, so treat any email you get as a bonus rather than a guarantee.

js
const { records } = await rtrvr.enrich({ dataset: rtrvr.datasets.linkedinPeopleContact, filter: { name: 'id', operator: 'in', value: slugs }, fields: ['id', 'name', 'position', 'current_company_name', 'email', 'cellphone_number'], }); const filled = records.filter(r => r.email).length; // e.g. "12 of 60 profiles had an email" — a blank email on a matched row is // normal, not a failed lookup.
For rows the contact dataset leaves blank, the free supplement is fetching the person's company website contact/about page — the same technique the lead-generation recipe uses. There is no field named headline: position is the role/title and about is the bio.

Example: Enrich Companies by Domain

The linkedinCompanies dataset is instant-searchable and carries a website field, so a column of company domains can be enriched with firmographics in a sub-second lookup — no scraping required.

js
const { records } = await rtrvr.enrich({ dataset: rtrvr.datasets.linkedinCompanies, filter: { name: 'website', operator: 'in', value: domains }, fields: ['name', 'website', 'industries', 'company_size', 'headquarters'], }); // Domains are stored as full URLs, so `in` can miss on scheme or a leading // "www.". If a domain returns nothing, retry it with the `includes` operator.

Example: Enrich Amazon Products by URL

Non-LinkedIn datasets are live-scrape only: you supply each product's URL and get a fresh record back. Chunk lists larger than 20 with rtrvr.mapLimit.

js
const chunks = []; for (let i = 0; i < productUrls.length; i += 20) chunks.push(productUrls.slice(i, i + 20)); const results = await rtrvr.mapLimit(chunks, 2, async chunk => rtrvr.enrich({ dataset: rtrvr.datasets.amazonProducts, scrapeUrls: chunk, fields: ['asin', 'title', 'brand', 'initial_price', 'availability'], }), ); // Each result may come back `pending` — collect it with { collect: snapshotId }. // Join back onto your rows on `url` (or `input_url`, the URL you passed in).

Web Search

Plans can also search the web programmatically with rtrvr.webSearch({ query, count?, gl?, hl? }) — one Google query per call, returning parsed organic results ({ title, url, snippet }) and, for place-flavored queries, localResults (Google's local pack: name, address, rating, reviews, category, and a canonical maps link). Phone numbers and websites are not in the pack — they come from each business's own site or listing. It costs a flat 0.15 credits per query with no approval prompt, and replaces navigating a browser tab to Google. Localize with gl (country) and hl (language).

Recipe: Local-Business Lead Generation

The pieces compose into a lead-generation pipeline — ask in plain English (e.g. "find 100 businesses in Casablanca and Rabat that likely need a website") and the agent runs this shape:

  • Fan rtrvr.webSearch over each industry × city (localized, e.g. gl: 'ma', hl: 'fr') and harvest the local pack — business name, phone, website (or its absence), rating, maps link.
  • Construct a Google Maps link per business: https://www.google.com/maps/search/?api=1&query=Name+City resolves to the real place page.
  • Enrich businesses that have a website with a free fetch of their contact/about page (email, socials), or instantly via the linkedinCompanies dataset filtered on website.
  • Qualify with one LLM pass (rtrvr.inferSheetData) — e.g. a "why they need a website" column and a priority score.
  • Rows append to a Google Sheet as they are found, so partial progress always survives; export the sheet as CSV when done.
Expect partial email coverage on local-business runs — many small businesses publish no email anywhere, and the strongest leads (no website at all) usually have none. Phone numbers and maps links fill far more reliably.
Previous
Knowledge Base (RAG)
Next
Triggers

On this page

Available DatasetsFieldsTwo Modes: Instant Lookup vs Live ScrapeCost & CreditsApproval FlowExample: Enrich LinkedIn ProfilesEnriching LinkedIn URLs with EmailsExample: Enrich Companies by DomainExample: Enrich Amazon Products by URLWeb SearchRecipe: Local-Business Lead Generation

Ready to automate?

Join teams using rtrvr.ai to build playful, powerful web automation workflows.