Finnish Company Scraper - Y-tunnus, Email & Phone + PRH avatar

Finnish Company Scraper - Y-tunnus, Email & Phone + PRH

Pricing

$9.00 / 1,000 per finnish company row returneds

Go to Apify Store
Finnish Company Scraper - Y-tunnus, Email & Phone + PRH

Finnish Company Scraper - Y-tunnus, Email & Phone + PRH

Finnish B2B leads from company websites' statutory § 176 block — Y-tunnus (mod-11 checked), email, phone, address, ALV-numero, e-invoice address — verified in the PRH/YTJ register. Or discover companies in PRH by town, TOL code and form and read their sites. $9 per 1,000 rows.

Pricing

$9.00 / 1,000 per finnish company row returneds

Rating

0.0

(0)

Developer

Scrapers Delight

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Finnish Company Scraper — Y-tunnus, Email & Phone + PRH

Turn Finnish company websites into verified B2B leads. For each site, this Actor reads the contact and registration details Finnish companies publish on their websites, and returns them as one clean row: company name, Y-tunnus (check digit verified), email, phone, address, ALV-numero and e-invoice address (verkkolaskuosoite). Each Y-tunnus is then looked up in the PRH/YTJ register, the official Finnish company register.

Or start from the register itself. Discover companies in PRH by town, TOL business line, company form, post code or registration date, and the Actor reads each company's registered website for the email and phone that PRH does not hold.

  • No login, no API key, no browser. Plain HTTP, sent directly from Apify's network.
  • Pay only for rows you get: $9 per 1,000 rows. Dead, blocked, parked or empty websites are never billed. Neither is a website that belongs to a different company.
  • Measured, not claimed. Every number in this README comes from a real run on real Finnish company websites, including websites held out from development. The run IDs are in the SIGNOFF.

📚 Where the data comes from

  • Company websites: the contact and registration block Finnish companies publish, usually in the footer, on yhteystiedot, on toimitusehdot or in the tietosuojaseloste.
  • PRH / YTJ register: the Finnish company register's open data at avoindata.prh.fi (source: Patentti- ja rekisterihallitus, PRH). PRH holds no email and no phone number for any company — those come only from the website.

🔍 What it does

Mode 1: domain list (you already have websites)

For each website:

  1. It fetches the homepage and reads the footer. On the probe, the footer was where the Y-tunnus was found most often.
  2. It reads the homepage's JSON-LD structured data. This costs nothing extra.
  3. It ranks the site's own links using Finnish rules and fetches the best 1–2 pages: yhteystiedot, laskutustiedot, then toimitusehdot / tilausehdot, then tietosuojaseloste, then yritys / meistä. Swedish and English pages are covered too.
  4. It falls back to the XML sitemap and the WordPress page index, only when the footer offered no candidate link.
  5. It merges up to 3 pages field by field. Every field records the URL of the page it came from.
  6. It validates the Y-tunnus check digit and looks the number up in PRH.

Mode 2: PRH register discovery (you want new companies)

  1. It queries PRH with your filters and pages through every result. It checks that the number of companies collected matches the register's own totalResults. A short sweep is a failure, not a smaller register.
  2. It drops housing / property companies (on by default) and inactive companies (on by default).
  3. It takes each remaining company's registered website and reads it exactly as in mode 1.
  4. It bills a row only if the company's own website gave a Y-tunnus, VAT number, email or phone. A register row with no website, or a dead one, is never billed. With "Include unbilled miss rows" on, those rows are still delivered, free, with the full register block.
  5. If the website's block names a different company (for example a property manager's website listed by a client company), the row is not billed. The website's Y-tunnus and the register's are both shown.

📦 What you get: every field

Contact (from the website)

fieldwhat it is
emailbest email, preferring the company's own domain
emails[]up to 10 emails. Platform, hosting-agency and regulator addresses (e.g. @om.fi, @zoner.fi) are removed, including their www./subdomain forms
emailConflictset when the best email is on a different domain that is not a free-mail provider (e.g. a group or agency address)
phone, phones[]E.164 (+358…). Dates, clock times ("09.00–17.00"), Y-tunnus shapes, postcodes and regulator switchboards are rejected
registeredOffice (+ …Postcode, …City), addressLine, postcode, cityaddress. The postcode must exist in PRH's own 4,348-code postcode table and the town after it must be that postcode's post office
socialLinks[]LinkedIn / Facebook / Instagram / X / YouTube / TikTok profiles
officerName, officerRolea named toimitusjohtaja / yhteyshenkilö (rare, see limits)
termsUrl, privacyPolicyUrltoimitusehdot / tietosuojaseloste URLs

