Job Monkey

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.