All use cases

Job Data for AI Training

Structured, real-world job data for training recruitment and labor market models

Synthetic job data has a ceiling. Models trained on it learn patterns that don't reflect how employers actually write job descriptions, structure requirements, or signal seniority. CleanJobData provides real job listings sourced directly from employer ATS systems, consistently normalized and available at scale. Before you plan a training run, check which license covers it. Starter and Pro allow you to train internal, non-public models and parsers — a job matcher, salary predictor, or skills extractor that runs inside your own product. Putting the data into a model you sell, a public AI agent, or a mass-market search index is outside the standard plans and needs an Enterprise commercial license (see /enterprise).

Benefits

Features

Try it on your own use case

Run real queries in the playground without a key, or start a 14-day free trial with 300 requests a day. No card required.

Frequently Asked Questions

Can I use CleanJobData to train AI models?

Yes, within the limits of your plan. On Starter and Pro, the terms allow you to use the data to train internal, non-public algorithms or parsers, such as job matching, salary prediction, or skills extraction that run inside your own product. Ingesting the data into an LLM for commercial resale, into a public AI agent workflow, or into a mass-market search index requires an Enterprise commercial license. The Trial is for building and testing your pipeline, not for assembling a training set. If you're not sure which side your project falls on, read sections 3 to 5 of /terms or contact us through /enterprise before you train.

Is this real data or synthetic?

Real data, sourced directly from employer career pages and ATS platforms. These are live job postings from companies actively hiring — not generated or augmented examples.

What's the best way to build a training dataset?

For a one-time snapshot, page through next_page cursors on a filtered query until you've pulled every matching row. For a dataset that keeps growing, run a recurring job with created_max_age (e.g. created_max_age=1d run daily) so each run pulls only the listings added since the last one; /guides/syncing-job-data-in-depth covers the pattern. For large historical backfills or bulk flat-file delivery, see /enterprise.

Does the data include job descriptions?

Yes — GET /jobs/:id always includes the full description automatically. List responses exclude it by default to keep payloads light; add extra_fields=description to a list query to get it inline instead of making a detail request per row, which is the faster path when you're bulk-collecting description text for NLP training.

How do you handle data freshness for ongoing training pipelines?

Run your pipeline on a schedule with created_max_age set to match the interval — created_max_age=1d for a daily job, created_max_age=7d for weekly. It filters on when CleanJobData indexed the listing, not the employer's published date, so each run picks up only what's new since the last one without re-downloading the full index. On Trial, Pro and Enterprise, new jobs are visible as soon as we index them. On Starter, they appear 24 hours after we index them.