§ dataset · schema

Every field, and how often it’s filled.

Two tables. jobs holds one row per posting; job_applicant_history holds a timestamped applicant count per observation. Coverage is measured on the live archive, and example values are copied from the free sample — nothing here is invented, and nothing is listed that the scraper does not populate.
§ 01 · jobs · 18 field groups

The jobs table.

fieldtypewhat it isexamplefilled
applicant_countintegerApplicants LinkedIn reported at last observation. Almost nobody else sells this.1178%
applicant_count_is_cappedbooleanTrue when LinkedIn showed a ceiling (“over 200”) instead of a number, so a flat series isn't mistaken for stalled interestfalse100%
salary_min · salary_maxnumericParsed out of the posting's own salary text40000 · 4800010%
salary_currency · salary_intervaltextCurrency code and period. 40+ currencies present, not USD-onlyEUR · yr10%
salary_rangetextThe raw salary string, kept so you can re-parse if our regex missed a locale₹1,000,000.00/yr - ₹3,000,000.00/yr10%
linkedin_job_idtext · primary keyLinkedIn's own posting id. Stable, joinable, dedupes across regions4459780495100%
titletextRole title exactly as postedJava Fullstack Developer100%
company · company_slug · company_idtext · text · integerCompany name, LinkedIn slug, and numeric company id for joinsViraaj HR Solutions · viraajhrsolutions · 3021119599%
location · regiontextLocation as posted, plus the region partition it was found in. 218 regions worldwideMumbai Metropolitan Region · Maharashtra, India100%
descriptiontextFull job body, plain text. Person-shaped contact details removedAbout The Opportunity…100%
leveltextLinkedIn's seniority label. Note: ~2 in 3 postings carry “Not Applicable” — that is LinkedIn's data, not a gap in oursMid-Senior level100%
employment_typetextFull-time · Part-time · Contract · Internship · TemporaryFull-time100%
job_function · industriestextLinkedIn's function and industry labelsEngineering and IT · Software Development99%
industry_ids · title_idinteger[] · integerLinkedIn's numeric ontology ids — the stable join keys behind the text labels[4] · 1073899%
posted_date · posted_at_precisetimestamptzWhen LinkedIn says it was posted. The precise variant is to the minute2026-08-31T08:45:35Z96%
first_seen_at · last_seen_attimestamptzWhen we first indexed it and last re-saw it. The two together are the posting's observed lifetime2026-08-31T09:20:02Z100%
is_activebooleanFlips false when a posting stops being re-seen. Time-to-fill falls out of first_seen_at → this flippingtrue100%
linkedin_url · canonical_urltextBack to the posting itselflinkedin.com/jobs/view/4459780495100%
§ 02 · job_applicant_history

The applicant-count time series.

Captured by a database trigger each time a re-crawl sees a different applicant count for a posting. Join on linkedin_job_id and order by observed_at to get the series; the slope is the posting’s applicant velocity.

fieldtypewhat it is
linkedin_job_idtextForeign key to jobs.linkedin_job_id.
applicant_countintegerThe count LinkedIn displayed at this observation.
is_cappedbooleanTrue when LinkedIn showed a ceiling (“over 200”) rather than a number.
observed_attimestamptzWhen the observation was recorded. One row per re-crawl that saw a change.

The same columns come back from the free sample, the snapshot, live access, and the jobs API. Field names never change between them.