Skip to content
Internal toolAutomationNode.jsLive

Scrapik: a clean contact list instead of hours of searching

An internal tool that helps prepare and clean a list of business contacts from public sources. The output can be downloaded as CSV or written to Notion.

RoleBrief, design, development
Who forInternal at nkz
SourcesPlaces API, firmy.cz, ARES
Scrapik – the web interface with a live log
The brief

A list you can actually send to

For Walio we need an overview of cafés, restaurants and hairdressers city by city. Searching by hand meant an hour of work for twenty contacts, and much of the data was out of date.

So the brief was not “pull as many addresses as possible” but “give me a list I can use without cleaning it by hand”. Data quality matters more than volume.

What we delivered

Six parts of the tool

Collection through official APIs

We look businesses up through the Google Places API by city district, not by scraping Maps. Responses are cached, so a repeated run does not burn credit.

Finding the e-mail

When a business site has no e-mail, the tool tries another public source, such as firmy.cz. It also reads obfuscated addresses like “info [at] domain”.

Company number and legal form from ARES

For each business it looks up the company number and legal form in the public register. Each entry in the list can then be matched to a specific company.

Validation and cleaning

Placeholders, template sites and mismatched addresses are dropped. An e-mail only passes if the domain has a valid MX record, so no addresses on dead domains stay in the list.

A web interface for a non-technical colleague

A form, a live progress log and a CSV download with the chosen columns. The API key stays on the server; the colleague never sees it.

Writing to Notion

Alongside the CSV, results go straight into a Notion database. Columns are matched by name and the same business is never added twice.

Why this way

Two decisions that keep the data usable

Official APIs, not scraping Maps

We look businesses up through the official Google Places API, not by scraping Maps. It costs more, but the tool does not break with every page change.

An empty field beats a wrong value

An e-mail passes only with a working domain and a match against the business name; the company number is verified by its check digit. E-mail coverage is therefore lower, but the list can be used without manual cleaning.

How it ran

From a script to a tool for the team

Manual collection as the starting point

We used to look contacts up one by one. An hour of work for twenty addresses, many of them dead.

Processing by clear rules

Search, details, enrichment, checks, output. Each step can be run on its own and has its own tests.

Strict validation

First we chased volume, then we found quality decides. We added the MX check and a match between the name and the e-mail.

An interface for the whole team

So the tool would not stay with the developer, it got a simple browser interface and a deployment on Render.

Technology

Node, no framework

A long-running job, so a classic server rather than a serverless function.

Tool and operation
Node.jsESMGoogle Places APIARES APINotion APIServer-Sent EventsCSVMX checkRender
Scope

The scope of the solution

3Data sources: Google Places, firmy.cz, ARES
2Outputs: CSV and a Notion database

Working on something similar?

Tell us where your hours disappear. We reply within two business days.

More projects

What else we built

All projects →