Jobs and Hiring

Job Posting

/extract/json

Schema for individual job listings extracted from job boards and company career pages.

Download the schemajobs/job-posting.json

job-posting.schema

// names marked ? are optional

title:string// Job title or position name. Commonly found in: page h1 tag, job header, og:title meta tag.
company_name:string// Name of the hiring company. Commonly found in: company header, job details section, breadcrumb navigation.
company_domain?:string// Website domain of the hiring company. Commonly found in: company website link, apply URL domain, company profile link.
location:string// Job location (city, state, country or Remote). Commonly found in: job metadata row, location badge, job details section.
remote_type?:string// Remote work type for this position. Commonly found in: remote badge, job metadata row, work arrangement field. One of: remote, hybrid, onsite, other.
employment_type?:string// Employment type or contract duration. Commonly found in: job type badge, employment type field, job metadata row. One of: full_time, part_time, contract, internship, other.
seniority_level?:string// Seniority level of the position. Commonly found in: job title, seniority field, experience level badge. One of: intern, entry, mid, senior, staff, principal, director, vp, exec, other.
salary_min?:number// Minimum salary offered. Commonly found in: salary range display, compensation section, job metadata row.
salary_max?:number// Maximum salary offered. Commonly found in: salary range display, compensation section, job metadata row.
salary_currency?:string// ISO 4217 currency code for salary values. Commonly found in: salary display, compensation section.
salary_interval?:string// Pay interval for salary figures. Commonly found in: salary display label, compensation section. One of: annual, hourly, monthly, other.
equity?:boolean// Whether equity or stock options are offered. Commonly found in: compensation section, benefits list, equity mention in description.
description:string// Full text of the job description. Commonly found in: job description section, main content area, responsibilities section.
requirements?:string[]// List of job requirements or qualifications. Commonly found in: requirements section, qualifications list, what we're looking for.
tech_stack?:string[]// List of technologies, tools, or programming languages mentioned. Commonly found in: tech stack section, requirements list, job description body.
benefits?:string[]// List of benefits offered. Commonly found in: benefits section, perks list, what we offer section.
apply_url:string// Direct URL to apply for the position. Commonly found in: apply button href, application link, CTA button.
posted_date?:string// Date the job was posted. Commonly found in: posted date metadata, listing date field, job metadata row.
expiry_date?:string// Date the job listing expires. Commonly found in: closing date field, apply by date, job metadata.
job_id?:string// Platform or company internal job identifier. Commonly found in: job ID field, URL parameter, reference number.
source_platform?:string// Platform where the job was found (e.g., LinkedIn, Indeed). Commonly found in: site domain, platform branding, page footer.
department?:string// Department or team for this role. Commonly found in: department field, team name, job metadata row.
visa_sponsorship?:boolean// Whether visa sponsorship is available. Commonly found in: visa sponsorship field, requirements section, job description body.
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 Job Posting 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 Job Posting

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