Identifiers (from the website)

fieldwhat it is
businessIdthe Y-tunnus as printed, normalised to NNNNNNN-C (only separators change, no digit is ever added or altered)
businessIdChecksumValidthe mod-11 check digit (weights 7,9,10,5,8,4,2). A number printed with a wrong check digit is shipped as printed and flagged false, never "repaired"
businessIdSourcelabel / legal-form / label-loose / bare / json-ld
businessIdsOnPage[]every checksum-valid Y-tunnus in the site's disclosure text (group sites print several)
vatNumber, vatNumberValidALV-numero (FI + 8 digits) as printed, with the same mod-11 check on its digits
vatMatchesBusinessIdcompares the printed VAT number with the printed Y-tunnus. Neither is ever derived from the other
eInvoiceAddress, eInvoiceOperator, eInvoiceOperatorIdthe verkkolaskuosoite (OVT 0037… or IBAN), the e-invoice operator and its välittäjätunnus, exactly as printed
eInvoiceAddressMatchesBusinessIdwhether the OVT address carries the company's own Y-tunnus digits
kotipaikkathe registered municipality, when printed
inLiquidation, liquidationStatementthe site says selvitystila / konkurssi / yrityssaneeraus
companyName, registeredName, tradingName, legalFormname and legal form (Oy, Oyj, Ky, Ay, Osuuskunta, Tmi, ry…)

Register (from PRH, joined on the Y-tunnus)

registerBusinessId, registerName, registerAuxiliaryNames[], registerCompanyForm (+ Finnish, + type code), registerBusinessLineCode / registerBusinessLine (+ Finnish, TOL 2025), registerRegistrationDate, registerBusinessIdDate, registerStatus, registerTradeRegisterStatus, registerSituations[] (liquidation / bankruptcy / re-organisation), registerVatRegistered, registerEmployerRegistered, registerPrepaymentRegistered, registerVisitingAddress, registerPostalAddress, registerPostCode, registerCity, registerWebsite, registerLastModified, registerRecordUrl, ytjUrl, registerSource.

Cross-checks (the wedge: no rival ships these)

fieldmeaning
registerLookupStatusfound / not-in-register / lookup-error / register-row (mode 2)
businessIdMatchesRegisterthe website's Y-tunnus = the register row's
registerIdPrintedOnSitethe register's Y-tunnus appears anywhere in the site's disclosure
registerNameAgreesthe website's name and the PRH name (or an auxiliary name) refer to the same company
registerWebsiteMatchesDomainthe website PRH has on file is this domain
redirectedToOtherDomainthe site redirected to a different registrable domain

Provenance

status, missReason, mode, domain, inputUrl, resolvedUrl, disclosureUrl, disclosureSource, discoveryChannel, pagesParsed, pagesChecked, fieldCount, fieldSources (the page URL for every field), stableId, fetchedAt.


📊 Measured results

Two sampling frames, 480 real Finnish websites (development probe)

Field-level accuracy doesn't depend on how the sites were sampled. Population rates do, so they were measured on two samples with opposite biases:

  • A: websites listed in PRH, from random register pages across 12 municipalities. This leans toward registered companies.
  • B: the Tranco .fi tail (rank 300k–1M). This leans toward busier sites, including associations and public bodies.
A: PRH websitesB: Tranco .fi
sampled240240
live195205
Y-tunnus found46.7% of live41.0% of live
email found80.0%75.1%
phone found71.3%62.9%
any contact or ID83.6%84.9%

Held-out platform run: 399 domains never looked at during development

Run on the shipping build 0.1.3, 1,024 MB, default settings.

A: PRH websites (239)B: Tranco .fi (159)
billed rows9957
billed, % of live51.6%41.0%
dead host / parked / blocked34 / 6 / 79 / 1 / 10

