Portuguese NIPC Scraper - Company Data & Contacts avatar

Portuguese NIPC Scraper - Company Data & Contacts

Pricing

$1.70 / 1,000 per portuguese company disclosure returneds

Go to Apify Store
Portuguese NIPC Scraper - Company Data & Contacts

Portuguese NIPC Scraper - Company Data & Contacts

Turn Portuguese company domains into B2B leads from each site's statutory art. 171 CSC block: firma, legal form, sede, conservatória, mod-11-checked NIPC, capital social, VAT, email and phone. Charged only for rows with a statutory identifier. $1.70 per 1,000 companies.

Pricing

$1.70 / 1,000 per portuguese company disclosure returneds

Rating

0.0

(0)

Developer

Scrapers Delight

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

4 days ago

Last modified

Share

🇵🇹 Portuguese NIPC Scraper — Firma, NIPC, Sede, Capital Social & Contacts

Paste a list of Portuguese company websites and get back one registry-grade B2B lead per company, read off the statutory block every Portuguese company must print on its own website: the firma (registered name), the legal form, the sede (registered office), the conservatória, the NIPC checked with the official mod-11 check digit, the capital social, the VAT number, and the company's email and phone — each with the URL it was found on.

  • Contact fields first: on held-out Portuguese business lists, 89.9–94.8 % of billed rows carry an email and 77.8–88.3 % a phone number.
  • The identifier is real: 89.9–93.5 % of billed rows carry an NIPC, every one mod-11-valid and printed on the page. Cross-checked against the European Commission's VIES service, 148 of 156 were active VAT registrations, and the registered name VIES returned agreed with the firma we read on 111 of 114 comparable rows.
  • You pay only for a statutory row. $1.70 per 1,000 companies. A dead site, a walled site, a site that prints no statutory block, a contact-only page and a sole trader's personal NIF are never charged.

🏛️ Where the data comes from

Portuguese companies are required to print their firma, legal form, sede, conservatória, NIPC and capital social on their own websites. The Actor finds that block on each site and reads it.


🔍 What it does, per domain

  1. Fetches the homepage — directly from Apify's network — and reads its footer and its JSON-LD (taxID / vatID / legalName). Some companies print SEDE: … | NIF: 500 674 205 on every page.
  2. Ranks the site's own same-site links with Portuguese labels taken from real Portuguese footers — Ficha Técnica, Informação Legal, Aviso Legal > Termos e Condições, Condições Gerais > Quem Somos, Sobre Nós > Política de Privacidade, Proteção de Dados > Resolução Alternativa de Litígios > Contactos — and merges up to three of those pages field by field. This is where the block lives: on the held-out lists, 74 of 77 and 94 of 99 billed rows were found on a subpage, not the homepage.
  3. XML sitemap and the WordPress page index — only when the footer offered no candidate link at all.
  4. Parses every field inside a statement window anchored on a statutory phrase (NIPC, NIF, pessoa colectiva, matrícula, conservatória, capital social, com sede na …), never by a page-wide scan — a Portuguese NIPC and a Portuguese phone number are both nine digits, so a page-wide scan would read one as the other.
  5. Validates and refuses: a number that fails mod 11 is refused; a personal NIF is withheld; a foreign register number is refused; nothing is ever repaired, completed or guessed.

A site that blocks a direct request (403 / challenge / connection reset) is retried on Apify RESIDENTIAL exit nodes in Portugal, with a fresh session per attempt. Dead hosts and 404s are never retried.


📦 What you get — every field

Identity

FieldWhat it is
registeredNameThe firma as printed — "Sublinhar, Lda.", "Modelo Continente Hipermercados, S.A." — read from the statement that carries the NIPC, preferring the name nearest the number.
legalFormSociedade por quotas (Lda.) · Unipessoal Lda. · S.A. · SGPS, S.A. · Cooperativa (CRL) · EIRL · ACE · Sucursal — from the firma's suffix or the statement's own words.
entityKindIndicatedThe entity class the NIPC's prefix indicates (5 = pessoa colectiva, 6 = public administration, 9x = condomínio / sociedade irregular / não residente …). An indication from the number's range, not a registry fact.
companyNameregisteredName, else the JSON-LD name, else og:site_name.
tradingNameA brand stated as operated by the firma, when it differs from the firma.

