# Field reference

Every job object — in `items` of a page, or returned alone by `GET /v1/jobs/{job_id}` — has
exactly these 25 fields.

- **Every field is always present.** A value we do not know is `null` — never a guess. Where the
  source itself published an empty value, a field can hold an empty string (or a list holding
  one), so treat `""` the same as `null`.
- **Field names follow the fantastic.jobs vocabulary**, so parsers written for that format read
  these records.
- **Fields ending in `_derived` are lists with one element**, or `null` — except
  `domain_derived`, which is a plain string.
- **The `ai_` prefix is only a name.** The employment-type, work-arrangement and salary fields
  are taken from the posting, not generated by a model. Salaries are never converted or
  annualised.
- **Dates** are ISO 8601 strings with a UTC offset, e.g. `2026-10-02T18:07:25.386000+00:00`.

## Identity and link

| Field | Type | Null? | Meaning | Example |
| --- | --- | --- | --- | --- |
| `id` | integer | no | Job id. Stable; use it for `GET /v1/jobs/{job_id}` and for de-duplication. | `536359` |
| `title` | string | no | Job title as posted. | `"Technical Recruiter"` |
| `organization` | string | no | Name of the hiring company. | `"range"` |
| `url` | string | no | Link to the original posting on the company's applicant tracking system. | `"https://jobs.ashbyhq.com/range/25b4…"` |

## Dates

| Field | Type | Null? | Meaning | Example |
| --- | --- | --- | --- | --- |
| `date_posted` | string (date-time) | yes | When the posting says it was published. | `"2026-10-02T18:07:25.386000+00:00"` |
| `date_created` | string (date-time) | yes | When we first recorded the job. Can be earlier than `date_posted` if the employer re-dated the posting. | `"2026-04-09T23:12:08.358703+00:00"` |
| `date_valid_through` | string (date-time) | yes | Closing date, if the posting gives one. | `null` |

## Source

| Field | Type | Null? | Meaning | Example |
| --- | --- | --- | --- | --- |
| `source_type` | string | no | Always `"ats"`: every job comes from an applicant tracking system. | `"ats"` |
| `source` | string | yes | Short name of the applicant tracking system the job was collected from. | `"ashby"` |
| `source_domain` | string | yes | Host the posting is served from, without `www.`. Only set when `source` is known. | `"jobs.ashbyhq.com"` |
| `domain_derived` | string | yes | The hiring company's own web domain, when known. | `"example.com"` |

## Location

| Field | Type | Null? | Meaning | Example |
| --- | --- | --- | --- | --- |
| `locations_derived` | array of string | yes | Display location `City, State, Country`; unknown parts are left out. | `["McLean, Virginia, United States"]` |
| `cities_derived` | array of string | yes | City. | `["McLean"]` |
| `regions_derived` | array of string | yes | State or province. | `["Virginia"]` |
| `countries_derived` | array of string | yes | Country name (an ISO 3166-1 alpha-2 code when the name is not known). | `["United States"]` |
| `timezones_derived` | array of string | yes | IANA time zone of the city. | `["America/New_York"]` |
| `lats_derived` | array of number | yes | Latitude of the city. | `[38.93428]` |
| `lngs_derived` | array of number | yes | Longitude of the city. | `[-77.17748]` |

## Employment and work arrangement

| Field | Type | Null? | Meaning | Example |
| --- | --- | --- | --- | --- |
| `employment_type` | array of string | yes | One of `FULL_TIME`, `PART_TIME`, `CONTRACTOR`, `INTERN`, `TEMPORARY`, `VOLUNTEER`, `OTHER`. | `["FULL_TIME"]` |
| `ai_employment_type` | array of string | yes | Same value as `employment_type` (kept for fantastic.jobs compatibility). | `["FULL_TIME"]` |
| `ai_work_arrangement` | string | yes | `On-site`, `Hybrid` or `Remote Solely`. `null` when the posting does not state it clearly. | `"Hybrid"` |

## Salary (as posted)

| Field | Type | Null? | Meaning | Example |
| --- | --- | --- | --- | --- |
| `ai_salary_currency` | string | yes | Currency as posted. | `"USD"` |
| `ai_salary_min_value` | number | yes | Lower bound as posted. | `85000.0` |
| `ai_salary_max_value` | number | yes | Upper bound as posted. | `110000.0` |
| `ai_salary_unit_text` | string | yes | Period the values refer to: `HOUR`, `WEEK`, `MONTH` or `YEAR`. `null` when unknown or for other periods (for example daily). | `"YEAR"` |

## Not served

Job descriptions are not part of the API. Other fields of the fantastic.jobs format (for example
company logo, skills or experience level) are not served either.

The same definitions, as JSON Schema, are in the [API Reference](/api-documentation/api) and the downloadable
[OpenAPI file](https://jobs-database.de/api-documentation/openapi.yaml).
