Skip to content

Create Job Application

The Create Job Application endpoint lets an external integration submit a candidate’s application to a specific Nextal job. It accepts a single canonical payload derived from the rich Indeed application model, so any integration source can post the same body shape.

Endpoint

POST https://public-api.nextal.com/{source}/{tenant}/{jobId}
Content typeRole
application/jsonPrimary — recommended for all new integrations
application/xmlSecondary — supported for backward compatibility

Path parameters

ParameterTypeRequiredDescription
sourceStringYesThe integration source/provider key (for example indeed). It identifies where the application originates. It does not change the request body schema.
tenantStringYesThe Nextal tenant the job belongs to.
jobIdStringYesThe target job. The server injects this value into the application’s job.jobId, so any jobId you place inside the body is overwritten by the path value.

How source works

The source path segment only identifies the integration that is submitting the application — it is recorded for tracking and routing. It does not alter the request body schema: every source posts the same canonical payload described below. Pass the provider key your integration was assigned (for example indeed), the target tenant, and the jobId of the job being applied to.

Request body

The body is a single canonical application object. All fields are optional unless noted; unknown or null fields are omitted. The top-level structure is:

FieldTypeRequiredDescription
localeStringNoLocale of the application (for example en, fr_CA).
appliedOnMillisLongNoEpoch timestamp (milliseconds) of when the application was submitted.
jobObject (Job)NoThe job the candidate applied to. See Job object.
applicantObject (Applicant)YesThe candidate and their resume. See Applicant object.
screenerQuestionsAndAnswersObject (QuestionsAndAnswers)NoScreener questions and the candidate’s answers. See QuestionsAndAnswers object.
demographicQuestionsAndAnswersObject (QuestionsAndAnswers)NoDemographic questions and answers (same shape as screener). See QuestionsAndAnswers object.
analyticsObject (Analytics)NoSource/device analytics for the application. See Analytics object.

Job object

The jobId here is overwritten by the jobId path parameter.

FieldTypeRequiredDescription
jobIdStringNoTarget job id. Overwritten by the path jobId.
jobTitleStringNoJob title at the source.
jobCompanyStringNoCompany name at the source.
jobLocationStringNoJob location at the source.
jobUrlStringNoURL of the job posting at the source.
jobMetaStringNoOpaque source metadata.

Applicant object

FieldTypeRequiredDescription
idStringNoApplicant id at the source.
fullNameStringNoCandidate full name.
emailStringNoCandidate email address.
phoneNumberStringNoCandidate phone number.
coverletterStringNoCover letter text.
resumeObject (Resume)NoThe candidate resume. See Resume object.

Resume object

Provide the resume in one or more representations; a binary file plus structured json is the most complete.

FieldTypeRequiredDescription
textStringNoPlain-text resume.
hrXmlStringNoHR-XML resume representation.
htmlStringNoHTML resume representation.
jsonObject (Json)NoStructured resume. See Resume json object.
fileObject (File)NoBinary resume file. See File object.

File object

FieldTypeRequiredDescription
contentTypeStringNoMIME type of the file (for example application/pdf).
dataStringNoBase64-encoded file content.
fileNameStringNoOriginal file name.

Resume json object

Structured resume data.

FieldTypeRequiredDescription
firstNameStringNoFirst name.
lastNameStringNoLast name.
headlineStringNoProfessional headline.
summaryStringNoProfessional summary.
publicProfileUrlStringNoPublic profile URL.
additionalInfoStringNoAdditional free-form information.
phoneNumberStringNoPhone number.
locationObject (Location)NoCandidate location. See Location object.
skillsStringNoSkills (free-form string).
positionsObject (Positions)NoWork history. List wrapper, see List wrappers.
educationsObject (Educations)NoEducation history. List wrapper.
linksObject (Links)NoExternal links. List wrapper.
awardsObject (Awards)NoAwards. List wrapper.
certificationsObject (Certifications)NoCertifications. List wrapper.
associationsObject (Associations)NoProfessional associations. List wrapper.
patentsObject (Patents)NoPatents. List wrapper.
publicationsObject (Publications)NoPublications. List wrapper.
militaryServicesObject (MilitaryServices)NoMilitary service records. List wrapper.

Location object