Registry — the statutory core

FieldWhat it is
companyNumberThe NIPC — nine digits, canonicalised (separators removed), exactly as printed.
companyNumberFormatted508 225 531.
companyNumberRawThe digits as they appeared on the page.
companyNumberChecksumValidAlways true on a delivered NIPC — an invalid one is never emitted.
companyNumberSourcelabel (NIF / NIPC / pessoa colectiva / contribuinte …), matricula, label-en, label-loose (checksum-gated), json-ld, or bare (an unlabelled 3-3-3 run in a statement, prefix 5 only).
registeredOffice · registeredOfficePostcode · registeredOfficeCityThe sede. Postcode NNNN-NNN and localidade when printed; a sede printed without a postcode is kept as printed (registeredOfficeSource: clause-no-postcode) with the postcode left empty.
conservatoria · conservatoriaLocality"Conservatória do Registo Comercial de Coimbra" / "C.R.C. de Lisboa", as printed.
matriculaNumber · matriculaIsNipcThe matrícula number. Since 2006 it is the NIPC ("número único de matrícula e de pessoa colectiva") — matriculaIsNipc says so.
capitalSocial · capitalSocialEur · capitalFullyPaidStated"€66.000,00" as printed, 66000 as a number ("150 mil euros" → 150000), and whether "integralmente realizado" is stated.
inLiquidation · liquidationStatementart. 171's "em liquidação" (and insolvência / PER) when the site says so.
vatNumber · vatNumberValid · vatMatchesNipcA published VAT number (PT + NIF) and its mod-11 result; whether it decomposes to the same NIPC.
derivedVatNumberPT + NIPC — the form the company's VAT number takes if it is VAT-registered.
registerUrlThe European Commission VIES REST lookup for PT + NIPC (JSON: isValid, registered name). There is no free, stable, public per-company page on the Portuguese registry side.
viesStatus · viesName · viesAddressOnly with Cross-check with VIES on: VALID / INVALID / UNAVAILABLE and the name and address VIES holds.

Contact

FieldWhat it is
email · emailsOn-site addresses first. Cloudflare-protected and entity-encoded mailto: addresses are decoded; "(at)", "[at]" and "arroba … ponto" forms too. Regulator and ADR-centre mailboxes (CNPD, CNIACC, CICAP, TRIAVE, Livro de Reclamações, gov.pt …) are dropped, even on free-mail hosts.
phone · phonesE.164 (+351…), fixed, mobile and 707/800/808 numbers. A nine-digit run after a fiscal label is never read as a phone; a regulator's phone printed under its name is dropped.
addressLine · postcode · cityA postal address from the pages read (often the shop or trading address, which may differ from the sede).
livroReclamacoesLinkedWhether the site links the mandatory electronic Livro de Reclamações — a "real, trading, consumer-facing Portuguese business" flag.
socialLinksCompany profiles (LinkedIn, Facebook, Instagram, YouTube, TikTok …); platform help and privacy pages are filtered out.
termsUrl · privacyPolicyUrlThe site's own terms and privacy pages.

Provenance & accounting

domain · inputUrl · resolvedUrl · disclosureUrl (where the block was found) · disclosureSource (homepage / legal-page / merged / homepage-json-ld) · discoveryChannel · pagesParsed · pagesChecked · fieldCount · fieldSources (opt-in: the exact URL of every field) · stableId (the NIPC, else the domain) · status · missReason · fetchedAt · elapsedMs.


👤 Sole traders

A sole trader (empresário em nome individual) prints an individual NIF (prefix 1, 2, 3, 45 or the retired 8 range) rather than an NIPC. Such domains are reported as status: sole_trader and never billed; the number itself is returned only when Include a sole trader's personal NIF is on.


