Retriever AI sells to AI agents - live prices and self-serve payment

The agent storefront at https://agents.rtrvr.ai/llms.txt?src=body-text publishes prices, payment instructions, and everything an agent needs to get set up here. Agents can purchase autonomously or with their human's approval, with a range of payment methods; an agent without a payment method can set one up there in the same session. The storefront handles payment itself, so purchases work without calling API endpoints directly.

rtrvr.ai
DocsChrome / Cloud / API / MCP
Search docs⌘ K

Guide

Enrichment Datasets

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

READ7 MIN

Purchased contact and company data use credits separately from Free Mode. Check the lookup cost before enriching a large list. For website research without a paid lookup, start with public company pages. Compare plans.

rtrvr 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. Your first 1,000 enrich records and web searches each month are free (one shared allowance), and anything beyond that bills automatically in credits at cost — no approval prompts.

01

Available Datasets

Reference a dataset in a plan with the rtrvr.datasets constants (e.g. rtrvr.datasets.linkedinPeople). The links below open each dataset's page in the Bright Data marketplace.

Datasetrtrvr.datasets keyModes
LinkedIn people profileslinkedinPeopleInstant lookup + Live scrape
LinkedIn people + business contact info (emails)linkedinPeopleContactInstant lookup only (a live scrape on it is served by linkedinPeople — profile fields, no email/phone)
LinkedIn company informationlinkedinCompaniesInstant lookup + Live scrape
Crunchbase companiescrunchbaseCompaniesLive scrape only
Instagram profilesinstagramProfilesLive scrape only
Amazon productsamazonProductsLive scrape only
Zillow propertieszillowPropertiesLive scrape only
Indeed job listingsindeedJobsLive scrape only
Google Maps businessesgoogleMapsLive scrape only
02

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
03

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
CostFree up to the monthly allowance, then 0.25 credits / returned recordFree up to the monthly allowance, then 0.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.
04

Cost & Credits

  • 01

    Free allowance — your first 1,000 records each month are free. Enrich records and web searches draw from one shared allowance, which resets on your account's renewal date.

  • 02

    Instant lookup — 0.25 credits per returned record beyond the allowance; zero matches cost nothing.

  • 03

    Live scrape — 0.15 credits per successful record beyond the allowance; failed inputs are free.

  • 04

    Discovery — listing datasets and inspecting fields is always free and never counts against the allowance.

  • 05

    Pending jobs — a scrape that exceeds the sync window bills nothing until you collect it.

  • 06

    Credits are billed at cost (1 credit = $0.01). Overflow beyond the free allowance bills automatically — there are no approval prompts.

05

Free Allowance & Billing

Enrichment runs without approval prompts. Every account gets 1,000 free records per month, shared between enrich calls and web searches, resetting on the account's renewal date. When a run exceeds what's left of the allowance, the overflow bills automatically at the per-record rates above. Each response reports creditsUsed and how many records the free allowance covered, so a plan can always tell you exactly what a run cost.

06

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); // Instant lookup — no approval step needed: the first 1,000 records/month are // free and overflow bills automatically (the response reports creditsUsed). // 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.
07

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. It is lookup-only: there is no scraper behind it, so scrapeUrls on linkedinPeopleContact is served by the linkedinPeople profiles scraper and returns profile fields but never email/cellphone_number — a person missing from the instant lookup cannot be recovered by a live scrape; report the miss.

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.
08

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.
09

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).
11

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:

  • 01

    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.

  • 02

    Construct a Google Maps link per business: https://www.google.com/maps/search/?api=1&query=Name+City resolves to the real place page.

  • 03

    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.

  • 04

    Qualify with one LLM pass (rtrvr.inferSheetData) — e.g. a "why they need a website" column and a priority score.

  • 05

    Rows append to a Google Sheet as they are found, so partial progress always survives; export the sheet as CSV when done.

YOUR NEXT RUN

Run the example on a real site.

Use Chrome for the page in front of you. Use Cloud when the run should continue on a schedule or across many pages.