Get Job Data API
Retrieves the complete data payload for an onboarding job by its jobId.
The response body returns the application payload directly — identical to the webhook payload format, without the top-level event envelope object.
Use this endpoint when you want to pull results on your own schedule: as a fallback while webhooks are unconfigured or your listener is down, to backfill after an outage, or to re-read an application at any later time. Webhook delivery is the push equivalent and carries the same body; see Webhooks Overview.
Endpoint
POST https://portal.idmission.com/api/get-job-data
Content-Type: application/json
X-Api-Key-Id: urn:apikeysv1:prod:region:company:YOUR_KEY_UUID
X-Api-Key-Secret: YOUR_API_KEY_SECRETCall this endpoint from your server only. Never expose the API key secret in client-side code or mobile apps.
Authentication
Send the API key as two request headers:
| Header | Required | Description |
|---|---|---|
X-Api-Key-Id | Yes | API key identifier (URN format) |
X-Api-Key-Secret | Yes | API key secret |
Credentials are not accepted in the request body. Sending them there returns HTTP 401.
OnBo validates the key and restricts job access strictly to the key’s bound company. Requesting a jobId that belongs to another company returns HTTP 404.
Request body
Send a JSON object containing the target jobId:
{
"jobId": "019fd6b7-3def-7ece-bd47-788508d3424d"
}Fields
| Field | Required | Type | Description |
|---|---|---|---|
jobId | Yes | String | Unique job identifier returned when the job was created |
The jobId is passed in the request body (rather than URL path parameters) to keep job identifiers out of access logs and query strings.
Success response (200)
Returns the application payload directly — the same body an Onbo webhook carries, without the top-level event envelope, because a pull response describes no event.
The payload is organised into a small number of top-level objects. Every one except applicationDetails is omitted when the application produced nothing for it, so treat a missing key as “nothing to report”, never as an error:
| Object | Contents |
|---|---|
applicationDetails | Which application this is — id, journey, status, timestamps. Always present. |
verificationResult | What the automated checks concluded — deduplication, face match and liveness, identity fraud. |
documents | Captured document URNs, grouped by kind. |
applicantData | Everything about the person. |
employeeI9Details | I-9 specific fields. I-9 journeys only. |
reviewDetails | The human reviewer’s decision. Only for applications that were reviewed. |
This endpoint always returns unmasked personal data, regardless of the PII mode configured for your webhook deliveries.
For the complete field dictionary — every object, field, type, and PII behavior — see the Webhook Payload Reference. The sections below summarise the response shape.
{
"applicationDetails": {
"applicationId": "019fd6b7-3def-7ece-bd47-788508d3424d",
"externalId": "REQ-2026-0084417",
"companyId": "company-xyz-123",
"journey": "employee_i9_onboarding",
"status": "approved",
"applicationCreatedAt": "2026-03-15T14:26:29Z",
"applicationUpdatedAt": "2026-03-16T10:00:00Z"
},
"verificationResult": {
"dedupResult": {
"matchFound": false,
"matchCount": 0
},
"documentValidationResult": {
"isLive": true,
"selfieLiveCheckStatus": "Live Face Detected",
"faceVerificationResult": "Verified",
"faceVerificationScore": 86.09,
"realScore": 0.921,
"verificationResult": "Approved",
"verificationResultCode": "00",
"cellPhone": false,
"cellPhoneScore": 0,
"faceMask": false,
"faceMaskScore": 0.023,
"advancedLiveness": {
"status": "AUTHENTIC",
"score": 0.15
},
"idvFaceMatchDecision": {
"Decision_FaceMatch": { "result": "OK", "stateCode": "00" },
"Decision_Expiration": { "result": "OK", "stateCode": "00" },
"Decision_Tamper": { "result": "OK", "stateCode": "00" }
}
},
"identiFraud": [
{
"serviceName": "IdentiFraud",
"profiles": [
{
"firstName": "JANE",
"lastName": "DOE",
"address": "100 MAIN STREET",
"city": "PHOENIX",
"state": "AZ",
"zipCode": "85001",
"idNumber": "•••••0000",
"dateOfBirths": "01/15/1990",
"verificationResult": {
"verified": true,
"scores": [
{ "fieldName": "name", "score": 100 }
]
}
}
]
}
]
},
"documents": {
"id": {
"idFront": "urn:documentsv1:prod:00000000-0000-0000-0000-0000000000f1",
"idBack": "urn:documentsv1:prod:00000000-0000-0000-0000-0000000000f5",
"idFrontListC": "urn:documentsv1:prod:00000000-0000-0000-0000-0000000000f8",
"idBackListC": "urn:documentsv1:prod:00000000-0000-0000-0000-0000000000f9",
"idFrontSecondListA": "urn:documentsv1:prod:00000000-0000-0000-0000-0000000000fa",
"idBackSecondListA": "urn:documentsv1:prod:00000000-0000-0000-0000-0000000000fb",
"videoIdImageFront": "urn:documentsv1:prod:00000000-0000-0000-0000-0000000000fc",
"videoIdImageBack": "urn:documentsv1:prod:00000000-0000-0000-0000-0000000000fd",
"videoData": "urn:documentsv1:prod:00000000-0000-0000-0000-0000000000fe"
},
"selfie": {
"selfie": "urn:documentsv1:prod:00000000-0000-0000-0000-0000000000f2",
"selfieImage": "urn:documentsv1:prod:00000000-0000-0000-0000-0000000000f3",
"enrollmentSelfie": "urn:documentsv1:prod:00000000-0000-0000-0000-0000000000f7",
"signatureSelfieImage": "urn:documentsv1:prod:00000000-0000-0000-0000-0000000000f6"
},
"signature": {
"signatureImage": "urn:documentsv1:prod:00000000-0000-0000-0000-000000000001",
"signatureVideo": "urn:documentsv1:prod:00000000-0000-0000-0000-0000000000f4"
},
"other": {
"i9FormPDF": "urn:documentsv1:prod:00000000-0000-0000-0000-0000000000f0"
}
},
"applicantData": {
"personalData": {
"name": "Jane Doe",
"firstName": "Jane",
"middleName": "A.",
"lastName": "Doe",
"email": "jane@example.com",
"phone": "+15551234567",
"dob": "01/15/1990",
"gender": "F",
"ssn": "123-45-6789",
"address": "100 Main Street, Apt 4B",
"addressLine1": "100 Main Street",
"addressLine2": "Apt 4B",
"city": "Phoenix",
"state": "Arizona",
"country": "UNITED STATES",
"postalCode": "85001",
"linkUniqueId": "USR-994812"
},
"addressDetails": {
"streetAddress": "100 Main Street, Apt 4B",
"city": "Phoenix",
"state": "Arizona",
"postalCode": "85001",
"country": "UNITED STATES",
"countryCode": "US"
},
"extractedIdData": {
"i9Document": "ListA",
"idType": "PP",
"idNumber": "000000000",
"idIssueDate": "04/19/2021",
"idExpirationDate": "04/18/2031",
"idExpirationDateFormatted": "04/18/2031",
"idIssueCountry": "USA",
"idCountry": "USA",
"idDateOfBirth": "01/15/1990",
"nationality": "USA",
"placeOfBirth": "ARIZONA USA",
"placeOfIssue": "DEPARTMENT OF STATE",
"ageOver18": "Y",
"idNotExpired": "Y",
"validIdNumber": "Y"
},
"attestationDetails": {
"citizenshipStatus": "citizen",
"attestedAt": "2026-03-15T14:32:00Z"
},
"consents": [
{
"consentType": "BIOMETRIC_PROCESSING",
"version": "v1",
"status": "GIVEN",
"consentedAt": "2026-03-15T14:30:00Z"
}
]
},
"employeeI9Details": {
"citizenshipStatus": "citizen",
"firstDayOfEmployment": "2026-03-15",
"secondDocumentCapture": true,
"documentsCaptured": {
"listA": "U.S. Passport"
},
"employmentEligibilityDetails": {
"completedReviews": [
{
"phase": "i9_section2",
"values": {
"employerBusinessName": "ACME Corp",
"employerLastFirstTitle": "Smith, John",
"firstDayOfEmployment": "2026-03-15",
"todaysDate": "2026-03-16"
}
}
]
}
},
"reviewDetails": {
"outcome": "approved",
"completedReviews": [
{
"reviewType": "identifraud",
"result": "pass",
"completedAt": "2026-03-16T10:00:00Z"
}
]
}
}Response Objects
1. Application Details (applicationDetails)
Always present.
| Field | Type | Description |
|---|---|---|
applicationId | String | Unique application (job) identifier |
externalId | String | Your tracking identifier, supplied when the job was created |
companyId | String | Company / organization ID owning the application |
journey | String | The job type that produced this application, e.g. onbo_plus, employee_i9_onboarding. A stable discriminator: a given value always means the same kind of application |
status | String | Current application state (e.g. approved, Approved, Review Identifraud) |
applicationCreatedAt | String | When the application was created |
applicationUpdatedAt | String | When its state last changed |
status is carried verbatim and its casing varies by how the state was reached — compare case-insensitively.
2. Verification Result (verificationResult)
| Field | Type | Description |
|---|---|---|
dedupResult | Object | matchFound (Boolean) and matchCount (Number). matchCount is absent when no deduplication ran — absent and 0 are different claims. |
documentValidationResult | Object | Combined face-match and liveness result — see below. Omitted when neither check ran. |
identiFraud | Array | Identity-verification service results: serviceName plus profiles, each with the matched record and a verificationResult holding verified, per-field scores, and a data breakdown. |
documentValidationResult
Onbo runs up to two face checks — an ID face match against the captured document, and a selfie live-check. This object merges them field by field, with the ID face match taking priority, so it is one consolidated verdict rather than a per-vendor audit trail.
| Field | Type | Description |
|---|---|---|
isLive | Boolean | Whether a live face was detected |
selfieLiveCheckStatus | String | Human-readable liveness status, e.g. Live Face Detected |
faceVerificationResult | String | Face match verdict, e.g. Verified |
faceVerificationScore | Number | Face match confidence, 0–100 |
realScore | Number | Liveness confidence, 0–1 |
verificationResult | String | Overall document verdict, e.g. Approved |
verificationResultCode | String | Overall result code, e.g. 00 |
cellPhone / cellPhoneScore | Boolean / Number | Phone screen detected in frame, and score |
eyeCovering / eyeCoveringScore | Boolean / Number | Eyewear obstruction, and score |
faceMask / faceMaskScore | Boolean / Number | Face covering detected, and score |
headCovering / headCoveringScore | Boolean / Number | Head covering detected, and score |
advancedLiveness | Object | Deepfake verdict — status (e.g. AUTHENTIC) and score |
idvFaceMatchDecision | Object | Per-check decisions keyed by check name (Decision_FaceMatch, Decision_Expiration, …), each with result and stateCode. The set varies by document type — iterate the keys |
The boolean flags appear only when a check reported them. An absent flag means “not assessed”, not false.
3. Documents (documents)
Document URNs (urn:documentsv1:<env>:<uuid>) grouped by what each document is, so you can find the identity document without knowing which slot name a given journey wrote. Use the URN to fetch binaries via the Documents API. A group with no captured documents is omitted.
| Group | Slots |
|---|---|
id | idFront, idBack, idFrontListC, idBackListC, idFrontSecondListA, idBackSecondListA, videoIdImageFront, videoIdImageBack, videoData |
selfie | selfie, selfieImage, enrollmentSelfie, signatureSelfieImage |
signature | signatureImage, signatureVideo |
other | i9FormPDF, pdfReport |
Video captures group under id because a filmed identity document is the same evidence in another medium. i9FormPDF (the rendered Form I-9, on I-9 journeys) and pdfReport (the generated summary report, on Onbo Plus) are both rendered after the decision is reached. pdfReport is present once the render completes, and the Onbo Plus decision webhook waits for it; i9FormPDF may be absent on a recently-completed application.
4. Applicant Data (applicantData)
Everything about the person, under one key for every journey.
| Field | Type | Description |
|---|---|---|
personalData | Object | Name, date of birth, contact details, address, physical description, and the document’s own spellings of each — see below |
addressDetails | Object | streetAddress, city, state, postalCode, country, countryCode |
extractedIdData | Object | Fields read from the primary identity document — see below |
extractedSecondaryIdData | Object | Same shape, for the companion document of a two-part List A capture |
attestationDetails | Object | citizenshipStatus, attestedAt |
consents | Array | consentType (TERMS_AND_CONDITIONS, BIOMETRIC_PROCESSING, PRIVACY_POLICY), version, status (GIVEN), consentedAt, text |
Personal data fields (personalData)
Read off the identity document and from what the applicant supplied. Which of these appear depends on the document type and on what the capture could read — treat every field as optional.
| Field | Type | Description |
|---|---|---|
firstName | String | First name |
middleName | String | Middle name |
lastName | String | Last name |
lastName2 | String | Second surname, on documents that print two |
name | String | Full name |
additionalNames | String | Any further names the document lists |
dob | String | Date of birth |
gender | String | Gender |
uniqueNumber | String | An identifier the document assigns to the person |
email | String | Contact email address |
phone | String | Contact phone number |
ssn | String | Social Security Number |
address | String | Full address string |
addressLine1 | String | Address line 1 |
addressLine2 | String | Address line 2 |
addressLine3 | String | Address line 3 |
city | String | City |
state | String | State or province |
parish | String | Parish, where the jurisdiction uses one |
postalCode | String | Postal or ZIP code |
country | String | Country |
eyeColor | String | Eye colour printed on the document |
hairColor | String | Hair colour printed on the document |
height | String | Height printed on the document |
weight | String | Weight printed on the document |
nameNonEng | String | name in the document’s own script, when it is not Latin |
firstNameNonEng | String | firstName in the document’s own script |
middleNameNonEng | String | middleName in the document’s own script |
lastNameNonEng | String | lastName in the document’s own script |
additionalNamesNonEng | String | additionalNames in the document’s own script |
addressNonEng | String | address in the document’s own script |
addressLine1NonEng | String | addressLine1 in the document’s own script |
addressLine2NonEng | String | addressLine2 in the document’s own script |
name_doc | String | name exactly as printed, before normalisation |
firstName_doc | String | firstName as printed |
middleName_doc | String | middleName as printed |
lastName_doc | String | lastName as printed |
lastName2_doc | String | lastName2 as printed |
dob_doc | String | dob as printed |
linkUniqueId | String | Your own correlation identifier, echoed back |
Extracted document fields
Fields read off the identity document by OCR, MRZ parsing and barcode decoding. Which fields appear depends on the document type and on what the capture could read — a passport yields MRZ fields and no driver-license fields, a US driver license yields the reverse. Treat every field here as optional.
| Field | Type | Description |
|---|---|---|
i9Document | String | Which I-9 list the document satisfies: ListA, ListB, or ListC. Present on I-9 journeys only; absent when no list applies |
idType | String | Document code, e.g. PP (passport), DL (driver license) |
idState | String | Issuing state or province |
idCountry | String | Document country of origin |
idNumber | String | Primary document number |
idNumber1 | String | Additional number, for documents that print more than one |
idNumber2 | String | Additional number |
idNumber3 | String | Additional number |
idNumber4 | String | Additional number |
idDateOfBirth | String | Date of birth printed on the document |
idDateOfBirthFormatted | String | Date of birth, normalised |
idExpirationDate | String | Expiration date |
idExpirationDateFormatted | String | Expiration date, normalised |
idIssueDate | String | Issue date |
idIssueCountry | String | Country of issue |
placeOfIssue | String | Issuing authority or place |
mrzData | String | The raw machine-readable zone as read off the document |
idNumberNonEng | String | idNumber in the document’s own script, when it is not Latin |
idNumber2NonEng | String | idNumber2 in the document’s own script |
idDateOfBirthNonEng | String | idDateOfBirth in the document’s own script |
idExpirationDateNonEng | String | idExpirationDate in the document’s own script |
idIssueDateNonEng | String | idIssueDate in the document’s own script |
barcodeDataParsed | String | Decoded barcode contents, for documents carrying one (PDF417 on US driver licenses, for example) |
ageOver18 | String | Age check (Y / N) |
nationality | String | Nationality on the document |
idNotExpired | String | Expiry check (Y / N) |
validIdNumber | String | Document number structure check (Y / N) |
negativeDBMatchFound | String | Whether the document matched a negative database (Y / N) |
mrzErrorMessage | String | Why MRZ parsing failed, when it did. Present only on failure |
idNumber_doc | String | idNumber exactly as printed, before normalisation |
idNumber1_doc | String | idNumber1 as printed |
idNumber2_doc | String | idNumber2 as printed |
idNumber3_doc | String | idNumber3 as printed |
idNumber4_doc | String | idNumber4 as printed |
idExpirationDate_doc | String | idExpirationDate as printed |
idIssueDate_doc | String | idIssueDate as printed |
profession | String | Profession or occupation |
professionNonEng | String | profession in the document’s own script |
employer | String | Employer named on the document |
vehicleClass | String | Vehicle classes the holder may drive. Driving licences only |
endorsement | String | Endorsements granted (motorcycle, hazmat, and so on). Driving licences only |
licenseType | String | Licence category or type. Driving licences only |
restriction | String | Restrictions imposed (corrective lenses, for example). Driving licences only |
registrationDate | String | Registration date. Driving licences only |
replacementDate | String | Replacement or reissue date. Driving licences only |
maritalStatus | String | Marital status, where the document prints one |
placeOfBirth | String | Place of birth on the document |
The document’s own scans are not part of extractedIdData: idImageFront, idImageBack, idProcessImageFront and idProcessImageBack are never delivered here. The captured images are delivered as URNs under documents.id instead.
5. Employee I-9 Details (employeeI9Details)
Present on I-9 journeys only.
| Field | Type | Description |
|---|---|---|
citizenshipStatus | String | Self-attested status (citizen, noncitizen_national, lawful_permanent_resident, authorized_alien) |
firstDayOfEmployment | String | Employment start date |
secondDocumentCapture | Boolean | true when a companion document was captured; absent when it was not |
documentsCaptured | Object | Which document was captured per list, e.g. {"listA": "U.S. Passport"}. Lists that captured nothing are omitted |
employmentEligibilityDetails | Object | completedReviews: employer Section 2 records, each with a phase and the employer’s form values (employerBusinessName, employerLastFirstTitle, firstDayOfEmployment, todaysDate, …) |
6. Review Details (reviewDetails)
Present only for applications that went through human review.
| Field | Type | Description |
|---|---|---|
outcome | String | Review decision (approved, rejected, suspicious) |
completedReviews | Array | Individual check outcomes: reviewType, result, completedAt |
Error responses
| Status | Meaning |
|---|---|
| 400 | Invalid request — missing or malformed jobId, invalid JSON body, or unsupported job type |
| 401 | Invalid or missing X-Api-Key-Id / X-Api-Key-Secret header |
| 404 | Job not found — jobId does not exist or does not belong to the API key’s company |
| 500 | Server error — retry with backoff; contact support if persistent |
Common errors
| Issue | Status | Action |
|---|---|---|
Missing X-Api-Key-Id header | 401 | Include the X-Api-Key-Id header in your request |
Missing jobId field | 400 | Pass { "jobId": "<valid_job_id>" } in the JSON request body |
| Job belongs to another company | 404 | Verify that the API key matches the organization that created the job |
| Unsupported job type | 400 | get-job-data supports employee_onboarding, employee_i9_onboarding, and onbo_plus jobs |
Example (curl)
curl -X POST "https://portal.idmission.com/api/get-job-data" \
-H "Content-Type: application/json" \
-H "X-Api-Key-Id: urn:apikeysv1:prod:region:company:YOUR_KEY_UUID" \
-H "X-Api-Key-Secret: YOUR_API_KEY_SECRET" \
-d '{
"jobId": "019fd6b7-3def-7ece-bd47-788508d3424d"
}'Integration checklist
- Call the API from your backend only
- Send
X-Api-Key-IdandX-Api-Key-Secretas request headers - Send
jobIdin the JSON body - Use API keys corresponding to the organization that owns the job
- Read document URNs from the
documentsgroups (id,selfie,signature,other) for file retrieval - Treat any missing top-level object as “nothing to report”, not as an error
Behavior notes
- No
eventenvelope — The response delivers job payload data directly without a wrappereventobject. - Company scoping — Queries are strictly restricted to the caller’s company, reported as
applicationDetails.companyId. Cross-company access is blocked and returns 404 Not Found. - Document references — Documents are returned as document URNs (e.g.
urn:documentsv1:...), never as inline base64 bytes. - Unmasked personal data — This endpoint returns full personal data regardless of the PII mode configured for webhook deliveries.
- Same body as webhooks — Any change to the webhook payload applies here too, minus the
eventenvelope. See the Webhook Payload Reference.
See also
- Webhook Payload Reference — Complete field dictionary for this response body
- Webhooks Overview — Get the same data pushed to you instead of polling for it
- Create Onboarding Job API — Create the jobs this endpoint reads back