📊 Measured results — real numbers, not claims

The test corpus, two opposite-biased frames

  • Frame A — OpenStreetMap: every office / shop / craft element carrying a website tag inside Portugal's national boundary (mainland, Madeira, Açores): 4,240 hosts — .pt 61.9 %, .com 31.8 % (78 .com.pt), others 6.3 %. Over-represents small high-street traders, many of them sole traders.
  • Frame B — Tranco top-1M, .pt tail (rank ≥ 200,000): traffic-ranked, over-represents larger companies with modern sites.
  • A stable hash split (md5(domain) % 5) held out 300 OSM and 283 Tranco domains that were never looked at while the parser was written.

What the held-out domains returned (build 0.1.6, shipping defaults)

A — OSM businessesB — Tranco .pt
domains300283
billed rows77 — 25.7 % (32.1 % of reachable)99 — 35.0 % (39.6 % of reachable)
contact details only, no statutory block (not billed)10358
no statutory block at all (not billed)5892
sole trader, personal NIF (not billed)20
host dead (not billed)4111
blocked on every rung (not billed)1922
duplicate company (not billed)01
delivered == charged77 == 7799 == 99

Quote coverage as a range: 25.7–35.0 % of a Portuguese domain list, 32.1–39.6 % of the reachable ones, depending on how many of the list are companies rather than sole traders.

Per-field fill on the billed rows (A / B)

fieldAB
email94.8 %89.9 %
phone88.3 %77.8 %
companyNumber (NIPC)93.5 %89.9 %
registeredName (firma)74.0 %80.8 %
legalForm75.3 %79.8 %
registeredOffice (sede)75.3 %77.8 %
registeredOffice postcode64.9 %65.7 %
livroReclamacoesLinked62.3 %67.7 %
addressLine51.9 %49.5 %
conservatória26.0 %33.3 %
capital social20.8 %27.3 %
matrícula14.3 %13.1 %
VAT number printed9.1 %14.1 %

Fields move between frames; that is why both are printed. The conservatória and capital social are statutory, but most Portuguese sites simply do not print them — see below for how we know it is the sites and not the parser.

How you can tell it is not a parser gap

An independently written detector (a fiscal label, then a nine-digit run that passes an independently written mod 11, in the pessoa-colectiva range) was run over every page the Actor read:

  • development pages (251 domains, captured on the platform): 88 of 88 domains carrying such a label got their NIPC emitted.
  • held-out pages (482 domains, captured on the platform): 150 of 150 — after one fix: the first pass was 149 of 150, because "registada com o número fiscal 505825686" opened no statement window. That anchor was added, the miss re-tested, and the number is quoted as found.

And in the other direction, 50 random unbilled held-out domains were re-crawled far deeper (every legal-, contact- or about-looking same-site link plus ten guessed paths — 723 pages) with the independent detector: 46 of 49 reachable really publish no NIPC anywhere. Of the other three, one listed its member companies' NIPCs (not its own — correctly not attributed), one blocked our subpage requests, and one printed it on a Termos page its homepage never links to.

We never repair a number

Output is a subset of input: every emitted NIPC, VAT number, phone, postcode, conservatória, capital and firma is asserted present in the bytes it came from. Every single-digit mutation of every real NIPC in the test pages (12,555 mutants) was fed back in: a mutant is emitted only when it is itself a valid number (then it is the input); 0 were "repaired" into a different number. A newline between digit groups never welds them into one number; a labelled number that fails mod 11 is refused; placeholders (500000000, 123456789) are refused; a French SIREN and an Australian ACN printed on a Portuguese page are refused.

Cross-checked against the EU's own register of VAT numbers

