Skip to main content
The profile is the applicant record behind every automated application. It is resume-first: importing a resume fills contact, location, links, work_experience, education, and memories automatically, so the explicit sections carry only what a resume cannot state. The same nested shape is used everywhere:
PATCH is a section-level replace: every top-level key present in the body replaces that entire section; absent keys are untouched. Send {} (or [] for arrays) to clear a section — except contact, which always requires first_name, last_name, and email whenever it is present. cover_letter_template follows the same idea at field level — absent leaves it untouched, "" clears it.
All enum values are lowercase snake_case strings.

Top level

FieldTypeNullableDescription
id (read-only)uuidNoStable profile identifier.
namestringNoFriendly label (e.g. "Default", "Tech applications"). Defaults to "Default"; max 100 chars.
status (read-only)profile statusNoLifecycle driven by the async resume import.
import_error (read-only)string | nullYesWhy the last import failed. Only set when status is import_failed.
contactcontactNoContact details. Required on create.
locationlocationNoWhere the applicant lives.
linkslinksNoPublic profile URLs.
work_experiencework experience[]NoWork history, most recent first. Max 50 entries.
educationeducation[]NoEducation history. Max 20 entries.
eligibilityeligibilityNoWork authorization and sponsorship.
preferencespreferencesNoSalary, start date, relocation, remote preference.
self_identificationself-identificationNoVoluntary EEO responses — all optional.
memoriesstring[]NoPlain-language facts the AI uses to answer arbitrary screening questions. Max 100 × 1000 chars.
cover_letter_templatestring | nullYesOptional template the AI personalizes per job. Max 10000 chars.
resume (read-only)resume | nullYesStored resume file metadata, or null when no file has been uploaded.
created_at (read-only)date-timeNoUTC timestamp the profile was created.
updated_at (read-only)date-timeNoUTC timestamp the profile was last updated.

Profile status

ValueMeaning
readyComplete and usable for applications.
importingA resume import is building the profile — poll until it leaves this state (typically 10–30 s).
import_failedThe import failed — see import_error, then PATCH (flips back to ready) or re-import.

Contact

first_name, last_name, and email are required when creating a profile.
FieldTypeNullableDescription
first_namestringCreate: noLegal first name. Max 100 chars.
last_namestringCreate: noLegal last name. Max 100 chars.
preferred_namestring | nullYesPreferred / chosen name when it differs from the legal first name. Max 100 chars.
emailstring (email)Create: noEmail address applications are submitted with.
phonestring | nullYesPhone number, ideally international format. Max 50 chars.
date_of_birthdate | nullYesYYYY-MM-DD. Explicit input only — never parsed from the resume; only used when a form explicitly asks.

Location

All fields optional.
FieldTypeNullableDescription
address_line1string | nullYesStreet address. Max 200 chars.
citystring | nullYesCity. Max 200 chars.
statestring | nullYesState, province, or region. Max 200 chars.
postal_codestring | nullYesPostal / ZIP code. Max 20 chars.
countrystring | nullYesCountry name. Max 200 chars.
Each link must be an absolute http(s) URL, max 500 chars.
FieldTypeNullableDescription
linkedinstring | nullYesLinkedIn profile URL.
githubstring | nullYesGitHub profile URL.
portfoliostring | nullYesPortfolio URL.
websitestring | nullYesPersonal website URL.

Work experience

Array of entries, most recent first. Max 50 entries.
FieldTypeNullableDescription
companystring | nullYesEmployer name.
titlestring | nullYesJob title held.
locationstring | nullYesWhere the role was based.
start_datestring | nullYesYYYY or YYYY-MM.
end_datestring | nullYesYYYY or YYYY-MM. Ignored when is_current is true.
is_currentbooleanNoTrue when this is the current role.
descriptionstring | nullYesWhat the role involved. Max 4000 chars.

Education

Array of entries. Max 20 entries.
FieldTypeNullableDescription
schoolstring | nullYesInstitution name.
degreestring | nullYesDegree obtained or in progress.
field_of_studystring | nullYesMajor / field of study.
start_datestring | nullYesYYYY or YYYY-MM.
end_datestring | nullYesGraduation (or expected graduation) as YYYY or YYYY-MM.
gpastring | nullYesFree-form GPA, e.g. "3.8" or "3.8/4.0". Max 20 chars.

Eligibility

Work-authorization facts a resume cannot state.
FieldTypeNullableDescription
work_authorized_countriesstring[]NoCountry names the applicant may legally work in. Max 50 entries.
requires_sponsorshipboolean | nullYesWhether the applicant now or in the future requires visa sponsorship.