FieldTypeRequiredDescription
cityStringNoCity.
countryStringNoCountry.
postalCodeStringNoPostal/ZIP code.

List wrappers

Every collection inside resume.json (positions, educations, links, awards, certifications, associations, patents, publications, militaryServices) uses the same wrapper shape:

FieldTypeRequiredDescription
_totalLongNoNumber of entries in values.
valuesList of objectsNoThe entries; the element type depends on the collection (see below).

positions[].values[] (PositionValues)

FieldTypeDescription
titleStringJob title.
companyStringEmployer.
locationStringLocation.
startDateMonthStringStart month.
startDateYearStringStart year.
endDateMonthStringEnd month.
endDateYearStringEnd year.
endCurrentBooleantrue if this is the current position.
descriptionStringDescription.

educations[].values[] (EducationValues)

FieldTypeDescription
degreeStringDegree obtained.
fieldStringField of study.
schoolStringSchool name.
locationStringSchool location.
startDateStringStart date.
endDateStringEnd date.
endCurrentBooleantrue if currently enrolled.

links[].values[] (LinkValues)

FieldTypeDescription
urlStringThe link URL.

awards[].values[] (AwardValues)

FieldTypeDescription
titleStringAward title.
dateMonthStringAward month.
dateYearStringAward year.
descriptionStringDescription.

certifications[].values[] (CertificationValues)

FieldTypeDescription
titleStringCertification title.
startDateMonthStringStart month.
startDateYearStringStart year.
endDateMonthStringEnd month.
endDateYearStringEnd year.
endCurrentBooleantrue if currently valid.
descriptionStringDescription.

associations[].values[] (AssociationValues)

FieldTypeDescription
titleStringAssociation title.
startDateMonthStringStart month.
startDateYearStringStart year.
endDateMonthStringEnd month.
endDateYearStringEnd year.
endCurrentBooleantrue if currently a member.
descriptionStringDescription.

patents[].values[] (PatentValues)

FieldTypeDescription
patentNumberStringPatent number.
titleStringPatent title.
urlStringPatent URL.
dateMonthStringDate month.
dateYearStringDate year.
descriptionStringDescription.

publications[].values[] (PublicationValues)

FieldTypeDescription
titleStringPublication title.
urlStringPublication URL.
dateDayStringDate day.
dateMonthStringDate month.
dateYearStringDate year.
descriptionStringDescription.

militaryServices[].values[] (MilitaryServiceValues)

FieldTypeDescription
serviceCountryStringCountry of service.
branchStringBranch of service.
rankStringRank attained.
startDateMonthStringStart month.
startDateYearStringStart year.
endDateMonthStringEnd month.
endDateYearStringEnd year.
endCurrentBooleantrue if currently serving.
commendationsStringCommendations.
descriptionStringDescription.

QuestionsAndAnswers object

Used by both screenerQuestionsAndAnswers and demographicQuestionsAndAnswers.

FieldTypeRequiredDescription
urlStringNoSource URL where the questions were retrieved.
retrievedOnMillisLongNoEpoch timestamp (milliseconds) when the questions were retrieved.
questionsAndAnswersList of objects (QuestionsAndAnswer)NoOne entry per question/answer pair.

questionsAndAnswers[] (QuestionsAndAnswer)

FieldTypeRequiredDescription
questionObject (Question)NoThe question metadata. See Question object.
answerString, Object, or ListNoThe candidate’s answer. For free-text/number/date questions it is a string; for a single select it is an object { "label": ..., "value": ... }; for a multi-select it is a list of such objects.

Question object

FieldTypeRequiredDescription
idStringNoQuestion id.
questionStringNoThe question text.
typeStringNoQuestion type (for example text, number, date, select, multiselect).
requiredBooleanNoWhether an answer is required.
formatStringNoExpected answer format.
minStringNoMinimum value/length constraint.
maxStringNoMaximum value/length constraint.
limitStringNoAnswer limit.
optionsList of objects (Option)NoSelectable options, each { "label": ..., "value": ... }.
hierarchicalOptionsListNoHierarchical options, when applicable.

Analytics object

FieldTypeRequiredDescription
deviceStringNoDevice used to apply.
ipStringNoApplicant IP address.
refererStringNoReferer URL.
userAgentStringNoBrowser user agent.
sponsoredStringNoWhether the application came from a sponsored listing.
targetedApplyAdStringNoTargeted apply ad identifier.