All 156 NIPCs read on the held-out pages were checked live against the European Commission's VIES: 148 VALID; 8 INVALID — each one mod-11-valid and printed on the site, belonging to entities that are not (or no longer) VAT-active: a political party, dissolved companies. Where both names were present, the VIES name matched the firma we read on 111 of 114; two of the three "mismatches" are abbreviations of the same company (C&P Lda. = Catarina & Pedro Lda.), and one is a real pairing error on a page naming two insurers. Turn on Cross-check with VIES to get this answer on every row (measured on the platform: 23 of 23 checked VALID, 0 unavailable).

Transport

Direct from Apify's network, with a residential retry only on a refusal. Held-out A: 1,115 direct requests, 66 residential (20 recovered); B: 1,218 direct, 154 residential (74 recovered).

A real row (build 0.1.6, held-out frame B)

{
"domain": "bybebe.pt",
"resolvedUrl": "https://www.bybebe.pt/",
"disclosureUrl": "https://www.bybebe.pt/pt/termos-e-condicoes",
"disclosureSource": "legal-page",
"registeredName": "Sublinhar, Lda.",
"legalForm": "Sociedade por quotas (Lda.)",
"entityKindIndicated": "Pessoa colectiva (sociedade, associação ou outra entidade registada no RNPC)",
"companyNumber": "508225531",
"companyNumberFormatted": "508 225 531",
"companyNumberSource": "label",
"companyNumberChecksumValid": true,
"registeredOffice": "bybebé, Rua Brotero, 28 – 3030-317 Coimbra",
"registeredOfficePostcode": "3030-317",
"registeredOfficeCity": "Coimbra",
"conservatoria": "Conservatória do Registo Comercial de Coimbra",
"matriculaNumber": "508225531",
"matriculaIsNipc": true,
"capitalSocial": "€66.000,00",
"capitalSocialEur": 66000,
"inLiquidation": false,
"derivedVatNumber": "PT508225531",
"email": "info@bybebe.com",
"phone": "+351239724592",
"livroReclamacoesLinked": true,
"socialLinks": ["https://www.facebook.com/bybebePT", "https://www.instagram.com/bybebe.pt/", "https://www.tiktok.com/@bybebe.pt"],
"termsUrl": "https://www.bybebe.pt/pt/termos-e-condicoes",
"privacyPolicyUrl": "https://www.bybebe.pt/pt/politica-de-privacidade",
"fieldCount": 17,
"status": "ok"
}

(Abridged for width — the real row also carries the provenance fields and registerUrl; vies* appear only with the VIES option on. VIES, asked the same day: 508225531 → VALID, "SUBLINHAR LDA".)

What to expect from your own list

  • A list of companies (Lda., S.A.) converts best; a list of high-street shops converts at the low end, because many are sole traders with no art. 171 duty.
  • Contact-only sites are common in Portugal (103 of 300 in the OSM frame): the Actor tells you they exist (includeMissRows) but never bills them.

🧰 Every input

