Skip to main content
A field’s type in current_step.fields sets the JSON shape of its answer. The rules below cover every field type on API contract 2026-08-31, followed by the failure and correction codes an application can return.
Auto Apply is coming soon. Build against the sandbox today with a sandbox key; live applications need Jobo approval (see Access).

Field shape

Every field has field_id, type, label, required, and requires_answer. options, non-empty constraints, format, and sensitive: true appear only when they apply; empty metadata and sensitive: false are omitted. Values already on the ATS form are not exposed. required describes the ATS form. requires_answer says whether you must send a value on this step. Send every field with requires_answer: true, and optional fields only when the candidate gave a value. Send each field ID once, and never send unknown IDs or IDs from another application or step.

Scalar answer values

Each answer is { "field_id": "the-returned-id", "value": ... }. Send JSON values of the right type, not strings containing JSON. A typeahead also accepts the provider-native shape {"query":"MIT","selection":{"value":"...","label":"..."}} when you already have a valid selection. Do not fabricate native IDs. Omit unanswered optional fields instead of sending empty strings or null. false and 0 are real answers, so don’t drop them with a truthiness check. A required field you can’t answer needs candidate input, not a guess.

File answers

Jobo downloads the file from the URL you supply. The API accepts no local path or multipart upload. The URL must:
  • Be HTTPS on port 443 and publicly reachable. Localhost and private-network URLs are rejected with unsafe_file_url.
  • Download the file without browser cookies or a login page.
  • Stay valid through upload and retries.
  • Serve a file within the platform’s 10 MiB download limit, any returned file constraints, and the ATS’s allowed formats. An ATS may set a smaller limit.
A signed object-storage URL works without making the file permanently public. Treat signed URLs as credentials: keep them out of your logs and away from other users. The demo app has its own 5 MB PDF upload limit.

Education and work history

A repeated ATS section is one repeating_group field, not flattened children:
The answer is an ordered array of items keyed by item_fields[].key. Typeahead children take the actual answer directly:
Work-history groups use the same shape. This example assumes the returned item_fields include every key shown; omit any key the actual schema does not list:
Group rules:
  • item_fields varies by ATS, which may add children such as country, state, contact permission, graduation status, or hours per week. Unknown item keys are rejected.
  • The array is the complete desired group state, in order. It is capped by the provider’s limit and a platform maximum of 100 entries.
  • group_type is one of education, work_experience, certification, website, language, skill, or other.
  • When is_current is true, end_date must be null or omitted.
  • Nested validation errors carry field_id, item_index, field_key, code, and message.
Address, phone, and voluntary self-identification stay scalar fields. Self-identification fields carry sensitive: true, and Jobo never infers their answers. Build answers from the displayed label, provider field ID, type, options, and constraints, not from inferred semantic metadata.

Failure and correction codes

Terminal applications expose failure: {code, message, retryable}. Stable failure codes include: retryable is authoritative for each failure. submission_unconfirmed is not safely retryable, because the employer may already have the application. Until the correction limit runs out, file and ATS value problems come back in command_errors instead, with codes such as unsafe_file_url, file_upload_failed, invalid_file_type, ats_field_rejected, and ats_fill_failed. Answer with a complete corrected snapshot for the step.