Back to home
Auto Apply API

Automate job applications at scale.

Session-based API for discovering form fields, submitting answers, and completing applications across 25+ ATS providers—programmatically.

API Overview Under Maintenance
3endpoints
25+ATS providers supported
12field types handled
9flow states

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.

01

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/start
02

Read 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.

03

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-answers
04

Close 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.

POST/api/auto-apply/start

Start Session.

Navigate to a job application URL, detect the ATS provider, and return all form fields with their types, labels, and validation requirements.

Provider detectionField discoverySession creation
POST/api/auto-apply/set-answers

Set Answers.

Submit form field answers for an active session. The API fills the form, validates inputs, and advances to the next page or submits.

Form fillingValidationMulti-page support
DELETE/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.

Resource cleanupSession management
Start Session

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_urlstringrequired

Job application URL for a supported ATS provider. The API will detect the provider and navigate to the form.

Response fields

session_iduuid

Unique session identifier. Pass this to all subsequent calls.

provider_idstring

Detected ATS provider ID (e.g., "greenhouse", "lever").

statusstring

Current flow state. "FormReady" means fields are available for answering.

is_terminalboolean

Whether 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
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"
  }'
Response200 OK
{
  "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
    }
  ]
}
Set Answers

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_iduuidrequired

Session ID returned by the start endpoint.

answersFieldAnswer[]required

Array of field answers. Each answer includes field_id, type, and value.

FieldAnswer object

field_idstringrequired

The field_id from the discovered form field.

typestringrequired

The field type (Text, File, Select, etc.).

valuestringrequired

The answer value. Format depends on field type.

selectorstring

CSS selector override for custom form layouts.

typeahead_selectionstring

For Typeahead fields: the exact text to select from dropdown results.

clear_firstboolean

Clear existing field value before entering the new one.

cURL
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" }
    ]
  }'
Response — Next Page200 OK
{
  "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" }
  ]
}
Response — Submitted200 OK
{
  "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.

Text

Plain string value

TextArea

Multi-line string value

Select

Option value from the options array

MultiSelect

Comma-separated option values

Radio

Single option value

Checkbox

"true" or "false"

File

Base64-encoded file content

Date

ISO 8601 date string

Number

Numeric string value

Typeahead

Search text + typeahead_selection

Toggle

"true" or "false"

RichText

HTML or plain text content

9 flow states.

Track the lifecycle of each session. Terminal states end the flow; non-terminal states require additional interaction.

StatusTerminalRecommended Action
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.

GreenhouseLeverWorkdayiCIMSSmartRecruitersAshbyBambooHRWorkableJazzHRRecruiteeTeamtailorBreezyHRPinpointComeetFreshteamJobviteTaleoSuccessFactorsPersonioRipplingADPPaylocityDayforceHomerunJobScore
Full Example

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.

Python
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)
Ready to integrate

Automate applications today.

One API. 25+ ATS providers. No browser automation to build or maintain.