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.


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.
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.
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.
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.
Node, no framework
A long-running job, so a classic server rather than a serverless function.
The scope of the solution
Working on something similar?
Tell us where your hours disappear. We reply within two business days.
What else we built

Walio: a loyalty system for businessesA card in the wallet, a terminal for staff and a portal with reporting.
Branuál: a brand manual as a website, not a PDFPages, blocks and an asset library with publishing. Our own product.
Layered: a website that sells the course and checks the guest inBooking with live capacity, payment and confirmation in one place.