Jobs and Hiring

Salary Data Point

/extract/json

Schema for individual salary data points from crowdsourced and published compensation sources.

Download the schemajobs/salary-data-point.json

salary-data-point.schema

// names marked ? are optional

job_title:string// Job title or role this salary corresponds to. Commonly found in: salary entry title field, compensation data row, salary report header.
company_name?:string// Name of the employer. Commonly found in: company field in salary entry, employer name in report, data submission form.
company_domain?:string// Website domain of the employer. Commonly found in: company profile link, employer website field.
company_size_range?:string// Company size range (e.g., '51-200', '1000+'). Commonly found in: company size field, employer details, filter sidebar.
industry?:string// Industry sector of the employer. Commonly found in: industry field, company profile, salary filter.
location_city?:string// City of the job location. Commonly found in: location field, city in salary entry, geographic filter.
location_state?:string// State or province of the job location. Commonly found in: location field, state in salary entry, geographic filter.
location_country?:string// Country of the job location. Commonly found in: location field, country in salary entry, geographic filter.
remote?:boolean// Whether the position is fully remote. Commonly found in: remote indicator, work arrangement field, location type.
total_comp_usd:number// Total annual compensation in USD. Commonly found in: total comp field, TC display, compensation summary.
base_salary_usd?:number// Annual base salary in USD. Commonly found in: base salary field, salary breakdown section, compensation table.
bonus_usd?:number// Annual bonus amount in USD. Commonly found in: bonus field, salary breakdown section, compensation table.
equity_usd?:number// Annual equity value in USD. Commonly found in: equity field, stock/RSU value, compensation table.
signing_bonus_usd?:number// Signing bonus amount in USD. Commonly found in: signing bonus field, compensation table, salary breakdown.
years_experience?:number// Total years of professional experience. Commonly found in: experience field, years of experience input, salary filter.
years_at_company?:number// Years at the current company. Commonly found in: tenure field, years at company input, compensation details.
education_level?:string// Highest education level (e.g., Bachelor's, Master's, PhD). Commonly found in: education field, degree level input, salary filter.
seniority_level?:string// Seniority or career level (e.g., Senior, Staff, Principal). Commonly found in: level field, seniority input, title level indicator.
data_source?:string// Source or platform of this salary data point. Commonly found in: site domain, platform attribution, data source label.
submission_date?:string// Date this salary was submitted or reported. Commonly found in: submission date field, report date, salary entry timestamp.
page_title?:string// Title of the source page. Tabstack auto-fills this from page metadata when left empty.
favicon?:string// Favicon URL of the source page. Tabstack auto-fills this from page metadata when left empty.

Try it live

A sample Salary Data Point document, generated from the schema. Edit it, or paste a real response, and see it checked against the schema instantly. It runs in your browser, nothing is sent anywhere.

your-output.json
validation

Valid, matches Salary Data Point

Every required field is present and each value matches its type. Extra fields are allowed. A field the page does not carry is not guaranteed to come back as null, so check values rather than only checking for null.

/extract/json

Copy-paste usage

The same call in TypeScript, Python, and curl. Point it at your own URL and go. The schema drives the response, so you get back the fields you asked for instead of a page to parse.

Features

  • Typed TypeScript and Python SDKs
  • One call, no parsing code and no second LLM pass
  • The same field names on every request, even when the page layout changes
salary-data-point.ts
// curl -sfLO https://raw.githubusercontent.com/Mozilla-Ocho/tabstack-schemas/main/jobs/salary-data-point.json
import Tabstack from '@tabstack/sdk'
import schema from './salary-data-point.json' with { type: 'json' }

const client = new Tabstack() // reads TABSTACK_API_KEY from the environment

try {
  const data = await client.extract.json({
    url: 'https://example.com/careers/engineer',
    json_schema: schema,
    effort: 'standard', // 'min' | 'standard' | 'max'
  })

  console.log(data)
} catch (err) {
  console.error('Extraction failed:', err)
}

Ship this schema in one call.

Pass a URL, get matching JSON back. Free to start, no extraction layer to maintain.