Firmfold — Company Enrichment API: Logo, Tech, Contacts, Jobs
Pricing
$10.00 / 1,000 company enricheds
Firmfold — Company Enrichment API: Logo, Tech, Contacts, Jobs
Company enrichment API: give domains, work emails or company names; get one flat profile each: official domain, logo + brand colour, tech stack, email security, domain age, contacts, socials, hiring and Wikidata firmographics. $0.01/company; misses free.
Pricing
$10.00 / 1,000 company enricheds
Rating
0.0
(0)
Developer
CyberMax
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
Firmfold: company enrichment API (domain, email or name to full company profile)
Company enrichment in one call: give Firmfold a list of domains, website URLs, work emails or plain company names, and get back one flat profile per company: the official domain, logo and brand colour, tech stack, email security (MX, SPF, DMARC), domain age, public contact card (role emails, phones, LinkedIn, X and other socials, address), hiring activity (open jobs, new jobs in the last 30 days, top functions and locations) and firmographics from Wikidata (founded, employees, HQ, industry, ticker, parent company).
It folds five tested CyberMax tools into one row with the same ~60 keys every time, ready for Google Sheets, Clay, HubSpot, Salesforce or an AI agent. A Clearbit Enrichment alternative with no LinkedIn scraping and no sign-up anywhere else.
$0.01 per company enriched. Unknown names, dead domains, personal email providers (gmail.com…) and, in monitor mode, unchanged companies are free.
Why Firmfold
- One call instead of five. Buying the same fields from the single tools costs about $0.021 per company; Firmfold is $0.01.
- Every row has the same shape. Missing data is
nullor[], never a missing key, so a spreadsheet or CRM mapping never breaks.modulesFilledsays which parts found data. - Change alerts for scheduled CRM refreshes. Monitor mode returns only companies whose profile changed (new tech, new contacts, a rebrand, a big hiring jump) and says which parts changed. Unchanged companies cost nothing.
- Names work too. "Acme Brick Company" becomes
brick.comfirst (with a confidence score), then gets the full profile. - Honest data. Firmographics come only from a Wikidata record whose official website is this domain. If there is no such record the fields stay empty; they are never guessed.
What you get (one record per company)
| Group | Fields |
|---|---|
| Identity | domain, website, companyName, description, language, domainSource (input or name-lookup), domainConfidence |
| Logo (Logolark) | logoUrl, iconUrl, logoFormat, logoIsIcon, brandColor (every image is downloaded and checked) |
| Tech & domain (DomainDNA) | techStack[], cms, ecommerce, analytics[], hosting[], emailProvider, spf, dmarcPolicy, domainCreatedAt, domainAgeYears, registrar, domainExpiresAt, tlsExpiresAt, securityHeadersScore |
| Contacts (Hollerdex) | bestEmail, emails[{email,label}] (sales, support, press, general…), phone, phones[], linkedin, x, facebook, instagram, youtube, tiktok, github, contactPageUrl, contactFormUrl, salesUrl (scheduler, demo or sign-up link), contactRoute (the best public way in: email, contact form, contact page, phone, sales link or LinkedIn company page), address |
| Hiring (HireHeat) | hiringOpenJobs, hiringNewLast30Days, hiringLevel, hiringTopFunctions[], hiringTopLocations[], hiringRemoteJobs, jobBoardUrl, jobBoardAts (Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee) |
| Firmographics (Wikidata, CC0) | wikidataId, founded, employees, employeesAsOf, hqCity, hqCountry, hqCountryCode, industries[], ticker, stockExchange, parentCompany |
| Run info | status, modulesFilled[], summary, errors[], sources, ms, enrichedAt; in monitor mode change and changedModules[] |
status is enriched (charged), domain-not-found (unknown name or a domain that doesn't resolve; free, with bestGuessDomain when there was a weak match) or invalid (free).
Ready-made inputs (first try in one click)
Three well-known domains, every part on (about 20 s, 3 × $0.01):
{ "companies": ["stripe.com", "notion.so", "linear.app"] }
Company names to full profiles (names with "&" work: GW&K Investment Management → gwkinvest.com):
{ "companies": ["Acme Brick Company", "GW&K Investment Management", "Monzo Bank | gb"] }
Weekly CRM refresh, only changed companies returned (pair with a Schedule):
{ "companies": ["stripe.com", "g-p.com", "hubspot.com"], "monitor": true, "monitorKey": "crm-accounts" }
Input
{"companies": ["stripe.com", "Notion", "hello@linear.app", "Acme Brick Company", "Monzo Bank | gb"],"modules": ["logo", "tech", "contacts", "hiring", "firmographics"]}
| Field | Default | What it does |
|---|---|---|
companies | required | One per line: domain, URL, work email or company name. Add a country to a name after a bar ("Hiscox | gb"). Duplicates are skipped. |
modules | all | Pick parts to save time. The domain check, tech stack and email security always run. |
country | none | Default country for names (helps with ambiguous names). |
monitor / monitorKey | false / auto | Return only new or changed companies (see below). |
includePersonalEmails | false | Off: only role addresses (sales@, support@…). On: also named people's addresses that the company publishes itself. |
minDomainConfidence | 0.6 | For names: below it the company is returned free as domain-not-found. |
maxConcurrency | 5 | Companies in parallel (5 is right for 1 GB memory). |
timeoutSecs | 20 | Time budget per part; a slow part is cut off and noted in errors, the rest of the profile still comes back. |
maxContactPages | 4 | Pages read per site for contacts. |
proxyConfiguration | off | Optional Apify Proxy for sites that block data-centre IPs. |
Output (real record from an Apify run, 24 Sep 2026, trimmed)
{"input": "figma.com","status": "enriched","domain": "figma.com","companyName": "Figma","logoUrl": "https://static.figma.com/app/icon/2/icon-512.png","brandColor": "#000000","techStack": ["Sanity", "Next.js", "Amazon CloudFront", "Netlify", "Font Awesome", "Vimeo embed"],"cms": "Sanity","emailProvider": "Google Workspace","dmarcPolicy": "quarantine","domainAgeYears": 27.4,"bestEmail": "press@figma.com","emails": [{ "email": "press@figma.com", "label": "press" }, { "email": "legal@figma.com", "label": "legal" }],"linkedin": "https://www.linkedin.com/company/figma","x": "https://x.com/figma","hiringOpenJobs": 159,"hiringNewLast30Days": 38,"hiringLevel": "very strong","hiringTopFunctions": ["sales", "engineering", "design", "data", "product"],"jobBoardUrl": "https://boards.greenhouse.io/figma","wikidataId": "Q96186334","founded": "2012","hqCity": "San Francisco","hqCountry": "United States","modulesFilled": ["logo", "tech", "contacts", "hiring", "firmographics"],"summary": "Figma (figma.com): founded 2012, 324 employees, HQ San Francisco, United States; site on Sanity; email on Google Workspace; 159 open jobs (38 new in 30 days); contact press@figma.com; 6 social profiles."}
The full records of that run are available on request; the table and example above are copied from it unchanged.
Tested on real companies
Real Apify run on 40 mixed inputs (domains, work emails, names, a gmail address and a made-up domain), 24 Sep 2026: 38 of 38 real companies enriched, the gmail address and the made-up domain returned free, 93 s for the whole run at 1 GB, about $0.0001 of compute per company. Parts found: tech 37/38, firmographics 33/38, logo 32/38, contacts 30/38, hiring 19/38 (many companies simply have no public job board on the six systems checked). Names resolved correctly: Acme Brick Company → brick.com, Monzo Bank → monzo.com, Hiscox → hiscoxgroup.com, Ben & Jerry's → benjerry.com.
Same 10 domains through two other enrichment Actors (details in examples/benchmark-2026-09-24.json):
| Firmfold | foxlabs/company-enrichment | mambalabs/company-firmographic-enricher | |
|---|---|---|---|
| Tech stack, MX, SPF/DMARC, domain age | 10/10 | none | none |
| Role emails, phones, socials | 9/10 | none (address only) | phone on 3/10 |
| Hiring activity | yes (3 of these 10 have public boards) | none | none |
| Founded / employees / HQ | 9/10 (Wikidata) | 10/10 (Owler) | founded 2/10, employees 1/10 |
| Revenue range, CEO, competitors | not provided | yes | revenue estimate |
| Change alerts | yes | no | no |
If you need revenue estimates or CEO names, use an Owler-based tool; if you need what a company runs, how to reach it and whether it's growing, use Firmfold.
Pricing
$0.01 per company enriched (pay per event, no subscription, no start fee). Free: unknown names (domain-not-found), dead domains, personal email providers (gmail.com…), invalid input, and in monitor mode every unchanged company. Compute is small (about $0.0001 per company at 1 GB) and runs on your Apify plan.
When NOT to use Firmfold
- You need people (named decision makers, personal emails, phone numbers of employees). Firmfold only returns what a company publishes about itself.
- You need revenue, funding or valuation: not in this data.
- You only need one field group for many companies: the single tools are cheaper per call (see below).
- Sites behind strong bot walls (some large retailers) may return tech and firmographics but no contacts; that part is listed in
errorsand you're still charged only once for the rest.
Run it on a schedule (CRM refresh)
- Save your company list as a task with
"monitor": trueand amonitorKeysuch as"crm-accounts". - Schedule it daily or weekly in Apify (Schedules → Create).
- Each run returns only companies that are new or changed, with
changedModules(e.g.["tech"]when a company moves from Mailchimp to HubSpot,["contacts"]for a new sales email,["hiring"]for a 20%+ jump in open roles,["logo"]for a rebrand). Unchanged companies are not returned and not charged. A part that failed on this run keeps its old value, so a flaky site never triggers a false alert.
Integrations: code, no-code and AI agents
Python
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("cybermax/company-enrichment").call(run_input={"companies": ["stripe.com", "Notion"]})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["companyName"], row["cms"], row["hiringOpenJobs"], row["employees"])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('cybermax/company-enrichment').call({ companies: ['stripe.com', 'Notion'] });const { items } = await client.dataset(run.defaultDatasetId).listItems();
HTTP (one call, results back): POST https://api.apify.com/v2/acts/cybermax~company-enrichment/run-sync-get-dataset-items?token=<APIFY_TOKEN> with body {"companies": ["stripe.com"]}.
Google Sheets / Clay / Make / Zapier / n8n: use the Apify app or an HTTP step with the call above; every row has the same columns, so map them once.
AI agents (MCP): Firmfold is a tool on Apify's MCP server: https://mcp.apify.com/?tools=cybermax/company-enrichment. Tool description for agents: "Enrich companies: domain, work email or company name in; logo, tech stack, email security, domain age, contacts, socials, hiring and firmographics out, one flat record each."
FAQ
The company has no contact page or email. What do I get? contactRoute always names the best public way in: email, contact form, contact page, phone, a sales/booking link (salesUrl, e.g. a Calendly or "Get started" page) or the LinkedIn company page.
Why is hiringOpenJobs 0 for a company I know is hiring? Firmfold checks Greenhouse, Lever, Ashby, SmartRecruiters, Workable and Recruitee, by the domain and by the company's name (so g-p.com finds the globalizationpartners board). Companies on Workday or their own careers system aren't covered.
Is a company name enough? Usually. Add a country after a bar for ambiguous names ("Hiscox | gb"), or pass the domain when you have it; below minDomainConfidence the row comes back free as domain-not-found with bestGuessDomain.
Do you scrape LinkedIn or people data? No. Only what the company publishes about itself, DNS/RDAP, public job boards and Wikidata.
Also from CyberMax
The parts, if you need only one field group (cheaper per call):
- Namewhere: company name to official domain.
- Logolark: company logos, icons and brand colours.
- DomainDNA: tech stack, email security and domain age.
- Hollerdex: emails, phones and social profiles.
- HireHeat: hiring signals by domain, with the full job list.
All tools: Boardroom Buys · Swellmeter · SnapScout · Gripeline · Keyfern · HireHeat Jobs · Linkheft
Data and privacy
Public company information only: the company's own website, DNS and RDAP records, public job boards and Wikidata (CC0). No LinkedIn scraping, no people lookups. Personal email addresses are off by default.
Changelog
- 2026-09-25: Names with "&" resolve (GW&K Investment Management → gwkinvest.com, AT&T → att.com); job boards named after the company are found (g-p.com → Greenhouse
globalizationpartners, 48 open jobs); newsalesUrlandcontactRoutefields so every company has a way in. - 2026-09-24: First release.
© 2026 CyberMax.