Expect roughly 41–52% of live Finnish websites to become a billed row, depending on your list. A list of registered companies' own sites sits at the top of that range.

Field fill on the 156 billed rows (delivered 156 = charged 156):

businessId 95.5% (checksum-valid in 148 of 149) · email 92.3% · phone 84.6% · name 84.0%
addressLine 75.6% · registeredOffice 68.6% · e-invoice address 17.9% · ALV-numero 9.0%
kotipaikka 3.8% · officerName 0.6%
PRH register block 89.7% (140 found, 8 not in the trade register) · website name agrees with PRH 125/140

A found Y-tunnus that is not-in-register does not mean the number is fake. The PRH open-data API covers the trade register. Associations (ry), public bodies and some foundations have valid Y-tunnukset but are outside it. All 8 cases on the held-out run were of that kind (metsakeskus.fi, mela.fi, studyinfinland.fi, sey.fi …).

Register discovery, measured

runqueryPRH rows readwith an active, usable websitebilledbilled / websites read
1Tampere / Oulu / Turku × TOL 43220, 62010, 69201 × OY702 (floor-asserted: 9/9 sweeps collected = totalResults)212170 (+6 group-site duplicates, unbilled)80.2%
2Helsinki … × 43220, 69201, 62100, 71121 × OY, cap 300 rows1,572525300 (cap)71.1% of 422 read

On the billed register rows: email 89.0–91.8%, phone 90.7–94.1%, register block 100%. 60–62% of PRH companies list no website at all. Those rows are never billed.

How you can tell the gaps are real, not parser misses

The offline suite runs the shipped parser over 400 real sites, captured live from both frames: 56,495 assertions, 0 failures.

  • Label → value: every one of the 151 domains whose text puts a Y-tunnus label right before a valid Y-tunnus emitted it (151/151, 100%). A Y-tunnus that is missing from a row is missing from the site.
  • The negative direction: a Y-tunnus that belongs to a third party is never emitted as the company's. Seven sites printed only payment providers' or e-invoice operators' numbers ("Paytrail Oyj (2122839-7)", "Visma Pay, Paybyway Oy, y-tunnus 2486559-4"), and all seven were correctly refused.
  • No repair, ever: all 12,456 single-digit mutations of the 173 real Y-tunnukset in the corpus were fed back. 0 were "corrected" into a different number.
  • Newline weld: two digit runs from different page elements are never joined into one Y-tunnus or phone number.

A real row, from the held-out run

{
"status": "ok", "mode": "domains", "domain": "sunhoiva.fi",
"disclosureUrl": "https://www.sunhoiva.fi/yhteystiedot",
"companyName": "SunHoiva Hoitopalvelut Oy", "legalForm": "Osakeyhtiö (Oy)",
"businessId": "3276381-1", "businessIdChecksumValid": true, "businessIdSource": "label",
"email": "info@sunhoiva.fi", "phone": "+358503250127",
"registeredOffice": "33540 Tampere", "postcode": "33540", "city": "Tampere",
"eInvoiceAddress": "003732763811", "eInvoiceAddressMatchesBusinessId": true,
"privacyPolicyUrl": "https://www.sunhoiva.fi/tietosuojaseloste",
"registerName": "SunHoiva Hoitopalvelut Oy", "registerCompanyForm": "Limited company",
"registerBusinessLineCode": "78200",
"registerBusinessLine": "Temporary employment agency activities and other human resource provisions",
"registerStatus": "Valid", "registerTradeRegisterStatus": "Registered",
"registerVatRegistered": true, "registerEmployerRegistered": true,
"registerVisitingAddress": "Takojankatu 1c B 13, 33540 TAMPERE",
"registerLookupStatus": "found", "businessIdMatchesRegister": true, "registerNameAgrees": true,
"ytjUrl": "https://tietopalvelu.ytj.fi/yritys/3276381-1"
}

(Excerpt: the real row also carries emails[], phones[], socialLinks[], fieldSources and the rest of the register block.)


🧰 Inputs

Domain-list mode: domains[] (bare domain, homepage URL or direct page URL; any TLD) · startUrls · sourceDatasetId + domainFieldName (reads domain/website/verkkosivut/kotisivu/www automatically) · domainsFileUrl (CSV/TXT/JSON/JSONL) · verifyAgainstRegister (default on) · requireRegisterMatch.

