Data ethics

What we hold, what we suppress, and what we will not publish — including the cases where the answer costs us a story.

Method version 1.12.0 · Last generated September 14, 2026

Commitments

Suppression floor

No published cell describes fewer than 5 distinct companies. This is a hard floor, not a guideline: a breakdown that cannot clear it is coarsened until it does, or it is not published.

Provenance

Everything on this site is derived from public job advertisements — postings on company applicant-tracking systems and public job boards. Nothing is derived from a customer's account, usage, or queries.

The research corpus and any customer-facing product data are read through different code paths with different credentials. The generator that builds these pages holds a read-only corpus connection and cannot reach customer records at all.

The reads this site is able to perform are enumerated below and are all aggregate- or page-shaped. Single-record lookups are structurally forbidden at the seam and fail the build if added.

Every read this site can perform

  • assert_corpus_fresh
  • collect_trend_aggregates
  • count_corpus_signals
  • count_distinct_sources
  • count_served_sources
  • count_signals_by_company
  • count_signals_by_dimension
  • count_signals_for_pages
  • detect_agency_names
  • fetch_ats_install_base
  • fetch_comparison_sides
  • fetch_signals_by_board
  • fetch_signals_for_page
  • load_page_configs
  • record_page_job_counts

Every field we hold about a posting

This is the complete list — not a summary of it. It is every field the API serves about a posting, plus the few this site derives or joins on for its own pages. It is deliberately not the shorter set these pages happen to render.

  • id
  • url
  • title
  • standard_title
  • company_id
  • company_name
  • company_domain
  • location
  • country
  • country_code
  • posted_at
  • source
  • description
  • skills
  • remote_type
  • remote_type_source
  • remote_type_confidence
  • salary_raw
  • salary_min
  • salary_max
  • salary_currency
  • salary_period
  • yearly_salary_usd
  • seniority_level
  • apply_url
  • apply_type
  • apply_url_source
  • apply_precision
  • ats_provider
  • leaves_site
  • external_reference_id
  • employer_type
  • job_family
  • posting_type
  • contact_person
  • is_intermediated
  • employer_disclosed
  • is_canonical_source
  • eligibility
  • relevance_score
  • title_similarity
  • company_signal_count
  • has_substantive_description
  • posted_at_precision
  • salary_estimate_median
  • industry
  • headcount
  • posting_liveness
  • last_check_at

No field here is a person record. We hold no name, email address, phone number or profile of an individual as a field of a posting.

contact_person reads like an exception and is audited as one: Despite the name, this carries no person: it is the PII-safe projection of the posting's on-behalf-of routing, and holds only two company identifiers — the agency's and the company the role was posted for. The underlying record's recruiter name, email address, phone number, LinkedIn profile and job title are deliberately never served.

One caveat we will not paper over. The `description` field is the advertisement's own text, stored and served exactly as the employer published it. Where an employer has chosen to print an individual's details in their own public job advert, those details are inside that text. We do not extract them, index them, build a person record from them, or publish them on this site — and we offer no way to search or filter on them. What we will not do is claim there is no field in which such a detail could appear, because that would not be true.

See also Method — the sample definition and pre-registered metric definitions.