Examples

A complete request is shown in JSON first, then the equivalent XML.

{
"locale": "en",
"appliedOnMillis": 1718380800000,
"job": {
"jobTitle": "Senior Software Engineer",
"jobCompany": "Acme Corp",
"jobLocation": "Montréal, QC",
"jobUrl": "https://example.com/jobs/123",
"jobMeta": "src=indeed"
},
"applicant": {
"id": "appl_1029",
"fullName": "Jane Doe",
"email": "jane.doe@example.com",
"phoneNumber": "+1-514-555-0142",
"coverletter": "I am excited to apply for this role...",
"resume": {
"text": "Jane Doe — Senior Software Engineer ...",
"json": {
"firstName": "Jane",
"lastName": "Doe",
"headline": "Senior Software Engineer",
"summary": "10+ years building distributed systems.",
"publicProfileUrl": "https://example.com/in/janedoe",
"phoneNumber": "+1-514-555-0142",
"location": {
"city": "Montréal",
"country": "CA",
"postalCode": "H2X 1Y4"
},
"skills": "Java, Spring Boot, MongoDB, Kubernetes",
"positions": {
"_total": 1,
"values": [
{
"title": "Senior Software Engineer",
"company": "Globex",
"location": "Montréal, QC",
"startDateMonth": "01",
"startDateYear": "2019",
"endCurrent": true,
"description": "Lead backend engineer."
}
]
},
"educations": {
"_total": 1,
"values": [
{
"degree": "B.Sc. Computer Science",
"field": "Computer Science",
"school": "McGill University",
"location": "Montréal, QC",
"startDate": "2011",
"endDate": "2015",
"endCurrent": false
}
]
},
"links": {
"_total": 1,
"values": [
{ "url": "https://github.com/janedoe" }
]
}
},
"file": {
"contentType": "application/pdf",
"fileName": "jane-doe-resume.pdf",
"data": "JVBERi0xLjQKJ..."
}
}
},
"screenerQuestionsAndAnswers": {
"url": "https://example.com/jobs/123/questions",
"retrievedOnMillis": 1718380000000,
"questionsAndAnswers": [
{
"question": {
"id": "q1",
"question": "Are you legally authorized to work in Canada?",
"type": "select",
"required": true,
"options": [
{ "label": "Yes", "value": "yes" },
{ "label": "No", "value": "no" }
]
},
"answer": { "label": "Yes", "value": "yes" }
},
{
"question": {
"id": "q2",
"question": "Years of experience with Java?",
"type": "number",
"required": true
},
"answer": "10"
}
]
},
"demographicQuestionsAndAnswers": {
"questionsAndAnswers": [
{
"question": {
"id": "d1",
"question": "How did you hear about us?",
"type": "text",
"required": false
},
"answer": "Indeed"
}
]
},
"analytics": {
"device": "desktop",
"ip": "203.0.113.7",
"referer": "https://www.indeed.com",
"userAgent": "Mozilla/5.0",
"sponsored": "false",
"targetedApplyAd": "ad_55"
}
}

Responses & errors

On success the endpoint returns HTTP 200 OK with an empty body — the application is accepted and queued for processing into the target tenant. There is no response payload.

StatusMeaning
200 OKApplication accepted.
400 Bad RequestThe body is malformed or fails validation (for example missing applicant data, unparseable JSON/XML).
404 Not FoundThe source, tenant, or jobId could not be resolved.
415 Unsupported Media TypeThe Content-Type is neither application/json nor application/xml.
500 Internal Server ErrorUnexpected processing failure.

Error bodies follow the requested content type. Examples — JSON first, then XML.

{
"timestamp": "2026-06-14T12:00:00.000+00:00",
"status": 400,
"error": "Bad Request",
"message": "Malformed application body",
"path": "/indeed/demo/5c875c8b2c17ca56a9806c9f"
}

Migration

This generalized endpoint supersedes the legacy provider-specific apply endpoints — the Indeed indeed/{tenant}/{jobId} and Neuvoo neuvoo/{tenant}/{jobId} apply endpoints. Those remain documented for backward compatibility under Legacy → Job Applications (v1) → Create Job Application.

New integrations should target {source}/{tenant}/{jobId} with the canonical payload above.