Automate job applications at scale.
Session-based API for discovering form fields, submitting answers, and completing applications across 25+ ATS providers—programmatically.
Four steps to submit an application.
The Auto Apply API uses a session-based model. Start a session, discover form fields, submit answers, and track submission status.
Start a session.
Pass the job application URL. The API navigates to the page, detects the ATS provider, and returns all form fields with types and labels.
POST /api/auto-apply/startRead form fields.
Parse the returned fields array. Each field includes field_id, type, label, required status, and current value. Build your answers based on this schema.
Submit answers.
Send your answers for the current page. The API fills the form, clicks Next or Submit, and returns the next set of fields or a terminal status.
POST /api/auto-apply/set-answersClose the session.
Once the flow reaches a terminal state (Submitted, Expired, or Error), end the session to release browser resources.
DELETE /api/auto-apply/sessions/{id}Three endpoints. Full automation.
Start a session with the application URL, submit form field answers, and end when complete—each step returns the current form state.
/api/auto-apply/startStart Session.
Navigate to a job application URL, detect the ATS provider, and return all form fields with their types, labels, and validation requirements.
/api/auto-apply/set-answersSet Answers.
Submit form field answers for an active session. The API fills the form, validates inputs, and advances to the next page or submits.
/api/auto-apply/sessions/{id}End Session.
Close an active session and release browser resources. Always call this after reaching a terminal state to prevent resource leaks.
Discover form fields automatically.
Pass a job application URL. The API navigates the page, detects the ATS provider, and returns all form fields with their types, labels, and validation requirements.
POST /api/auto-apply/start
apply_urlstringrequiredJob application URL for a supported ATS provider. The API will detect the provider and navigate to the form.
Response fields
session_iduuidUnique session identifier. Pass this to all subsequent calls.
provider_idstringDetected ATS provider ID (e.g., "greenhouse", "lever").
statusstringCurrent flow state. "FormReady" means fields are available for answering.
is_terminalbooleanWhether the flow has ended. If true, no more interactions are needed.
fieldsFormFieldInfo[]Array of form fields with field_id, type, label, required, value, options.
validation_errorsstring[]List of validation errors from the previous submission attempt.
curl -X POST https://connect.jobo.world/api/auto-apply/start -H "Content-Type: application/json" -H "X-Api-Key: YOUR_API_KEY" -d '{
"apply_url": "https://boards.greenhouse.io/acme/jobs/1234567"
}'{
"session_id": "e8e4cc3f-8d9f-4878-...",
"provider_id": "greenhouse",
"provider_display_name": "Greenhouse",
"success": true,
"status": "FormReady",
"is_terminal": false,
"fields": [
{
"field_id": "first_name",
"type": "Text",
"label": "First Name",
"required": true,
"value": null
},
{
"field_id": "resume",
"type": "File",
"label": "Resume/CV",
"required": true,
"value": null
}
]
}Submit form answers and advance.
Send field answers for the current page. The API fills the form, validates inputs, and returns the next page of fields or confirms submission.
POST /api/auto-apply/set-answers
session_iduuidrequiredSession ID returned by the start endpoint.
answersFieldAnswer[]requiredArray of field answers. Each answer includes field_id, type, and value.
FieldAnswer object
field_idstringrequiredThe field_id from the discovered form field.
typestringrequiredThe field type (Text, File, Select, etc.).
valuestringrequiredThe answer value. Format depends on field type.
selectorstringCSS selector override for custom form layouts.
typeahead_selectionstringFor Typeahead fields: the exact text to select from dropdown results.
clear_firstbooleanClear existing field value before entering the new one.
curl -X POST https://connect.jobo.world/api/auto-apply/set-answers -H "Content-Type: application/json" -H "X-Api-Key: YOUR_API_KEY" -d '{
"session_id": "e8e4cc3f-...",
"answers": [
{ "field_id": "first_name", "type": "Text", "value": "Jane" },
{ "field_id": "last_name", "type": "Text", "value": "Doe" },
{ "field_id": "email", "type": "Text", "value": "jane@example.com" }
]
}'{
"session_id": "e8e4cc3f-...",
"success": true,
"status": "NextAvailable",
"is_terminal": false,
"fields": [
{ "field_id": "cover_letter", "type": "TextArea", "label": "Cover Letter" },
{ "field_id": "linkedin", "type": "Text", "label": "LinkedIn Profile" }
]
}{
"session_id": "e8e4cc3f-...",
"success": true,
"status": "Submitted",
"is_terminal": true,
"fields": []
}12 field types supported.
The API handles text inputs, file uploads, dropdowns, typeahead searches, date pickers, and more—each with a consistent value format.
TextPlain string value
TextAreaMulti-line string value
SelectOption value from the options array
MultiSelectComma-separated option values
RadioSingle option value
Checkbox"true" or "false"
FileBase64-encoded file content
DateISO 8601 date string
NumberNumeric string value
TypeaheadSearch text + typeahead_selection
Toggle"true" or "false"
RichTextHTML or plain text content
9 flow states.
Track the lifecycle of each session. Terminal states end the flow; non-terminal states require additional interaction.
FormReadyNoRead fields array and submit answers via set-answers.NextAvailableNoMore form pages. Read new fields and submit answers again.SubmitReadyNoFinal page. Submit last answers to complete the application.SubmittedYesApplication submitted. End the session.LoginRequiredYesATS requires login. Cannot proceed programmatically.CaptchaRequiredYesCAPTCHA detected. Cannot proceed programmatically.ExpiredYesSession timed out. Start a new session.RedirectRequiredYesExternal redirect detected. Handle manually.ErrorYesAn error occurred. Check the error field for details.25+ ATS providers supported.
The API automatically detects the ATS provider from the apply URL. Support covers major enterprise and mid-market platforms.
End-to-end workflow.
Start a session, loop through form pages, submit answers for each page, and close the session—all in a single script.
import requests
API_BASE = "https://connect.jobo.world"
HEADERS = {
"Content-Type": "application/json",
"X-Api-Key": "YOUR_API_KEY"
}
# 1. Start session
resp = requests.post(f"{API_BASE}/api/auto-apply/start", headers=HEADERS, json={
"apply_url": "https://boards.greenhouse.io/acme/jobs/1234567"
})
data = resp.json()
session_id = data["session_id"]
# 2. Loop through form pages
while not data.get("is_terminal"):
fields = data.get("fields", [])
# Build answers for each field
answers = []
for field in fields:
answers.append({
"field_id": field["field_id"],
"type": field["type"],
"value": get_answer_for_field(field) # Your logic here
})
# Submit answers
resp = requests.post(f"{API_BASE}/api/auto-apply/set-answers", headers=HEADERS, json={
"session_id": session_id,
"answers": answers
})
data = resp.json()
# 3. Check final status
if data["status"] == "Submitted":
print(f"Application submitted for session {session_id}")
# 4. End session (release resources)
requests.delete(f"{API_BASE}/api/auto-apply/sessions/{session_id}", headers=HEADERS)Automate applications today.
One API. 25+ ATS providers. No browser automation to build or maintain.