Production-grade web scraping & AI research, written by someone who ships it.
I'm Aleksei. I build Apify actors and write code-heavy tutorials about web scraping, data extraction, and AI workflows. Every article includes runnable Python and real benchmarks. Currently 31 published actors (78 total in portfolio) with real users.
Recent posts
-
9 Keyless Health APIs: You Asked for v1, You Got v8
Nine health and medical APIs that need no key, no signup and no card (DailyMed, RxNorm/RxNav, ClinicalTrials.gov, openFDA, WHO GHO, PubChem, the CMS NPI Registry, HAPI FHIR and disease.sh), each checked with a live request on July 27, 2026. Then the finding: the id you store is stable and the record underneath it is not. One DailyMed setid held 8 versions published between August 2017 and June 2026, and asking that endpoint for version 1, 3, 8 or 999 returned four byte-identical documents of 266,520 bytes with md5 4ae91da54b97, every one of them version 8, every one of them HTTP 200. In a sample of 80 setids, 49 had been rewritten at least once, and the obvious test for it, spl_version greater than 1, disagreed with the actual history on 7 of the 80 because spl_version is not a revision count: three records in that sample carried version 100 with a single version in their history. RxNorm returns the same 2-byte HTTP 200 for an obsolete concept, a remapped one and an id that never existed. The honest primary key is (id, version), and an upsert keyed on id alone destroys the only evidence that the source changed its mind.
-
10 Keyless Statistics APIs: Never Delete the World Row
Ten statistics and indicator APIs that need no key, no signup and no card (World Bank, Eurostat, IMF DataMapper, Our World in Data, DBnomics, WHO GHO, ILOSTAT, UN Comtrade preview, UNESCO UIS and the UK ONS beta API), each checked with a live request on July 26, 2026. Every one of them ships totals and members in the same list and the same schema, and on eight of the ten the data rows carry no column saying which is which (WHO GHO and UN Comtrade are the two that do). Ask the World Bank for population in 2023 and you get 264 valued rows; add them up and you get 86,466,868,911 people, 10.72 times the planet. The obvious repair, dropping rows whose countryiso3code is a known aggregate code, lands on 16,102,473,551, exactly 1.9971 times the World row, because four income-group aggregates (XD, XM, XN, XT) arrive with countryiso3code set to an empty string and slip straight through. Those four sum to 8,062,923,417, which is the World row to the person. UN Comtrade repeats the pattern exactly: 224 rows for US exports in 2023, partner code 0 is the world, and the sum of all rows is 2.0000 times it. The 2x version is more dangerous than the 10.7x version because it survives a plausibility check. The fix is not a smarter filter: keep the total row, allow-list the members, and assert the members add up to the total. WHO GHO, UNESCO UIS and the IMF show it can be done differently.
-
9 Keyless Currency APIs, and the Yen That Breaks Your Cents
Nine currency and exchange-rate APIs that need no key, no signup and no card (Frankfurter, vatcomply, open.er-api, floatrates, fawazahmed0, the ECB daily XML, Bank of Canada Valet, NBP Poland and cbr-xml-daily), each verified with a live curl on July 25, 2026. On one day, one pair, USD to EUR, the five JSON aggregators returned five different numbers, from 0.878195 to 0.87897, a 0.088% spread worth about 775 EUR on a 1,000,000 USD conversion. But the rate is the small problem. Money is a rate times an amount, rounded to a scale, and the scale is the one thing none of these endpoints sends. ISO 4217 gives every currency a minor-unit exponent: USD is 2, the yen (JPY) is 0, the Kuwaiti dinar (KWD) and Bahraini dinar (BHD) are 3. The reflex that is right for the dollar, round to two places and multiply by 100 for cents, invents sub-yen coins that do not exist and drops a whole fils digit on the dinar. On the same live rates, storing $1,000 the naive way overcharges a yen ledger 100-fold and undercharges a dinar ledger 10-fold, all on a clean HTTP 200. This is not the which-rate-is-right post and it is not the float-precision post: it is about how many digits survive the write into stored money. The fix is a minor-unit-aware rounding step driven by an ISO 4217 table, with a fail-loud default for any currency code you have not mapped. exchangerate.host and data.fixer.io are excluded because both return HTTP 200 with success:false and missing_access_key, so keyless is falsifiable and was tested.
-
I Gave 9 Free IP-Geolocation APIs One IP. 3 Pointed to a Farm in Kansas.
Nine IP-geolocation APIs that need no key, no signup and no card (ip-api.com, ipwho.is, freeipapi.com, ipinfo.io, ipbase.com, geojs.io, ip.guide, reallyfreegeoip.org and country.is), each verified with a live curl on July 24, 2026. Given one IP (8.8.8.8), their coordinates disagreed by about 3,800 km, from Ashburn, Virginia to San Jose, California. Three of the nine (geojs.io, ip.guide, reallyfreegeoip.org) returned the identical point, 37.751, -97.822, which is not a city: it is the geographic center of the contiguous United States, the value MaxMind used as a default for any US IP it could not place, the coordinate that turned a real farm in Potwin, Kansas into a digital hell (Kashmir Hill, Fusion, 2016). ipinfo.io flags the IP anycast:true, so it knows there is no single location, and still returns a precise coordinate; ipwho.is prints seven decimal places on a guess. Unlike geocoding a known address, which resolves deterministically, IP geolocation is a probabilistic guess about a network, and every one of these returns HTTP 200 with no flag that says fallback. The fix is to treat the coordinate as an estimate with a confidence: check the body's own success flag, collapse the default centroid to country-only, respect an accuracy radius where one exists, and never key on a bare latitude and longitude.
Need a custom scraper or research solution?
Pilot pricing: $100 for 1 article or $150 for a 3-article series. Email spinov001@gmail.com with the topic and I'll reply within 24 hours.