SFOLN

Catalogue / Company & lead intelligence

Company Enrichment – Firmographics by Domain

sfoln/company-enrichment · Lead generation, Developer tools, Automation On request

Enrich a company domain into one live profile: name, legal name, logo, addresses, emails, phones, socials, tech stack, MX/SPF/DMARC, domain age, open jobs, LEI and SEC ticker, Shopify flag. Optional name lookup and LinkedIn data. $5 per 1,000 companies.

About

What it does

Turn a company domain into one live company profile: the Actor reads the company's own website (homepage plus up to three contact, imprint, careers and about pages), its DNS records, its domain registration and TLS certificate, its public job board and the free LEI and SEC registers, and returns about 60 normalized fields in one JSON record: name and legal name, logo, addresses, e-mails (locally pre-checked), phones (E.164), social profiles, tech stack, SaaS tools seen in DNS, mail provider with SPF and DMARC, domain age, SSL, open jobs by department, LEI, SEC CIK and ticker, VAT and register numbers, and a Shopify / WooCommerce store flag. Built for SDR and RevOps teams enriching CRM accounts, VC and M&A screening, and AI agents answering "tell me about acme.com". Nothing comes from a stale database: every profile is read live.

Price

Price per delivered record

EventPricePer 1,000Charged for
Company profile
company-profile
$0.005$5 / 1,000Charged once per company whose website was read: one profile with names, logo, addresses, e-mails (pre-checked), phones, socials, tech stack, e-mail DNS setup, domain age, SSL, hiring snapshot, LEI / SEC identifiers and store flags.
LinkedIn company profile
linkedin-firmographics
paid plans only
$0.007$7 / 1,000Paid add-on (includeLinkedIn): the company's LinkedIn page linked from its website (industry, size, employees on LinkedIn, followers, headquarters, founded, specialties, funding). Paid Apify plans only.
Company name lookup
company-name-lookup
paid plans only
$0.0045$4.5 / 1,000Paid add-on (companyNames): one Google search for a company name to find its website (knowledge graph and organic results, verified against the site's own name). Paid Apify plans only.

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~company-enrichment/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains":["apify.com"]}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/company-enrichment"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~company-enrichment/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Enrich apify.com: give me the company's legal name, address, LinkedIn page, tech stack, e-mail provider, number of open jobs and its LEI.

Input

Input fields

Enter company domains (or, on paid plans, company names). Each company produces one profile record.

FieldTypeDefaultMeaning
domainsarray—Company domains
Company websites as domains (apify.com) or URLs, one per line. Duplicates are removed. Accounts on the Apify free plan can process up to 10 companies per run.
companyNamesarray[]Company names (paid plans)
Company names to find the website of first, one per line, optionally with a country: "Acme Widgets | DE". Each name costs one search ($0.0045, company-name-lookup) whether or not a website is found; the profile is charged only when the website was found. Paid Apify plans only.
countrystring—Default country for names
ISO country code (US, DE) used for company names given without one: it localises the search.
includeLinkedInbooleanfalseLinkedIn company data
Also read the company's LinkedIn page linked from its website (industry, size, employees, followers, funding). Paid add-on: $0.007 per company (linkedin-firmographics), paid Apify plans only.
includeHiringbooleantrueHiring snapshot
Find the company's job board (Greenhouse, Lever, Ashby, Workable, Recruitee, Personio, Teamtailor, SmartRecruiters, BambooHR, Breezy, Workday) and count its open roles by department.
guessJobBoardbooleantrueGuess the job board from the domain
When the website links no job board, try the domain name on the main ATS APIs (the match is checked against the company; reported as detectedBy slug_guess).
includeIdentifiersbooleantrueLEI and SEC identifiers
Look the company up in GLEIF (LEI) and SEC EDGAR (CIK, ticker, exchange).
maxPagesinteger4Pages per website
Pages read per company: the homepage plus up to 3 of its contact, imprint, careers and about pages. Range 1–4.
maxItemsinteger1000Max companies
Safety cap on how many companies (domains and names) are processed in this run. Range 1–10000.
concurrencyinteger5Concurrency
How many companies are enriched in parallel (1–10). Range 1–10.
includeRawbooleanfalseInclude raw response data
Attach the homepage's response headers, redirects and its JSON-LD Organization under raw.
Example input
{
  "domains": [
    "apify.com"
  ]
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The domain or URL as given, or { companyName, country } for a name lookup.
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan | skipped_unmetered
chargedbooleanCharged
Whether this record incurred a company-profile charge (paid add-ons charged for it are listed in chargedAddOns).
chargedEventstringCharged event
company-profile (present only when charged).
chargedCountintegerEvents charged
Events actually charged when the charge came back short (present only then).
chargedAddOnsarrayCharged add-ons
Paid add-on events charged for this record (company-name-lookup, linkedin-firmographics), also when the profile itself was not found or not charged; present only when one was charged.
sourcestringSource
Upstream data sources.
fetchedAtstringFetched at
ISO timestamp.
errorobjectError
{ code, message, provider?, status? } when status is not ok: invalid_domain, domain_not_found, site_blocked, page_not_found, http_error, website_not_found, name_lookup_paid_plan, budget_exhausted, plus the runtime codes (budget_exhausted, free_plan_limit, unmetered, aborted, charge_failed, record_too_large, invalid_record, dataset_push_failed) and upstream codes (auth, insufficient_credits, rate_limit, timeout, network, server, client, invalid_response, not_found).
warningsarrayWarnings
Sections that failed or were skipped, pages that could not be read, add-on notes.
inputTypestringInput type
domain or company_name.
domainstring | nullDomain
Registrable domain of the company (apify.com); for a site on a shared platform domain the site's own host (acme.myshopify.com), whose DNS and RDAP sections are then skipped.
websitestring | nullWebsite
Final homepage URL after redirects.
companyNamestring | nullCompany name
Name from JSON-LD, og:site_name or the page title.
legalNamestring | nullLegal name
Legal name published in JSON-LD (legalName), else the registered name in the imprint or footer text.
legalNameSourcestring | nullLegal name source
Where legalName comes from: json-ld, imprint or website_text (null without a legal name).
alternateNamestring | nullAlternate name
JSON-LD alternateName.
descriptionstring | nullDescription
JSON-LD description, else the meta description.
sloganstring | nullSlogan
JSON-LD slogan.
logostring | nullLogo
Logo URL from JSON-LD.
faviconstring | nullFavicon
Declared favicon URL.
ogImagestring | nullShare image
og:image URL.
languagestring | nullLanguage
Homepage language (html lang).
countrystring | nullCountry
ISO 3166-1 alpha-2 country of the company.
countrySourcestring | nullCountry source
json-ld, vat_number, registration_number, input, tld, phone or lei.
foundedYearinteger | nullFounded
Founding year.
foundedYearSourcestring | nullFounded source
json-ld or website_text.
employeesobject | nullEmployees
{ min, max } from JSON-LD numberOfEmployees.
addressesarrayAddresses
{ formatted, street, city, region, postalCode, country, source } from JSON-LD, <address> elements and microdata.
emailsarrayEmails
{ email, sourcePage, isOwnDomain, verdict, settled, role, freeProvider, disposable, typoSuggestion }: addresses published on the site, own domain first, with the local pre-check verdict (no mailbox verification).
phonesarrayPhones
{ number (E.164), valid, country, type, source } from tel: links and JSON-LD.
socialsobjectSocial profiles
linkedin, x, facebook, instagram, youtube, tiktok, pinterest, github (null when not linked).
techStackarrayTech stack
{ name, slug, categories, version, confidence, evidence, website } detected on the pages, the TLS issuer and DNS.
techSummaryobjectTech summary
cms, ecommercePlatform, analytics, tagManagers, advertising, marketingAutomation, crm, liveChat, paymentProcessors, hosting, cdn, webServer, javascriptFrameworks.
saasFromDnsarraySaaS seen in DNS
Services verified in DNS records (TXT verification tokens, MX, SPF includes, NS, CNAMEs).
mailProviderstring | nullMail provider
Mailbox provider from MX (Google Workspace, Microsoft 365, …).
mxarrayMX hosts
Mail exchangers by preference.
emailSendersarrayE-mail senders
Services allowed to send the domain's mail (SPF includes).
spfobject | nullSPF
{ record, allQualifier, includes }.
dmarcobject | nullDMARC
{ record, policy, subdomainPolicy, pct, reports }.
emailSecurityScoreinteger | nullE-mail security score
0–100 from SPF, DMARC and MX findings.
registrarstring | nullRegistrar
Domain registrar (RDAP).
domainCreatedAtstring | nullDomain created
Registration date (RDAP).
domainAgeDaysinteger | nullDomain age (days)
Days since registration.
domainExpiresAtstring | nullDomain expires
Expiry date (RDAP).
sslIssuerstring | nullSSL issuer
TLS certificate issuer.
sslDaysLeftinteger | nullSSL days left
Days until the TLS certificate expires.
sslValidboolean | nullSSL valid
The certificate is trusted, unexpired and covers the host.
hiringobject | nullHiring
{ ats, atsName, boardToken, boardUrl, detectedBy, openJobs, complete, jobsRead, departments[], locations[], remoteShare, postedLast30Days, newestPostedAt, sampleTitles[] }.
identifiersobjectIdentifiers
{ lei, leiRecord, secCik, ticker, exchange, secRecord, vatNumber, vatNumbers[], registrationNumbers[], duns, naics }.
ecommerceobjectE-commerce
{ isStore, platform, myshopifyDomain, currency, publishedProducts, shipsToCountries }.
websiteSignalsobjectWebsite signals
{ https, hsts, hasPricingPage, hasBlog, hasCareersPage, hasLogin, hasContactPage, copyrightYear, staleSite, lastModified, generator, jsonLdTypes, cms, ecommercePlatform }.
linkedinobject | nullLinkedIn
LinkedIn company data (add-on): url, name, industry, companySize, employeeCountRange, employeesOnLinkedin, followerCount, headquarters, founded, companyType, specialties, description, website, fundingRounds, lastFundingRound.
nameLookupobjectName lookup
For companyNames: { query, country, domain, candidates[], verification }.
pagesFetchedintegerPages read
Website pages read (homepage included).
pagesarrayPages
{ kind, url, status } of each page read.
sourcesarraySources
Pages read, dns, rdap, the job board, GLEIF and EDGAR links.
sectionsobjectSections
State of each part: website, dns, domain, tls, hiring, lei, sec, linkedin: ok | not_found | error | skipped | timeout (dns and domain are skipped for a site on a shared platform domain).
Example record
Example record
{
  "input": "apify.com",
  "inputType": "domain",
  "domain": "apify.com",
  "website": "https://apify.com/",
  "companyName": "Apify",
  "legalName": "Apify Technologies s.r.o.",
  "legalNameSource": "json-ld",
  "description": "Thousands of tools to automate your business. Get real-time web data, track competitors, generate leads, and integrate your apps and AI agents.",
  "logo": "https://apify.com/img/apify-logo/apify-symbol-200x200.svg",
  "favicon": "https://apify.com/favicon.ico",
  "language": "en",
  "country": "CZ",
  "countrySource": "json-ld",
  "foundedYear": 2015,
  "foundedYearSource": "json-ld",
  "addresses": [
    {
      "formatted": "Na Příkopě 959/27, 11000 Prague, CZ",
      "street": "Na Příkopě 959/27",
      "city": "Prague",
      "region": null,
      "postalCode": "11000",
      "country": "CZ",
      "source": "json-ld"
    }
  ],
  "emails": [
    {
      "email": "support@apify.com",
      "sourcePage": "https://apify.com/",
      "isOwnDomain": true,
      "verdict": "role",
      "settled": false,
      "role": true,
      "freeProvider": false,
      "disposable": false,
      "typoSuggestion": null
    }
  ],
  "phones": [],
  "socials": {
    "linkedin": "https://linkedin.com/company/apify",
    "x": "https://x.com/apify",
    "facebook": null,
    "instagram": null,
    "youtube": null,
    "tiktok": "https://www.tiktok.com/@apifytech",
    "pinterest": null,
    "github": "https://github.com/apify"
  },
  "techStack": [
    {
      "name": "Next.js",
      "slug": "next-js",
      "categories": [
        "Web frameworks",
        "Web servers"
      ],
      "version": null,
      "confidence": 100,
      "evidence": [
        "scriptSrc",
        "header"
      ],
      "website": "https://nextjs.org"
    }
  ],
  "techSummary": {
    "cms": null,
    "ecommercePlatform": null,
    "analytics": [
      "Mixpanel"
    ],
    "tagManagers": [],
    "advertising": [],
    "marketingAutomation": [
      "HubSpot"
    ],
    "crm": [
      "Intercom"
    ],
    "liveChat": [
      "Intercom"
    ],
    "paymentProcessors": [],
    "hosting": [
      "Amazon Web Services"
    ],
    "cdn": [
      "Amazon Cloudfront"
    ],
    "webServer": "Next.js",
    "javascriptFrameworks": [
      "React"
    ]
  },
  "saasFromDns": [
    "Google Workspace",
    "HubSpot",
    "Mailgun",
    "Amazon SES",
    "Google Search Console",
    "Zapier"
  ],
  "mailProvider": "Google Workspace",
  "mx": [
    "aspmx.l.google.com",
    "alt1.aspmx.l.google.com"
  ],
  "emailSenders": [
    "Google Workspace",
    "Mailgun",
    "Amazon SES",
    "HubSpot"
  ],
  "spf": {
    "record": "v=spf1 a mx include:_spf.google.com include:mailgun.org include:amazonses.com -all",
    "allQualifier": "-all",
    "includes": [
      "_spf.google.com",
      "mailgun.org",
      "amazonses.com"
    ]
  },
  "dmarc": {
    "record": "v=DMARC1; p=reject; sp=reject; pct=100; rua=mailto:dmarc-reports@apify.com",
    "policy": "reject",
    "subdomainPolicy": "reject",
    "pct": 100,
    "reports": true
  },
  "emailSecurityScore": 100,
  "registrar": "Amazon Registrar, Inc.",
  "domainCreatedAt": "2009-06-02T17:14:10Z",
  "domainAgeDays": 6343,
  "domainExpiresAt": "2035-06-02T17:14:10Z",
  "sslIssuer": "Amazon",
  "sslDaysLeft": 63,
  "sslValid": true,
  "hiring": {
    "ats": "ashby",
    "atsName": "Ashby",
    "boardToken": "apify",
    "boardUrl": "https://jobs.ashbyhq.com/apify",
    "detectedBy": "website",
    "openJobs": 11,
    "complete": true,
    "jobsRead": 11,
    "departments": [
      {
        "name": "Engineering",
        "count": 8
      },
      {
        "name": "GTM",
        "count": 2
      }
    ],
    "locations": [
      {
        "name": "Prague",
        "count": 8
      }
    ],
    "remoteShare": 0,
    "postedLast30Days": 3,
    "newestPostedAt": "2026-10-14T16:14:26.368Z",
    "sampleTitles": [
      "Platform Reliability Engineer",
      "Senior Backend Engineer, Billing"
    ]
  },
  "identifiers": {
    "lei": "315700DHB47UOCE2LE29",
    "leiRecord": {
      "lei": "315700DHB47UOCE2LE29",
      "legalName": "Apify Technologies s.r.o.",
      "country": "CZ",
      "jurisdiction": "CZ",
      "entityStatus": "ACTIVE",
      "registrationStatus": "ISSUED",
      "legalFormCode": "9HLU",
      "registeredAs": "04788290",
      "entityCreationDate": "2016-02-14T23:00:00Z",
      "headquartersCity": "Praha",
      "matchedBy": "registry_id",
      "matchScore": 1,
      "gleifUrl": "https://search.gleif.org/#/record/315700DHB47UOCE2LE29"
    },
    "secCik": null,
    "ticker": null,
    "exchange": null,
    "secRecord": null,
    "vatNumber": "CZ04788290",
    "vatNumbers": [
      {
        "vatNumber": "CZ04788290",
        "country": "CZ",
        "formatValid": true,
        "source": "json-ld"
      }
    ],
    "registrationNumbers": [],
    "duns": null,
    "naics": null
  },
  "ecommerce": {
    "isStore": false,
    "platform": null,
    "myshopifyDomain": null,
    "currency": null,
    "publishedProducts": null,
    "shipsToCountries": null
  },
  "websiteSignals": {
    "https": true,
    "hsts": true,
    "hasPricingPage": true,
    "hasBlog": true,
    "hasCareersPage": true,
    "hasLogin": true,
    "hasContactPage": true,
    "copyrightYear": 2026,
    "staleSite": false,
    "lastModified": null,
    "generator": null,
    "jsonLdTypes": [
      "Organization",
      "WebSite",
      "SoftwareApplication"
    ],
    "cms": null,
    "ecommercePlatform": null
  },
  "linkedin": null,
  "pagesFetched": 4,
  "pages": [
    {
      "kind": "home",
      "url": "https://apify.com/",
      "status": 200
    },
    {
      "kind": "contact",
      "url": "https://apify.com/contact",
      "status": 200
    },
    {
      "kind": "careers",
      "url": "https://apify.com/jobs",
      "status": 200
    },
    {
      "kind": "about",
      "url": "https://apify.com/about",
      "status": 200
    }
  ],
  "sources": [
    "https://apify.com/",
    "https://apify.com/contact",
    "https://apify.com/jobs",
    "https://apify.com/about",
    "dns",
    "rdap",
    "https://jobs.ashbyhq.com/apify",
    "https://search.gleif.org/#/record/315700DHB47UOCE2LE29"
  ],
  "sections": {
    "website": "ok",
    "dns": "ok",
    "domain": "ok",
    "tls": "ok",
    "hiring": "ok",
    "lei": "ok",
    "sec": "not_found",
    "linkedin": "skipped"
  },
  "status": "ok",
  "charged": true,
  "chargedEvent": "company-profile",
  "source": "website+dns+registries",
  "fetchedAt": "2026-10-15T09:00:00.000Z"
}

FAQ

Questions

Where does the data come from?
Live from public sources at run time: the company's own website (up to 4 pages: the homepage plus its contact, imprint, careers and about pages), its DNS records (MX, SPF, DMARC, verification TXT records, CNAMEs of common subdomains), RDAP domain registration data, its TLS certificate, the public job-board APIs of applicant tracking systems (Greenhouse, Lever, Ashby and 8 more), GLEIF (LEI register) and SEC EDGAR. Nothing comes from a stored database, so a profile is as fresh as the website.
How are LEI and SEC identifiers matched?
Conservatively: an LEI published on the site wins; then a register number or a VAT number published on the site that GLEIF knows; then an exact legal name. A brand name alone matches only when exactly one active entity has that name (in the company's country when known). The SEC registrant is matched on the exact company name in EDGAR's list of listed companies, and rejected when EDGAR records a website on another domain. Each match carries matchedBy and matchScore.
Can I enrich a company name instead of a domain?
Yes, on paid plans: put names in companyNames (optionally "Name | country code"). Each name costs one search ($0.0045, company-name-lookup, charged whether or not a website is found, and listed in the record's chargedAddOns); the best candidates' homepages are compared with the name (the site's own name, its domain or Google's knowledge-graph title must match), and the profile ($0.005) is charged only when the website was confidently found and read. Passing the domain is cheaper and exact.

Machine-readable

This page for agents