Preferences

FieldTypeNullableDescription
salary_expectationsalary expectation | nullYesExpected compensation, or null to leave salary questions to the AI.
earliest_start_datedate | nullYesYYYY-MM-DD the applicant could start.
willing_to_relocateboolean | nullYesWhether the applicant is open to relocating.
remote_preferenceenum | nullYesSee remote preference.
preferred_locationsstring[]NoLocations the applicant prefers (e.g. "Austin, TX"). Max 20 entries.

Salary expectation

FieldTypeNullableDescription
amountnumberNoExpected amount. Must be greater than 0.
currencystringNoISO 4217 currency code. Default USD.
periodenumNoyear | month | hour. Default year.

Remote preference

ValueMeaning
remoteFully remote preferred.
hybridMix of remote and office.
on_siteOn-site preferred.
flexibleNo strong preference.

Self-identification

Voluntary EEO responses, quarantined in their own section. Everything here is optional — omitted or prefer_not_to_say values make the applicant decline those questions on application forms.
FieldTypeNullableDescription
genderenum | nullYesSee gender.
ethnicityenum | nullYesSee ethnicity.
veteran_statusenum | nullYesSee veteran status. US forms.
disability_statusenum | nullYesSee self-ID answer.
lgbtq_statusenum | nullYesSee self-ID answer.

Gender

Value
male
female
non_binary
prefer_not_to_say

Ethnicity

Categories match the option sets ATS vendors use on EEO forms.
Value
black_or_african_american
east_asian
southeast_asian
south_asian
hispanic_or_latino
middle_eastern
native_hawaiian_or_pacific_islander
american_indian_or_alaska_native
white
two_or_more
prefer_not_to_say

Veteran status

Value
veteran
not_a_veteran
prefer_not_to_say

Self-ID answer

Used by both disability_status and lgbtq_status.
Value
yes
no
prefer_not_to_say

Memories

A plain string array — one fact per entry, max 100 entries of 1000 characters each. The AI reads these as context when answering arbitrary screening questions (“Why do you want to work here?”, “Describe your experience with X”). Resume import generates them automatically; add your own via PATCH.
"memories": [
  "8 years of backend engineering experience",
  "Key skills: Go, Kubernetes, PostgreSQL",
  "Led a team of 6 engineers at my last role"
]

Resume (read-only)

Managed through the resume file endpoints (upload / download / delete). null when no file has been uploaded.
FieldTypeDescription
file_namestringOriginal file name.
content_typestringMIME type of the stored file.
size_bytesintegerFile size in bytes.
uploaded_atdate-timeUTC timestamp the file was uploaded.
download_urlstringHost-relative URL that streams the file back.
Upload (PUT .../resume) accepts PDF, DOC, DOCX, TXT, RTF, MD; import (POST /profiles/import) accepts PDF, DOCX, TXT, RTF, MD (legacy binary .doc cannot be text-extracted). Max 10 MB.

Application enums

Application status

ValueTerminalMeaning
runningNoBeing filled and submitted — keep polling.
submittedYesSuccessfully submitted.
failedYesEnded without submitting — see failure_reason and error.

Failure reason

Set only when an application’s status is failed.
ValueMeaning
expiredThe browser session or job posting expired mid-run.
max_steps_reachedThe form had more pages/steps than the run allows.
stalledThe flow stopped making progress.
no_fields_foundNo fillable form fields were discovered on the page.
no_answers_generatedThe AI could not produce answers for the discovered fields.
errorAny other error — see error for detail.
login_required (reserved)The ATS demanded a login or account registration.
captcha_required (reserved)A CAPTCHA blocked the flow.
redirected (reserved)The page redirected to an external domain mid-flow.
redirect_required (reserved)The application continues on a different ATS the run could not follow.
unsupported_provider (reserved)No supported ATS provider matched the URL.
Reserved values are part of the wire contract but not yet emitted — those situations report error until dedicated detection ships. Treat the enum as open: handle unrecognized values like error.

Session enums

Interactive-session flow states (form_ready, next_available, submit_ready, submitted, login_required, captcha_required, expired, redirected, redirect_required, error) are documented in Flow states, and the 17 form-field types in Field types. GET /api/auto-apply/sessions/{id} additionally reports:
FieldValues
statepending | running | completed | failed | closed
modeinteractive (sessions API) | automated (behind an application run)