
I Kept Two Job Providers, Then Deleted Them Nineteen Minutes Later: A Job-Matching API Integration Reversal
At 19:54 on March 29, I committed a plan: keep two existing job-search providers, Adzuna and JSearch, as "optional extras," while adding two new free ones alongside them. At 20:13, nineteen minutes later, I committed the opposite. Both of the providers I'd just said I was keeping were gone — deleted, along with their configuration, replaced by three different ones.
What the first commit actually did
The 19:54 commit added Remotive and Arbeitnow — both public job-listing feeds that don't require an API key. Its own message is explicit about what happens to the existing providers: Adzuna and JSearch stay in place as optional extras, with the provider registration order set to prefer the new free feeds first. Nothing about that commit reads like a stopgap. It describes a coexistence plan, not a placeholder.
What changed nineteen minutes later
The next commit removes AdzunaJobSearchProvider.cs and JSearchJobSearchProvider.cs entirely — 163 and 159 lines respectively — along with their environment variables and registration. In their place: RemoteOk, authenticated with a user-agent header instead of a key; Greenhouse, reading public job boards by board token; and Lever, reading public posting feeds by site slug. Three free, keyless providers replacing two that had just been kept on purpose, minutes earlier.
I don't have a record of what happened in those nineteen minutes. No error message, no rate-limit notice, no cost figure — nothing in either commit explains the reversal. It's possible I hit a real constraint testing Adzuna or JSearch directly and decided on the spot that "optional extra" wasn't worth the complexity. It's possible something about licensing or usage terms became clear only once I looked closer. I don't know which, and I'm not going to guess at a reason the commit history doesn't give me.
The one part of this that actually is documented
Most of what I don't know in this series comes from decisions that were never written down. This event has one piece that's different: the same evening, a dedicated commit — followed by a docs-only commit five minutes after that — spells out, in the README, why two other job sources aren't providers at all. LinkedIn, Naukri, and Wellfound require a headless browser and a proxy stack to scrape reliably, and that's deliberately kept out-of-band from the API process rather than built in. Indeed isn't scraped at all, and the reasoning is stated plainly, still sitting in the repository's README today, unchanged since that night: "Scraping Indeed carries serious ToS and legal risk (historically aggressive enforcement against scrapers). We do not ship an Indeed provider." That's not something I have to reconstruct or guess at. It's on the record, and it's held up for five months without needing to change.
What shipping real data actually cost
Two bugs showed up the same evening, both specific to using real external feeds instead of placeholder data. Job ingestion and matching were opening a shared database connection without checking whether it was already open, which threw an error after certain save operations — fixed by checking connection state first, and while in there, making match failures return an actual error message instead of an empty response the frontend had no way to explain. Separately, RemoteOk's feed returns dates in local time, and the database column expecting UTC timestamps rejected them outright until ingestion started normalizing the timezone before writing. Neither bug is interesting on its own. Both are the kind of thing that only shows up once you stop testing against data you control.
What happened to the recommendations the next day
The following night, the matching logic that decides which jobs get recommended to a user was rewritten to pull from more signals at once — agent tech stack, profile frameworks and preferred language, stored user skills, and role-title matching, blended with vector similarity instead of relying on it alone. The commit doesn't say this was a direct response to the new providers, and I won't claim it was. But it's a reasonable read of the sequence: swap in real job data from five new sources, and the matching logic that used to be good enough starts needing more to work with.
That reversal is still the part of this I can't fully account for. I know exactly what changed between 19:54 and 20:13. I don't know what changed my mind.