Register mode: registerLocations[] · registerBusinessLines[] · registerCompanyForms[] (OY, OYJ, KY, AY, OK, …) · registerPostCodes[] · registerName · registerRegisteredFrom / …To · maxRegisterCompanies (default 2,000 PRH rows read) · excludeHousingCompanies (default on) · onlyActiveCompanies (default on). Every combination of the lists is one PRH query.

Business-line codes are TOL 2025. PRH moved to the new Statistics Finland classification on 2026-01-01. Measured in Tampere: 62100 (computer programming, TOL 2025) matches 813 companies, while the old TOL 2008 62010 matches 10 that were never reclassified. A code shorter than five digits is applied as a true prefix, because PRH matches short codes as a substring (measured: 62 returned 86230 and 46220).

Both modes: maxItems (billed-row cap, default 1,000) · maxDomains · skipDomains[] / previousDatasetId (never re-buy a company) · requireBusinessId / requireContact / requireEmail / excludeLiquidation / minFieldsRequired · emailPolicy (all / role-only / exclude-role) · dedupeBy (Y-tunnus, else domain) · discoveryChannels · maxPagesParsed (3) · perDomainTimeoutSecs (60) · requestConcurrency (10) · includeMissRows · includeFieldSources (on) · flattenOutput · renderJsPages (off) · proxy settings.

Transport: by default, requests go out directly with no proxy. On the held-out run, only 40 of 1,347 requests were refused. A block triggers one retry through Apify RESIDENTIAL (Finland), which recovered 5 of 35. Supply your own proxy to route everything through it.


💰 Pricing

$0.009 per row delivered ($9 per 1,000). One pay-per-event charge, company-contact-scraped. There is no start fee. The row is delivered and billed in the same step, so you're never billed for a row you didn't get.

Never billed: dead hosts · blocked sites · parked domains · sites that publish nothing · websites that belong to another company · register rows without a usable website · duplicates · rows your own filters removed · coverage rows.

An empty {} input runs the built-in 10-site demo and bills 10 rows ($0.09).


❓ FAQ

Why not just export PRH? PRH has no email or phone number for any company. Several store actors export the register; this one adds the website contact and checks it against the register.

Is the Y-tunnus the same as the VAT number? The FI VAT number is "FI" plus the Y-tunnus digits without the hyphen, but a company having a Y-tunnus does not make it VAT-registered. The Actor never derives one from the other. It reports each as printed and compares them only when both are printed. Whether the company is VAT-registered is a separate field, registerVatRegistered, taken from the register.

What is other_company? Register mode found the company's website, but the website names a different company (typically a property manager, or a client of an accounting firm) and not the register company. It's unbilled and shows both Y-tunnukset. A group website that prints the parent's Y-tunnus but agrees on the name is billed once per website. The other subsidiaries that list the same site appear as unbilled duplicates.

Sole traders (toiminimi)? A toiminimi's Y-tunnus is a business ID, not a personal identity number, so it's delivered like any other. Its name is often the owner's name.


⚠️ Honest limits

  • Roughly half of live Finnish sites print no Y-tunnus (41–47% of live sites do, across two frames). The 151/151 label check shows this is the sites' own compliance, not the parser.
  • kotipaikka fills at 1.7–3.9% and officerName at 0.6–1%. Finnish sites rarely print either.
  • registeredOffice is sometimes postcode + town only ("33540 Tampere"), when the site prints no street. The register block's registerVisitingAddress usually has the full address.
  • In register mode, 60–62% of PRH companies list no website, and newly registered companies almost never do (8% of 500 Helsinki companies registered since 2026-06-01). Location-only queries are dominated by housing companies. Add a business line or company form.
  • Client-rendered sites are not rendered by default. The Chromium rung is wired in (renderJsPages, needs ≥1,536 MB). On the Swedish sibling it added a few per cent more rows at 3–4× the compute per website.
  • About 14% of the websites PRH has on file no longer resolve (34 of 239 held-out frame-A hosts). They're reported as unreachable and never billed.
  • ytjUrl follows YTJ's web-UI route. That UI is rendered by JavaScript (every route returns the same page shell to a plain request), so the machine-verifiable link is registerRecordUrl, which is PRH's API record.