Dun & Bradstreet Scraper - Companies, Revenue & Contacts
Pricing
from $1.40 / 1,000 company records
Dun & Bradstreet Scraper - Companies, Revenue & Contacts
Scrape Dun & Bradstreet (dnb.com) business directory by company name, country, size, role or industry. Extract company profiles, revenue, employee counts, key executives, principals, contact details and stock information. Ideal for B2B lead generation, company research and market intelligence.
Pricing
from $1.40 / 1,000 company records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Security
Limited permissionsShare
Dun & Bradstreet company data for lead generation, firmographic enrichment, and market mapping. This actor searches the D&B business directory by company name, walks its industry listings, and returns structured company records with revenue, employee counts, principals, contact details and stock listing data.
Why This Scraper?
- The definitive firmographic source. Dun & Bradstreet maintains profiles on hundreds of millions of businesses with revenue, employee counts, corporate family roles and industry classification that most data providers resell.
- Search the way you think. Type a company name keyword plus an optional country, employee size range and corporate role; the directory applies every filter before results come back.
- Browse industries directly. Paste any directory industry page (country, region or city scoped) and the actor walks its listings page by page.
- Rich company profiles. Each record can be enriched with formatted revenue, exact employee counts with reliability metadata, key principals, phone, website, stock exchange, Fortune-style rankings, corporate family and similar companies.
- Recurring-run friendly. Incremental mode compares every scan against a saved baseline: unchanged companies are skipped, changed ones ship with the fields that moved, and disappeared companies can be reported.
- Clean structured output. Flat records with stable IDs, ready for spreadsheets, CRM imports, or direct API consumption.
Use Cases
- Who: Sales and GTM teams building targeted prospect lists filtered by industry, size and corporate role.
- Who: Data teams enriching an existing company list with revenue bands, employee counts and executive names.
- Who: Market researchers mapping an industry across a country, region or city.
- Who: Ops teams keeping a CRM in sync: scheduled incremental runs flag new, changed and vanished companies.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
companyName | Sample Industries Inc |
encryptedDuns | 53890f4828e079d340ea27fd3cfdd0ff |
url | https://www.dnb.com/business-directory/company-profiles/sample-industries-inc.00000000000000000000000000000000 |
companyRole | Parent |
industryName | Computer Systems Design Services |
revenueFormatted | $12.5 M |
employeesConsolidatedValue | 412 |
employeesConsolidatedScope | Consolidated |
keyPrincipal | Jane Doe |
principals | [{"name": "Jane Doe", "position": "President"}] |
totalContactsOnFile | 1,204 |
phone | (000) 000-0000 |
website | www.sampleindustries.example |
stockExchange | NASDAQ:SMP |
industries | ["Computer Systems Design Services", "Data Processing"] |
parentIndustry | Information |
ownershipType | Public |
isPrivate | false |
ranks | [{"rank": 500, "list": "Fortune 1000 Revenue Rank", "year": "2026"}] |
corporateFamily | {"globalHeadquarters": "Sample Industries Inc", "totalSubsidiaries": 12} |
similarCompanies | [{"name": "Peer Company LLC", "industry": "IT Services"}] |
addressCity | Austin |
addressCountry | United States |
changeType | NEW |
scrapedAt | 2026-01-01T00:00:00Z |
Enriched records also carry annual revenue history, financial statement lines, employee trends, similar-company lists and the full principals table in the Enriched companies output tab.
How to Use
- Pick a mode. Search looks companies up by name; links walks directory pages you paste.
- In search mode add a country code and, optionally, an employee size range or corporate role filter.
- Set the record limit and whether to enrich each company with its profile data.
- Run the actor. Records land in the dataset as flat company rows.
Search by keyword with filters
Search for software companies in the US with 501 to 1000 employees:
{"mode": "search","queries": ["software"],"country": "us","employeesMin": 501,"employeesMax": 1000,"companyRole": "parent","fetchDetails": true,"maxItems": 20}
Browse an industry page
Walk a country-scoped industry listing:
{"mode": "urls","urls": ["https://www.dnb.com/business-directory/us/software_publishers/companies"],"fetchDetails": true,"maxItems": 50}
Browse a city-scoped listing plus a profile
Links mode accepts region pages, city pages and company profile pages together:
{"mode": "urls","urls": ["https://www.dnb.com/business-directory/us/california/los_angeles/construction/companies","https://www.dnb.com/business-directory/company-profiles/sample-industries-inc.00000000000000000000000000000000"],"maxItems": 50}
Scheduled incremental monitoring
Keep a watchlist in sync: unchanged rows are skipped:
{"mode": "search","queries": ["logistics"],"country": "us","maxItems": 200,"incrementalMode": true,"stateKey": "logistics-watchlist","emitExpired": true,"fetchDetails": true}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("abotapi/dnb-com-scraper").call(run_input={"mode": "search","queries": ["software"],"country": "us","maxItems": 20,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["companyName"], item.get("revenueFormatted"))
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('abotapi/dnb-com-scraper').call({mode: 'search',queries: ['software'],country: 'us',maxItems: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach((item) => console.log(item.companyName, item.revenueFormatted));
Tips
- Each search or browse scope serves its first 1,000 matches; scope tighter (add a region, city, or employee filter) instead of paging deeper.
- Leave enrichment on for the fullest records; turn it off for cheap, fast name-and-location sweeps.
- Incremental mode needs a complete scan to report disappeared companies, so pair it with a record limit comfortably above the scope size.
Send results into your apps (MCP connectors)
This actor supports Apify MCP connectors. Name connectors in the mcpConnectors input and every collected record is sent to them after the run, so your spreadsheet, Notion workspace or agent workflow receives results without a separate export step. Set notionParentPageUrl to file each record as a Notion page under a parent of your choice.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | select | search | Search by company name, or walk directory links you paste. |
queries | array | ["software"] | Company name keywords; each runs its own search and shares the record limit. |
country | string | us | Two-letter country code the search is scoped to. |
employeesMin | integer | (empty) | Optional minimum employee count, applied by the directory server-side. |
employeesMax | integer | (empty) | Optional maximum employee count, applied by the directory server-side. |
companyRole | select | any | Corporate family role filter: any, branch, parent, subsidiary. |
urls | array | three sample links | Links mode: industry, region or city browse pages plus company profile pages. |
fetchDetails | boolean | true | Read each company's profile to add revenue, employees, principals, contacts and stock data. |
maxPages | integer | (empty) | Page walk limit per scope; empty means no page limit and defers to the record limit. |
maxItems | integer | 20 | Maximum company records per run across all searches and links; 0 means unlimited. |
resumeFromRunId | string | (empty) | Pick up an unfinished run: already-collected records are skipped. |
incrementalMode | boolean | false | Compare scans against a saved baseline; unchanged companies are skipped. |
stateKey | string | (empty) | Name for the saved baseline; use one key per recurring scope. |
emitUnchanged | boolean | false | Also push records whose data did not change. |
emitExpired | boolean | false | Push an EXPIRED row for baseline records missing from a complete scan. |
ignoreFieldsForChanges | array | (empty) | Extra field names change detection should disregard. |
proxy | object | automatic | Which Apify proxy the run connects through (a paid plan with proxy access is needed). The default was measured to serve the directory; choose residential exits only when you need a specific country. Proxy URLs you enter are used exactly as given. |
mcpConnectors | array | (empty) | Connector IDs to receive collected records after the run. |
notionParentPageUrl | string | (empty) | Notion parent page for per-record child pages. |
maxNotifyListings | integer | 50 | Cap on records per connector export. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
One enriched company record:
{"companyName": "Sample Industries Inc","encryptedDuns": "00000000000000000000000000000000","url": "https://www.dnb.com/business-directory/company-profiles/sample-industries-inc.00000000000000000000000000000000","companyRole": "Parent","industryName": "Computer Systems Design Services","revenueFormatted": "$12.5 M","sales": 12500000,"salesCurrency": "USD","revenueYear": "2025","revenueReliability": "Actual","employeesConsolidatedValue": 412,"employeesConsolidatedScope": "Consolidated","employeesConsolidatedReliability": "Actual","employeesThisSiteValue": 250,"keyPrincipal": "Jane Doe","keyPrincipalPosition": "President and Chief Executive Officer","principals": [{ "name": "Jane Doe", "position": "President and Chief Executive Officer" }],"totalPrincipals": 4,"totalContactsOnFile": "1,204","phone": "(000) 000-0000","website": "www.sampleindustries.example","stockExchange": "NASDAQ:SMP","tradeStyleName": "Sample Industries","industries": ["Computer Systems Design Services"],"parentIndustry": "Information","ownershipType": "Public","entityType": "Parent","isPrivate": false,"ranks": [{ "rank": 500, "list": "Fortune 1000 Revenue Rank", "year": "2026" }],"corporateFamily": { "globalHeadquarters": "Sample Industries Inc" },"addressStreet": "100 Example Pkwy Ste 300","addressCity": "Austin","addressRegion": "Texas","addressPostalCode": "78701","addressCountry": "United States","changeType": "NEW","detailFetched": true,"scrapedAt": "2026-01-01T00:00:00Z"}
Plan Requirement
This actor is priced per event: each pushed company record is a dataset result, each enriched record carries a detail surcharge, and every run carries a start charge. The directory checks every connection, so each run needs an Apify plan with proxy access; free plans do not include it, and such a run stops at once with a message that says so (you can enter your own proxy URLs instead). If the selected connection cannot be used, the run moves once to a backup connection and says so in the log; rows read that way carry the directory listing fields and the profile summary values (employee size bands instead of exact counts, no principals table or financial history), and the proxy usage of that backup connection is billed to your Apify account.
FAQ
How much does a run cost?
A default run of 20 enriched records bills 20 dataset results, up to 20 detail enrichments and one start charge. Enrichment off bills results plus the start charge only.
Is it legal to scrape Dun & Bradstreet?
The actor collects publicly viewable directory pages the same way a browser does, at a modest request rate. Review the site's terms of service and your jurisdiction's data-protection rules before commercial use, and do not resell the data as your own directory product.
Can I schedule recurring runs?
Yes. Pair a schedule with incremental mode and a fixed state key: the first run saves a baseline, later runs push only new or changed companies, and optional EXPIRED rows report companies that left the scope.
Why did a run return fewer records than the directory shows for my search?
Each scope serves its first 1,000 matches. Add a region, city, employee range or role filter to scope tighter instead of paging deeper.
Why did a run fail with a connection message?
The directory checks every connection and occasionally refuses an exit. The run opens a fresh connection and retries a bounded number of times, then uses the backup connection once; when that fails too it ends with an honest failure instead of an empty result. Re-running later usually resolves it.
Can an AI agent use this actor?
Yes. The dataset is flat JSON with stable record IDs, and MCP connectors hand results straight to agent workflows.
🔗 More scrapers you might like
Pair this actor with these related scrapers from the same team:
| 📇 JobStreet Pull JobStreet company profiles and employee reviews across Malaysia, Singapore... | 📱 Clutch Scraper Scrape Clutch company directories and profiles. Get names, ratings, review counts, hourly... |
| 📇 Comparably Extract rich company data from comparably.com using company names or profile URLs. Get... | 💼 SEEK Company Reviews Scrape SEEK Australia and New Zealand company profiles and employee reviews. Choose... |
| 💼 RepVue Scraper Scrape RepVue company profiles, RepVue Score, sales-rep reviews, and compensation by role... | 🧩 Naukri.com Scraper Scrape Naukri.com jobs by keyword or URL. Extract job title, company, skills, experience... |
💬 Support
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.
