Canonrow / data tools

Canonical rows · Bangkok

Tools that read
what companies
already publish.

Most of the data people pay to scrape is already served, in public, as clean JSON — just under four different field names in four different systems. I write the adapters.

Same field, four applicant tracking systems normalised output
greenhouse · departments[0].name
department
lever · categories.team
department
ashby · department
department
smartrecruiters · department.label
department

Multiply that by fourteen fields and four vendors. Reconciling it is the whole product.

The tools

Running

ATS Job Boards

Hand it a list of company domains. It works out which applicant tracking system each company runs, pulls every open role from that system's own public job-board endpoint, and returns the lot in one schema — with a real apply link on every row.

Company careers pages that render their board in JavaScript used to break this kind of tool. When the page gives nothing away, it asks each vendor directly whether a board exists under that company's name. vanta.com resolves that way.

Systems
Greenhouse · Lever · Ashby · SmartRecruiters
Last run
564 roles from 6 boardszero failures, about seven seconds
Method
Public vendor endpointsno login, no headless browser, no proxies
Billing
Per role delivereda board that returns nothing costs nothing
Tests
21 passingincluding live calls against all four vendors

How I build

Measure first, then write

Before a tool gets built, the thing that would kill it gets tested. One design died on a single number: outbound port 25 is closed on the platform, so mailbox-level email verification cannot run there. Better to learn that in an afternoon than in a launch.

Say what isn't known

A verdict without evidence behind it is a guess wearing a costume. Where a source can't answer, the row says so and explains why, instead of picking the answer that reads better.

Charge for results, not attempts

Billing is per row delivered after filtering. Duplicates and empty boards are detected and dropped without charge, so the invoice matches the dataset.