DEV Community

Can Yılmaz
Can Yılmaz

Posted on • Originally published at apify.com

About the Built In Tech Jobs scraper: what data it returns and how to think about it

This is a write-up of what a Built In Tech Jobs scraper produces and why the resulting dataset is useful, focused on the schema and use-cases rather than a sample-run walkthrough.

What it scrapes

Built In Tech Jobs Scraper Scrape US Startup & Tech Job Listings Scrape tech and startup jobs from Built In (builtin.com) at scale across the national board and every major US tech hub: New York, San Francisco, Austin, Chicago, Boston, Los Angeles, Seattle, Colorado, Washington DC, Atlanta, Dallas and Miami. The scraper handles the awkward parts of the source -- pagination, rate-limiting, the inevitable cookie banners and JavaScript-rendered content -- and produces clean, flat records that a downstream pipeline can consume directly.

The output schema

Per record, the actor returns these fields:

  • Records contain entity-level metadata and source-specific descriptive fields.

A few notes on how to interpret them. Identifier-like fields are typically strings even when they look numeric -- always treat them as opaque tokens for joining purposes. Timestamps come back as ISO-8601 UTC. Long-form text fields may contain non-ASCII characters and embedded whitespace, so always UTF-8 your loader and trim on insert.

What the dataset enables

For recruiters, talent-intel analysts and job-market researchers, this dataset directly supports tracking hiring trends, building talent pipelines, salary benchmarking and competitive recruiting intelligence. The flat shape makes it easy to land in a warehouse without normalisation, and the field mix supports both aggregation-heavy and text-analytical workflows. Realistic projects you could build on this feed:

  • A daily snapshot pipeline that lands the raw records into object storage and materialises a curated view for dashboards.
  • A change-detection layer that diffs consecutive runs to surface new and removed entities.
  • A simple enrichment step that joins against an internal reference table to give the records business-specific context.

Things to know up-front

A few practical points before you commit to building on it:

  • The source rate-limits aggressively against datacenter IPs. Use the actor's built-in proxy rotation rather than fighting this yourself.
  • Schema can drift if the source redesigns its pages. Wire up assertions on record counts and on the presence of key fields, and you will catch drift quickly.
  • Optional fields are sometimes missing rather than emitted as null. Use .get(k, None) in your loader rather than positional access.
  • Long-form fields can be large; trim before indexing if you are pushing into a search engine.

Operational pattern that works

For most recruiters, talent-intel analysts and job-market researchers the right shape is: schedule the scraper on a recurring cadence (daily or every few hours depending on source velocity), write raw JSON to object storage partitioned by date, then run a small dbt or SQL transformation layer that deduplicates and curates the rows into a query-friendly view. That decoupled pattern means you can replay history without re-scraping, and you can change your downstream schema independently of the source.

Common questions about this kind of feed

A few questions I get asked when describing a feed like this to engineering teams new to web-scraped data:

How fresh does the data need to be? That depends on the use-case. For monitoring and alerting you probably want hourly or sub-hourly. For periodic analytics, daily is plenty. The scraper itself can be scheduled at whatever cadence makes sense -- the cost is roughly linear in run frequency.

What happens when the source changes? Realistically, every public source redesigns its pages every few quarters. The scraper-maintenance team handles selector updates on the actor side, so the downstream contract -- the schema you see above -- stays stable across upstream changes. That is the main argument for using a maintained actor instead of rolling your own.

Can the records be enriched with reference data? Yes, and most non-trivial projects do this. Common patterns: join against an internal CRM to add account-level context, join against a public reference dataset to add categorical metadata, or run the long-form text through a classification model to add structured labels.

What about historical data? The actor produces a snapshot at scrape time. For a true historical archive you schedule the scraper on a recurring cadence and accumulate the snapshots; the source itself does not generally expose deep historical APIs.

Verdict

If you need Built In Tech Jobs as a structured feed, the schema above is rich enough to support real analytical work without a heavy enrichment step. The bigger engineering question is usually not "can I get the data" but "what do I do with it once I have it" -- which is a much nicer problem to have. Start with the schema, sketch the use-case, plan the maintenance budget, and you will know inside a week whether the feed is worth keeping in your stack.


For live, customizable extractions of this data, the actor that produced the dataset shown above is published on the Apify Store: logiover/built-in-tech-jobs-scraper. It supports JSON, CSV and Excel exports and runs on a schedule.

Top comments (0)