InputDefaultWhat it does
domainsdemo batchDomains, homepage URLs or direct legal-page URLs. Any TLD.
startUrls—The same list as URLs (Make / Zapier / Clay / Sheets).
sourceDatasetId + domainFieldName—Enrich a previous Actor's dataset (e.g. a Google Maps or Páginas Amarelas run).
domainsFileUrl—A CSV / TXT / JSON / JSONL list at a URL.
skipDomains · previousDatasetId—Suppression: never re-deliver or re-charge a company you already have.
maxItems1000Hard cap on billed rows.
maxDomains0 (all)Cap on domains attempted.
maxDiscoveryRequestsPerDomain8Requests per domain after the homepage.
maxPagesParsed3Subpages parsed and merged per domain.
perDomainTimeoutSecs · requestTimeoutSecs · maxRequestRetries60 · 25 · 2Budgets; every request and every domain also has a hard deadline.
requestConcurrency10Parallel domains (lowered automatically to what the memory can hold).
discoveryChannelshomepage, anchor, sitemap, wpJsonpathGuess is opt-in (measured: it found 1 extra of 49 unbilled domains).
followWwwAndRootVariants · deepJsDiscovery · respectRobotsTxton · off · offHost variants; JS-bundle link search; robots.txt.
proxyConfigurationdirectYour own proxy for the FIRST attempt, if you want one.
proxyCountry · escalateToResidentialOnBlock · escalateToUnblockerOnBlockPT · on · offThe retry ladder on a refusal.
customUserAgent · extraHttpHeaders—Request identity.
tldFilterMode · tldFilternoneInclude / exclude TLDs (no filter by default — 38 % of the OSM corpus is not .pt).
requireNipc · requireCapitalSocial · requireContact · excludeLiquidation · legalFormFilter · minFieldsRequiredoffQuality filters — a filtered row is never billed.
emailPolicyallall · role-only (info@, geral@) · exclude-role.
dedupeByNIPC, else domainCollapse duplicates before anything is pushed or charged.
validateTaxIdonRun mod 11 on every NIPC / VAT number.
includeSoleTraderNif · extractOfficeroff · offReturn a sole trader's NIF; return a named gerente / administrador.
verifyWithViesoffLive VIES status + registered name per NIPC.
extractSocials · extractPolicyUrls · includeMissRows · includeFieldSources · flattenOutput · saveRawPageson · on · off · off · on · offOutput shape and audit trail (saveRawPages stores every page read, gzipped, in the run's key-value store).

💰 Pricing

$1.70 per 1,000 companies — one disclosure-scraped event ($0.0017) per billed row, no start fee. Delivery and billing are atomic, so a spending cap can never leave you with an unpaid row or charge you for one you did not get.

Never charged: a dead host · a host that refused every rung · a site with no statutory block · a contact-only site · a sole trader's personal NIF · a duplicate · a row your own filters removed · any coverage row.

Compared with the generic EU legal-notice extractors on the store: they list Portugal as a supported format, but their fields are an untyped vatId / registrationNumber modelled on the German Impressum ("e.g. HRB 133604"), their own READMEs say register fields are "richest in German-speaking markets", and they bill contact-page fallback rows. None reads the NIPC with its check digit, the conservatória or the capital social.


❓ FAQ

Does it find Portuguese companies for me? No — it turns a list of domains into company records. Feed it a Google Maps, Páginas Amarelas or directory export via sourceDatasetId.

Is the NIPC the same as the VAT number? The VAT number is PT + the NIF. derivedVatNumber gives that form; only VIES (verifyWithVies) can tell you the company is actually VAT-active.

Why is the conservatória empty on most rows? Because most sites do not print it. The label-present → value-emitted check above (150 of 150) is how we know.

Big retailers? Measured on the platform on 2026-09-23: worten.pt, fnac.pt and decathlon.pt answer 403 on every rung, including residential Portugal; they are reported as blocked and never charged (try your own proxy or the Unblocker toggle). bertrand.pt, which refused our recon from a home IP, delivered a row.

Why no browser? The Swedish sibling measured a real Chromium recovering 3.6–5.0 % more domains at ~4× the cost per domain; this Actor ships plain HTTP only. JavaScript-only shops (e.g. an SPA with no server HTML) are reported as no_disclosure.


⚠️ Data limits

  • Coverage is 25.7–35.0 % of a domain list; most Portuguese sites print either nothing statutory or only contact details.
  • A mod-11-valid NIPC is well formed, not necessarily live: 8 of 156 were not VAT-active in VIES.
  • Name ↔ NIPC pairing is read from the same statement, nearest first; on a page naming two companies it can still pair the wrong ones — measured 1 in 114 against VIES.
  • Capital social 20.8–27.3 %, conservatória 26.0–33.3 %, VAT printed 9.1–14.1 % — what sites print.
  • The sede may be printed without a postcode; it is then kept as printed with no postcode/city.
  • 7.3–8.1 % of live sites refuse even the residential retry (19 of 259 and 22 of 272 on the held-out frames).
  • Guessed paths are off — an unlinked Termos page is missed (1 of 49 unbilled domains in the re-probe).
  • Foreign companies operating in Portugal are delivered with the NIPC of their Portuguese branch when printed; a foreign register number is never emitted as an NIPC.