curl -X POST "https://connect.jobo.world/api/auto-apply/applications/6f9227f6-b704-4b58-a553-79773a041933/answers" \
-H "X-Api-Key: $JOBO_API_KEY" \
-H "Content-Type: application/json" \
--max-time 600 \
-d '{"answers": [{"field_id": "first_name", "value": "Ada"}]}'
import requests
url = "https://connect.jobo.world/api/auto-apply/applications/{id}/answers"
payload = {
"answers": [
{
"field_id": "first_name",
"value": "Ada"
},
{
"field_id": "email",
"value": "ada@example.com"
}
],
"correction_round": 0
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
answers: [
{field_id: 'first_name', value: 'Ada'},
{field_id: 'email', value: 'ada@example.com'}
],
correction_round: 0
})
};
fetch('https://connect.jobo.world/api/auto-apply/applications/{id}/answers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://connect.jobo.world/api/auto-apply/applications/{id}/answers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'answers' => [
[
'field_id' => 'first_name',
'value' => 'Ada'
],
[
'field_id' => 'email',
'value' => 'ada@example.com'
]
],
'correction_round' => 0
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://connect.jobo.world/api/auto-apply/applications/{id}/answers"
payload := strings.NewReader("{\n \"answers\": [\n {\n \"field_id\": \"first_name\",\n \"value\": \"Ada\"\n },\n {\n \"field_id\": \"email\",\n \"value\": \"ada@example.com\"\n }\n ],\n \"correction_round\": 0\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://connect.jobo.world/api/auto-apply/applications/{id}/answers")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"answers\": [\n {\n \"field_id\": \"first_name\",\n \"value\": \"Ada\"\n },\n {\n \"field_id\": \"email\",\n \"value\": \"ada@example.com\"\n }\n ],\n \"correction_round\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://connect.jobo.world/api/auto-apply/applications/{id}/answers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"answers\": [\n {\n \"field_id\": \"first_name\",\n \"value\": \"Ada\"\n },\n {\n \"field_id\": \"email\",\n \"value\": \"ada@example.com\"\n }\n ],\n \"correction_round\": 0\n}"
response = http.request(request)
puts response.read_body{
"api_version": "2026-08-31",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"job_id": "<string>",
"apply_url": "<string>",
"provider_id": "<string>",
"provider_name": "<string>",
"status": "queued",
"cancel_requested": true,
"status_updated_at": "2023-11-07T05:31:56Z",
"queued_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"submitted_at": "2023-11-07T05:31:56Z",
"failed_at": "2023-11-07T05:31:56Z",
"canceled_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"provider_version": "<string>",
"matcher_revision": 123,
"catalog_revision": 123,
"settings_revision": 123,
"provider_receipt_id": "<string>",
"submission_confirmation_kind": "provider_receipt",
"failure": {
"code": "submission_unconfirmed",
"message": "<string>",
"retryable": true
},
"canceled_by": "<string>",
"steps": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sequence": 2,
"status": "answered",
"correction_round": 1,
"fields": [
{
"field_id": "<string>",
"type": "text",
"label": "<string>",
"required": true,
"requires_answer": true,
"constraints": {},
"sensitive": true,
"format": "<string>"
}
],
"answers": [
{
"field_id": "<string>",
"value": "<string>"
}
],
"command_errors": [
{
"field_id": "<string>",
"item_index": 1,
"field_key": "<string>",
"code": "invalid_option",
"message": "<string>"
}
],
"created_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"field_count": 1,
"answer_count": 1,
"answers_expire_at": "2023-11-07T05:31:56Z"
}
],
"current_step": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sequence": 2,
"status": "answered",
"correction_round": 1,
"fields": [
{
"field_id": "<string>",
"type": "text",
"label": "<string>",
"required": true,
"requires_answer": true,
"constraints": {},
"sensitive": true,
"format": "<string>"
}
],
"answers": [
{
"field_id": "<string>",
"value": "<string>"
}
],
"command_errors": [
{
"field_id": "<string>",
"item_index": 1,
"field_key": "<string>",
"code": "invalid_option",
"message": "<string>"
}
],
"created_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"field_count": 1,
"answer_count": 1,
"answers_expire_at": "2023-11-07T05:31:56Z"
}
}{
"api_version": "2026-08-31",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"job_id": "<string>",
"apply_url": "<string>",
"provider_id": "<string>",
"provider_name": "<string>",
"status": "queued",
"cancel_requested": true,
"status_updated_at": "2023-11-07T05:31:56Z",
"queued_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"submitted_at": "2023-11-07T05:31:56Z",
"failed_at": "2023-11-07T05:31:56Z",
"canceled_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"provider_version": "<string>",
"matcher_revision": 123,
"catalog_revision": 123,
"settings_revision": 123,
"provider_receipt_id": "<string>",
"submission_confirmation_kind": "provider_receipt",
"failure": {
"code": "submission_unconfirmed",
"message": "<string>",
"retryable": true
},
"canceled_by": "<string>",
"steps": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sequence": 2,
"status": "answered",
"correction_round": 1,
"fields": [
{
"field_id": "<string>",
"type": "text",
"label": "<string>",
"required": true,
"requires_answer": true,
"constraints": {},
"sensitive": true,
"format": "<string>"
}
],
"answers": [
{
"field_id": "<string>",
"value": "<string>"
}
],
"command_errors": [
{
"field_id": "<string>",
"item_index": 1,
"field_key": "<string>",
"code": "invalid_option",
"message": "<string>"
}
],
"created_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"field_count": 1,
"answer_count": 1,
"answers_expire_at": "2023-11-07T05:31:56Z"
}
],
"current_step": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sequence": 2,
"status": "answered",
"correction_round": 1,
"fields": [
{
"field_id": "<string>",
"type": "text",
"label": "<string>",
"required": true,
"requires_answer": true,
"constraints": {},
"sensitive": true,
"format": "<string>"
}
],
"answers": [
{
"field_id": "<string>",
"value": "<string>"
}
],
"command_errors": [
{
"field_id": "<string>",
"item_index": 1,
"field_key": "<string>",
"code": "invalid_option",
"message": "<string>"
}
],
"created_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"field_count": 1,
"answer_count": 1,
"answers_expire_at": "2023-11-07T05:31:56Z"
}
}{
"errors": [
{
"field_id": "<string>",
"item_index": 1,
"field_key": "<string>",
"code": "invalid_option",
"message": "<string>"
}
],
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}Submit answers
Auto Apply is an invite-only beta.
The one write in the application loop: submit the complete answer snapshot for the current answerable step.
Answers are validated synchronously against the step’s fields before anything touches the employer’s form. Invalid answers return 400 with per-field errors and cost nothing - no correction round is consumed.
Valid answers are accepted exactly once per (step, correction round). Jobo then fills the form and advances it - intermediate pages auto-continue and the final page auto-submits; the caller never chooses. The request BLOCKS until the next decision point: the next step’s fields (awaiting_answers with a new current_step), the same step back as a correction round (correction_round incremented, command_errors carrying what the employer’s ATS rejected), or the terminal result (submitted or failed). The hold is capped at 90 seconds per request (202 + snapshot past that); keep your HTTP client timeout above 120 seconds.
Answer within the step’s answers_expire_at deadline (about 5 minutes; 90 seconds for one-time verification codes) - a live browser is holding the employer’s form open. Past it, most applications release their browser and keep waiting for your answers (answers_expire_at becomes null; the overall queue timeout still applies, and resuming takes a little longer while a fresh browser picks the form back up). Verification-code steps, and providers that cannot resume on a fresh browser, instead fail with verification_timeout / answers_timeout.
A repeated POST for an already-accepted round attaches to the in-flight wait instead of erroring (its payload is ignored), so retrying after a dropped connection is safe.
curl -X POST "https://connect.jobo.world/api/auto-apply/applications/6f9227f6-b704-4b58-a553-79773a041933/answers" \
-H "X-Api-Key: $JOBO_API_KEY" \
-H "Content-Type: application/json" \
--max-time 600 \
-d '{"answers": [{"field_id": "first_name", "value": "Ada"}]}'
import requests
url = "https://connect.jobo.world/api/auto-apply/applications/{id}/answers"
payload = {
"answers": [
{
"field_id": "first_name",
"value": "Ada"
},
{
"field_id": "email",
"value": "ada@example.com"
}
],
"correction_round": 0
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
answers: [
{field_id: 'first_name', value: 'Ada'},
{field_id: 'email', value: 'ada@example.com'}
],
correction_round: 0
})
};
fetch('https://connect.jobo.world/api/auto-apply/applications/{id}/answers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://connect.jobo.world/api/auto-apply/applications/{id}/answers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'answers' => [
[
'field_id' => 'first_name',
'value' => 'Ada'
],
[
'field_id' => 'email',
'value' => 'ada@example.com'
]
],
'correction_round' => 0
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://connect.jobo.world/api/auto-apply/applications/{id}/answers"
payload := strings.NewReader("{\n \"answers\": [\n {\n \"field_id\": \"first_name\",\n \"value\": \"Ada\"\n },\n {\n \"field_id\": \"email\",\n \"value\": \"ada@example.com\"\n }\n ],\n \"correction_round\": 0\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://connect.jobo.world/api/auto-apply/applications/{id}/answers")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"answers\": [\n {\n \"field_id\": \"first_name\",\n \"value\": \"Ada\"\n },\n {\n \"field_id\": \"email\",\n \"value\": \"ada@example.com\"\n }\n ],\n \"correction_round\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://connect.jobo.world/api/auto-apply/applications/{id}/answers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"answers\": [\n {\n \"field_id\": \"first_name\",\n \"value\": \"Ada\"\n },\n {\n \"field_id\": \"email\",\n \"value\": \"ada@example.com\"\n }\n ],\n \"correction_round\": 0\n}"
response = http.request(request)
puts response.read_body{
"api_version": "2026-08-31",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"job_id": "<string>",
"apply_url": "<string>",
"provider_id": "<string>",
"provider_name": "<string>",
"status": "queued",
"cancel_requested": true,
"status_updated_at": "2023-11-07T05:31:56Z",
"queued_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"submitted_at": "2023-11-07T05:31:56Z",
"failed_at": "2023-11-07T05:31:56Z",
"canceled_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"provider_version": "<string>",
"matcher_revision": 123,
"catalog_revision": 123,
"settings_revision": 123,
"provider_receipt_id": "<string>",
"submission_confirmation_kind": "provider_receipt",
"failure": {
"code": "submission_unconfirmed",
"message": "<string>",
"retryable": true
},
"canceled_by": "<string>",
"steps": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sequence": 2,
"status": "answered",
"correction_round": 1,
"fields": [
{
"field_id": "<string>",
"type": "text",
"label": "<string>",
"required": true,
"requires_answer": true,
"constraints": {},
"sensitive": true,
"format": "<string>"
}
],
"answers": [
{
"field_id": "<string>",
"value": "<string>"
}
],
"command_errors": [
{
"field_id": "<string>",
"item_index": 1,
"field_key": "<string>",
"code": "invalid_option",
"message": "<string>"
}
],
"created_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"field_count": 1,
"answer_count": 1,
"answers_expire_at": "2023-11-07T05:31:56Z"
}
],
"current_step": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sequence": 2,
"status": "answered",
"correction_round": 1,
"fields": [
{
"field_id": "<string>",
"type": "text",
"label": "<string>",
"required": true,
"requires_answer": true,
"constraints": {},
"sensitive": true,
"format": "<string>"
}
],
"answers": [
{
"field_id": "<string>",
"value": "<string>"
}
],
"command_errors": [
{
"field_id": "<string>",
"item_index": 1,
"field_key": "<string>",
"code": "invalid_option",
"message": "<string>"
}
],
"created_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"field_count": 1,
"answer_count": 1,
"answers_expire_at": "2023-11-07T05:31:56Z"
}
}{
"api_version": "2026-08-31",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"job_id": "<string>",
"apply_url": "<string>",
"provider_id": "<string>",
"provider_name": "<string>",
"status": "queued",
"cancel_requested": true,
"status_updated_at": "2023-11-07T05:31:56Z",
"queued_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"submitted_at": "2023-11-07T05:31:56Z",
"failed_at": "2023-11-07T05:31:56Z",
"canceled_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"provider_version": "<string>",
"matcher_revision": 123,
"catalog_revision": 123,
"settings_revision": 123,
"provider_receipt_id": "<string>",
"submission_confirmation_kind": "provider_receipt",
"failure": {
"code": "submission_unconfirmed",
"message": "<string>",
"retryable": true
},
"canceled_by": "<string>",
"steps": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sequence": 2,
"status": "answered",
"correction_round": 1,
"fields": [
{
"field_id": "<string>",
"type": "text",
"label": "<string>",
"required": true,
"requires_answer": true,
"constraints": {},
"sensitive": true,
"format": "<string>"
}
],
"answers": [
{
"field_id": "<string>",
"value": "<string>"
}
],
"command_errors": [
{
"field_id": "<string>",
"item_index": 1,
"field_key": "<string>",
"code": "invalid_option",
"message": "<string>"
}
],
"created_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"field_count": 1,
"answer_count": 1,
"answers_expire_at": "2023-11-07T05:31:56Z"
}
],
"current_step": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sequence": 2,
"status": "answered",
"correction_round": 1,
"fields": [
{
"field_id": "<string>",
"type": "text",
"label": "<string>",
"required": true,
"requires_answer": true,
"constraints": {},
"sensitive": true,
"format": "<string>"
}
],
"answers": [
{
"field_id": "<string>",
"value": "<string>"
}
],
"command_errors": [
{
"field_id": "<string>",
"item_index": 1,
"field_key": "<string>",
"code": "invalid_option",
"message": "<string>"
}
],
"created_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"field_count": 1,
"answer_count": 1,
"answers_expire_at": "2023-11-07T05:31:56Z"
}
}{
"errors": [
{
"field_id": "<string>",
"item_index": 1,
"field_key": "<string>",
"code": "invalid_option",
"message": "<string>"
}
],
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"api_version": "2026-08-31"
}Authorizations
API key provided by Jobo
Path Parameters
Application ID.
Body
The complete answer snapshot for the application's current answerable step. Validated synchronously; accepted exactly once per (step, correction round).
Response
The next decision point: the next step's fields, a correction round on the same step, or the terminal result.
Version of the profileless Auto Apply API contract.
2026-08-31 "2026-08-31"
Stable application ID.
Supplied Jobo job ID, or null when apply_url was supplied directly.
Resolved application URL.
Stable provider identifier selected at intake.
Provider display name captured at intake.
Current durable application state.
queued, running, awaiting_answers, submitted, failed, canceled Whether cancellation has been requested.
submitted_at, failed_at, or canceled_at, whichever is set.
Provider implementation version captured at intake.
Non-sensitive request or submission identifier issued by the provider, suitable for support tracing when present.
256Authoritative evidence used to confirm the submitted state.
provider_receipt, confirmation_page Show child attributes
Show child attributes
Actor that completed cancellation, when applicable.
Show child attributes
Show child attributes
The step currently awaiting answers - the one to answer next. Null while the application is queued, running between steps, or terminal.
Show child attributes
Show child attributes

