Jobs and Hiring

Company Hiring Velocity

/extract/json

Schema for tracking a company's open job roles and hiring pace over time.

Download the schemajobs/company-hiring-velocity.json

company-hiring-velocity.schema

// names marked ? are optional

company_name:string// Name of the company. Commonly found in: company careers page header, job board company profile, page title.
company_domain:string// Website domain of the company. Commonly found in: company website URL, careers page domain, company profile link.
snapshot_date:string// Date this hiring snapshot was captured. Commonly found in: extraction date, scraper timestamp, page cache date.
total_open_roles:number// Total number of currently open job listings. Commonly found in: job count display, open positions total, search results count.
roles_by_department?:object// Breakdown of open roles by department. Commonly found in: department filter sidebar, job category counts, careers page filter.
engineering?:number// Open engineering roles.
sales?:number// Open sales roles.
marketing?:number// Open marketing roles.
product?:number// Open product roles.
ops?:number// Open operations roles.
hr?:number// Open HR roles.
finance?:number// Open finance roles.
other?:number// Open roles in other departments.
roles_by_seniority?:object// Breakdown of open roles by seniority level. Commonly found in: level filter sidebar, seniority category counts, job board filter.
senior?:number// Open senior-level roles.
mid?:number// Open mid-level roles.
junior?:number// Open junior or entry-level roles.
leadership?:number// Open leadership/director roles.
remote_roles_count?:number// Number of roles that are remote. Commonly found in: remote filter count, location type breakdown, careers page filter.
remote_roles_pct?:number// Percentage of open roles that are remote. Commonly found in: remote filter count, location type breakdown, calculated from totals.
new_roles_last_30d?:number// Number of new roles posted in the last 30 days. Commonly found in: new listings count, date filter results, job board trend data.
closed_roles_last_30d?:number// Number of roles closed or filled in the last 30 days. Commonly found in: closed listings count, job board trend data, calculated from historical snapshots.
top_hiring_titles?:string[]// Most common or featured job titles currently hiring. Commonly found in: featured roles section, top jobs display, most common titles from listings.
source_platform?:string// Platform from which this data was gathered (e.g., LinkedIn, Greenhouse). Commonly found in: site domain, platform branding, careers page ATS indicator.
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 Company Hiring Velocity 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 Company Hiring Velocity

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
company-hiring-velocity.ts
// curl -sfLO https://raw.githubusercontent.com/Mozilla-Ocho/tabstack-schemas/main/jobs/company-hiring-velocity.json
import Tabstack from '@tabstack/sdk'
import schema from './company-hiring-velocity.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.