Northbound Data

Research that reports its own failure rate.

I am in China, I work in Chinese and English, and I mark which of my own findings I could not verify. Supplier checks, market research, and data tooling — measured, dated, and published before you pay for anything.

Shipped, not proposed

Three production tools live on the Apify marketplace, plus an open-source client and a documentation site. All publicly verifiable — the links go to the real thing, not to screenshots.

647
records delivered in a 24-task benchmark
0
failed tasks in that benchmark
5.5s
average per task
$0.024
compute cost for 86 records
What that benchmark is and is not. It is 24 tasks I ran and documented on 2026-08-19: 8 profiles, 10 posts, 6 keyword searches, 72 fetches, zero render fallbacks. It is not a claim that nothing ever fails. Targets change, networks fail, and platforms change their defences — which is exactly why every run writes its own reliability summary instead of asking you to trust a number on a sales page.

How I build

Four habits that show up in every deliverable. They are the reason the numbers above exist at all.

Every run grades itself

Each job writes a summary with attempts, successes, failures and a failure rate. You audit the tool with its own output instead of taking my word for it.

Missing ≠ failed

Feed in 40 accounts and some will not exist. Those are reported separately, by name, so your error rate stays honest and you learn which inputs to clean.

Structure-adaptive parsing

No hard-coded API ids or fixed JSON paths. Data is found by structural signature, so a site refactor degrades the output instead of silently returning zero rows.

Cost is measured, not guessed

One config change cut a run from 150s/$0.127 to 3.3s/$0.0086 — 45x faster, 15x cheaper, identical output. I find those before you pay for them.

Live work

Open any of these. They are published products with real schemas, real pricing and real documentation.

ProjectWhat it doesNotable
Threads Scraper Posts, replies, profiles and keyword search in one run Merges 4 profile tabs and 5 search surfaces for 2.4–4.4x more unique results than a single-entry-point scraper
Threads Search Scraper Keyword search, deduplicated across keywords A post matching three keywords is billed once, not three times
Threads Creator Finder Creator discovery ranked by engagement on a topic Follower-band filter isolates micro-influencers; ranks by topic engagement, not follower count
threads-data-client MIT client, zero dependencies, Node 18+ Handles run start, polling, dataset pagination and tier-aware cost estimation
Measurement reference Public write-up of what the platform actually returns Includes the limits that make the tools less attractive — because a buyer should know them first
China Licence Checker Free tool: validate a Chinese business licence code offline Tells a buyer whether a supplier is a company or one individual — a distinction English materials never surface. Runs entirely in the browser
Sample supplier report A full worked example of what a verification report contains Every finding filed as confirmed, inferred, or could not check — including three things I could not verify
Reading a Chinese Business Licence Field guide: nine fields, and what each one really means Covers the two that settle factory-vs-middleman, and the money figure on the licence that is not money
The 62x Blame Gap Bilingual review analysis: one game, two audiences 60 points apart Documents my own method error and the correction, plus a section on what the analysis still cannot tell you

Node.jsPythonPlaywrightREST APIsApify SDKDockerHTML/CSSJSON SchemaTechnical writing

What I take on

  • Data extraction pipelines — from a target you name to clean, schema-validated JSON or CSV
  • API integrations — pulling, normalising and joining data across services
  • Automation scripts — recurring work turned into something that runs on a schedule and reports what it did
  • Data cleaning & enrichment — messy exports into something you can actually query
  • Technical documentation — READMEs, API docs and reference pages a stranger can follow
  • Fast static sites — hand-written HTML/CSS, responsive, accessible, no framework bloat

And what I turn down

  • Anything needing a CAPTCHA solved or an access control bypassed
  • Anything requiring logging into an account that is not the client's own
  • Targets whose robots.txt I have not checked — I check before quoting, and I will tell you if the answer is no
  • Work I cannot benchmark, because then neither of us knows if it is any good
Why the second list matters. Turning down work up front is cheaper for you than discovering mid-project that the approach was never viable. I would rather lose the job than deliver something that breaks quietly.

Working together

A short, predictable loop. No surprises in the invoice.

StepWhat happensYou get
1. ScopeYou describe the outcome. I check feasibility, including the target's terms and defences.A yes/no and a fixed quote — or an honest "this cannot be done well"
2. SampleI deliver a small real slice first.Actual output to inspect before committing to the full run
3. BuildFull implementation with a self-reporting reliability summary.Working tool plus its own measured failure rate
4. HandoverDocumentation written for someone who was not in the conversation.Something maintainable after I am gone