Blog
Notes from building in public — what worked, what didn’t, and the numbers behind both.
- Tracking follower count over time: a missing hour is not a flat hourIf you track follower count over time, your series will have holes. I measured 4,043 snapshots of 37 public profiles: forward-filling the holes was the worse guess on almost every account, and one hole hid a drop of 53,953 followers.2026-10-03
- How to Get Pinterest Board Pins in Python: A Full GuideLearn how to extract Pinterest board pins using Python. This guide compares the official Pinterest API workflow with the simplified HonestHook developer API approach.2026-10-03
- How to Get Threads User Profile Data with Python: Official API vs HonestHookLearn how to retrieve Threads user data and manage API quotas in Python. Compare Meta's official API constraints with HonestHook's read-only convenience.2026-10-03
- My usage counter and my billing log disagree on eight rows. Five of them are supposed to.A full outer join between a monthly usage counter and an append-only charge log flagged eight rows. Five were my check being wrong. One is 137 credits counted against an allowance with no event behind them.2026-10-02
- The flag that prices my API also decides whether my cron can runOne column in my catalog means can this be sold. A scheduled job reads the same column to decide can this run. Flipping it for a pricing reason stopped the job, and every signal downstream still said fine.2026-10-02
- How to get a TikTok follower count from an API in 2026TikTok's official APIs give you a follower count for your own account or, if you are an approved academic, for anyone. Here is the other route: one GET, the JSON it returns, a Python tracker, and what it costs.2026-10-02
- My uptime percentage counts my own retries in the denominatorOne monitor round writes one row, or sometimes two. My status function divides successes by rows. The two ways of counting disagree on my worst route, and here is the query that separates them.2026-10-02
- My billing reconciliation compares 0 rows and reports 0 problemsAn audit that filters its rows before it asserts can be green and empty at the same time. Mine was.2026-10-02
- Seven times I counted the right thing on the wrong side of a relationA count can be arithmetically correct and still make the sentence around it false. Seven cases from one repository, the query that separates rows from groups, and what each one cost.2026-09-30
- Three platforms stopped in the same hour, and my log blamed three platforms486 rows of 'empty' from Instagram, TikTok and Reddit, all beginning in one hourly window. The platforms had not changed. The four ways out, and where each one fails.2026-09-29
- Bright Data alternatives: the cheapest plan buys 839,000 profile readsThe cheapest Bright Data commitment is $499/month for 141 GB. I measured what a public profile weighs on ten platforms, so I could work out what 141 GB is in profiles: 839,000 of the heaviest ones. The alternatives, and the arithmetic you can redo.2026-09-28
- My table has two timestamps per row and nothing makes them agreeOne table with two time columns, two functions that order by different ones, and nothing in the schema that requires them to agree. A measurement of mine passed for the wrong reason.2026-09-28
- For nine days my terms of service named a company that does not existMy /terms page said HonestHook was operated by a company with no registration anywhere. The CNPJ next to it was correct the whole time — which is exactly why nothing caught it. Nine days, one paying-plan checkout screen, and a check that takes forty seconds.2026-09-27
- The four endpoints I built and turned offNineteen endpoints answer. Four more are written, tested and disabled — a whole monitoring product among them. Here is each one, and the specific reason it is not serving traffic.2026-09-25
- Publishing a remote MCP server to the official registryThe official MCP registry accepts remote-only servers with no public repository — which is the opposite of what the community lists require. Here is the whole publishing path, including the four things that failed on me first.2026-09-25
- The two platforms that just give you the dataBluesky and Mastodon both answer profile requests over a public API with no key and no account — 634 and 932 bytes respectively. That makes them the easiest platforms in this category, and the ones whose specific traps nobody writes down. Here they are.2026-09-24
- Apify's Instagram Scraper: what 1,000 profiles actually costsApify charges $2.60 per 1,000 Instagram profiles on the free plan. That is not what you pay. Proxies, storage and data transfer come out of the same credits, and unused credits expire every month. Here is the arithmetic, with the numbers read from Apify's own pages.2026-09-23
- One profile, orders of magnitude apart: what social platforms actually send backThe same logical object — one public profile — comes back as half a kilobyte from GitHub and well over a hundred from Threads. That gap is billed to you as data transfer, proxy bandwidth and timeouts. Measured twice, sixteen days apart.2026-09-23
- The field next to the right oneEvery public profile has a field sitting next to the one you want, with a name one letter away, holding a number that looks entirely plausible. Pinterest has 42 of them on a single page. Here is the catalogue, platform by platform.2026-09-23
- My uptime monitor was green 284 times and never touched the archive it is supposed to protect288 checks in a day, 284 of them 200s, and a join against my own priced catalogue found seven live endpoints with zero checks — including all three that read the archive. The one query that finds the same hole in your API.2026-09-21
- A disabled source and a broken source were the same row in my collector logOne boolean said a source was switched off, the scheduler called it anyway for 42 hours, and the ledger wrote the same word for 'off', 'blocked' and 'quiet hour'. 3,038 rows counted, and the two queries that find it in your own collector.2026-09-10
- How to read an Instagram public profile without logging inWhat the logged-out page actually gives you, why datacentre IPs fail first, and the failure mode that returns 200 with the wrong shape. Written for people deciding whether to build this or buy it.2026-09-07
- Which Instagram scrapers still work in 2026Meta's official API does read other accounts without their consent — but only professional ones. Personal and private accounts return nothing at all. Here is what officially exists in 2026, what broke, and what the alternatives actually are.2026-09-07
- Public data is still personal dataScraping a public page does not make the data exempt. What actually changes when you store it, why the vendor's compliance page is not your compliance, and the six questions worth answering before you write the first row.2026-09-07
- The Reddit API closed in May 2026. Here's what replaced itAppending .json now returns 403. I tested every remaining public surface and measured what each one gives back — including the one that returns 200 with the wrong content, and the one that survives but carries no scores.2026-09-07
- The scraper fix that silently returns nothingThe expensive failure is not the one that errors. It is the one that passes if (res.ok) and returns the wrong content. Three cases measured today, and the check that catches all of them.2026-09-07
- X killed its free tier in February 2026 — the real cost of the alternativesX has no free API tier. Pay-per-use pricing read from X's own docs, the arithmetic at real volumes, the 24-hour rule almost nobody factors in, the 3M ceiling, and what the open alternatives actually cost — with measured numbers, not estimates.2026-09-07
- 56 privileges I never granted — and a signup form that would tell you who was on my listMy waitlist form answered a question I never meant to expose: is this email already signed up? The leak wasn't a bug in my code. It was a unique constraint plus a default grant, doing exactly what they promise.2026-09-06
- I pulled 2,140 real searches about what to post. The popular ones were useless to me.A free way to measure search demand without a keyword tool — and the uncomfortable finding that the highest-volume queries in my market belong to someone else's audience.2026-09-05
- I counted 2,236 tutorials on a competitor's site. They were all the same page.A scraping API company ranks on thousands of long-tail queries. I pulled their sitemap expecting a content team. I found a cross product: 172 endpoints × 13 languages, exactly.2026-09-05
- The most valuable thing I own right now is an empty databaseWhy I built the boring part first — a table that records what's trending, before there's a product, a customer, or a single row in it.2026-09-05