Fields
A job has 50 fields: the GUIDs, the posting's own fields as its board states them, and the fields our models and rules add. A field that begins with ai_ is ours: a model's judgment, a rule, or a default for silence. The list derived on each job names the ai_ fields the posting did not state on that job, so a buyer that wants stated facts only can drop them.
Nothing is ever removed inside /v1. New fields are added as new names, each one a changed event for every job the day it is filled, and the changelog says when.
The job
| Field | Type | Ours | Notes |
|---|---|---|---|
job_guid |
uuid | born when the job enters the feed, kept on reopen | |
company_guid |
uuid | join to /v1/companies | |
title |
text | the board's title, trimmed by rules; never null | |
ai_title |
text | yes | the clean title; never null |
source |
text | the system (lever.co for Lever) | |
url |
text | the employer's page | |
description |
text | full text | |
requirements |
text | full text, ours | |
benefits |
text | full text, ours | |
ai_workplace_type |
text | yes | On-site, Hybrid, Remote Solely, Remote OK |
ai_employment_type |
text | yes | FULL_TIME, PART_TIME, CONTRACTOR, INTERN |
ai_experience_level |
text | yes | years, as a text; null on about half the jobs |
ai_salary_min |
number | yes | yearly (hourly x 2,080), stated or read from the text |
ai_salary_max |
number | yes | yearly |
ai_salary_currency |
text | yes | defaults to USD |
salary_min |
number | as stated; null when none | |
salary_max |
number | as stated | |
salary_currency |
text | as stated | |
salary_period |
text | HOUR, DAY, WEEK, MONTH or YEAR; null when none stated | |
posted_date |
timestamp | never null (first seen when the board gives none) | |
expiry_date |
timestamp | when the board states one | |
date_modified |
timestamp | the board's | |
first_seen |
timestamp | when our harvest first saw the job | |
ai_job_language |
text | yes | English, French, ... |
ai_education |
text | yes | the level named |
ai_visa_sponsorship |
boolean | yes | false for silence |
location_json |
list | places: {city, state, country, lat, lng, precision, guessed}, town level | |
remote_location_json |
list | places a remote job is open to; [] when none | |
ai_languages |
list | yes | languages the posting asks for |
ai_onet_code |
text | yes | O*NET-SOC 2019; '' until filled |
ai_onet_title |
text | yes | |
ai_soc_code |
text | yes | SOC 2018 (US); '' until filled |
ai_soc_title |
text | yes | |
ai_noc_code |
text | yes | NOC 2021 (Canada); '' until filled |
ai_noc_title |
text | yes | |
ai_isco_code |
text | yes | ISCO-08; '' until filled |
ai_isco_title |
text | yes | |
ai_esco_code |
text | yes | ESCO; '' until filled |
ai_esco_title |
text | yes | |
ai_summary |
text | yes | '' until the summary pass runs |
ai_skills |
list | yes | [] until filled |
ai_keywords |
list | yes | [] until filled |
countries |
list | what the country cut filters on | |
timezones |
list | one IANA zone per place, in place order | |
derived |
list | the ai_ fields the posting did not state on this job | |
company |
text | the company's name; '' for a nameless board | |
industry |
text | the company's industry, the short name | |
is_active |
boolean | always true (open jobs only) | |
sync_status |
text | always Active | |
closing_since |
timestamp | set while a closure is held: keep the job out of matching |
Types: text, number, boolean, timestamp (UTC, ISO 8601 with Z), list (a JSON array), uuid. A text that a model has not filled yet is "", never null; a list is [].
The company
A job's company and industry are its company's name and industry, denormalised; the rest of a company comes from /v1/companies by company_guid.
| Field | Type | Notes |
|---|---|---|
company_guid |
uuid | |
name |
text | '' when the board was imported with no name |
slug |
text | the board's key |
url |
text | the company's site |
size |
text | the employees band |
industry |
text | the short name |
locations |
list | a list |
ats |
text | the system |
ats_site |
text | the board's site |
board_name |
text | as the board names itself |
parent_company_guid |
uuid | the parent, when known |
slug_verified |
boolean | the slug was checked |
Occupation codes
ai_onet_code and ai_onet_title (O*NET-SOC 2019, under CC BY 4.0; see Credits), ai_soc_code (SOC 2018, US), ai_noc_code (NOC 2021, Canada), ai_isco_code (ISCO-08, ILO) and ai_esco_code (ESCO, EU), each with its title. They are "" until the occupation pass fills them; the names are fixed now so nothing is renamed later.
Places
location_json is a list of places, each {city, state, country, lat, lng, precision, guessed}. Places are at town level, never a street address; lat and lng are the town centre from GeoNames (CC BY 4.0), null only for a place we could not match. timezones has one IANA zone per place in the same order; countries is the list the cut filters on. remote_location_json lists the places a remote job is open to, [] when none are stated.