One developer. Eight years of data. One year of building. This is not a typical startup story — but it's a real one.
The third platform product. Register an endpoint via API, the system pings it at configured intervals and collects responses — status code, latency, payload. Alerts when something stops responding.
First expansion beyond Poland. The multi-registry architecture was designed from day one with exactly this step in mind — a new country means a new data source, same consistent output format.
Automatic email alerts when a detected change affects a monitored entity. Configurable threshold — you choose which event types trigger a notification.
Complete reset and production test — 23 hours of parsing, 1.3M identities, 35M records, 15 GB of data. All endpoints tested multiple times: Search, Watchlist, Events, Wallet, queuing, log aggregation.
Complete API documentation, 4 integration guides, credit-based pricing. Ready.
Complete technical documentation — Authentication, Tokens, Wallet, Companies, Watchlist, Events. Every endpoint with parameters, curl examples, and real responses. Four integration guides in PL and EN.
Three platform products. Search with a mandatory contact filter — every result has a verified phone, email, or fax. Watchlist with async queuing for up to 100 entities per request. Events feed with 29 event types detected daily from GUS snapshots.
Credit-based billing with Paddle integration — no subscription, pay for what you use, credits never expire. Multi-tier token system: Master Token with full access, API tokens with limited scope. Deliberate decision: checkout via email, zero stored user personal data.
Pipeline stopped being run manually from the terminal. Cron fires it every night — fetches new, updated, deleted reports from GUS, parses XML into the domain, detects changes, generates events. Running continuously since launch.
The first GUS integration worked but was spaghetti — CRUD mixed with DTO, skipped layers, logic in the wrong places. New approach: silo by silo, report type by report type, clean wiring into the domain. January was testing and stabilization — run manually from the terminal, daily.
3-stage pipeline: fetch historical reports → download XML, parse to JSON, create batches → parse batches into domain. It worked — but not the way it should. Christmas reset and a new approach.
Three weeks building the domain layer from scratch — DTO, Writer, Cleaner, Factory, Resolver, Event. 41 tables, full dictionaries. The whole month on tests — the world had to be predictable before anything was connected to production.
Decision made — developing the database toward change detection in business entities. Weeks of research: data warehouse or something else? What patterns? What are DTO, Factory, Resolver — how do they fit together? Answer: niche, data storytelling, change detection. Start building the domain.
After leaving corporate in 2022, after years with "programming" in the back of my head — AI made me say "let's see". Rented a VPS, two weeks of configuration, a few full reboots and Laravel was running. Started learning PHP and Laravel from absolute zero.
A flood of ideas, a dozen unfinished projects — but one thing was clear: I start with API and I end with API.
Summer 2017 — first script pulling reports from GUS launched. Every day, in small batches, only new reports. For eight years — status updates, full record updates from GUS and CEIDG, PHP 8.2 upgrade in 2024. Nobody knew this would ever be more than a local database on a hard drive.
March 2025 — 4.7 million unique REGONs in one table, no optimization, but eight years of consistently collected data.
2016/2017 — first contact with registry data. Bought a ready-made database for telemarketing, total sales failure, but one question remained: "where does this data come from?". Searching for answers, CEIDG, KRS, GUS. The math: 400 PLN per 1000 records, better to build your own.
Summer 2017, heat outside, everyone at the lake — first script written by an external developer pulls the first data from GUS. Excitement in front of the screen. That's how it started.