The eKYC Prefill endpoint (POST /omni/externalVerification/ekyc-prefill) looks up the end user of the session in the configured source and returns the data the source holds. This page explains the request parameters, response schema, lookup limits, and error responses for that endpoint. For the sources available per country and the data each source returns, see eKYC Prefill Coverage. For instructions on how to configure the module in Dashboard, see eKYC Prefill (Dashboard).
The endpoint accepts an onboarding session token (X-Incode-Hardware-Id) and x-api-key, uses application/json, and responds synchronously. The Flow or Workflow used for the Session must contain the eKYC Prefill module.
Info
This is different than eKYC API Reference.
Request
| Field | Type | Required | Description |
|---|---|---|---|
source |
string | Yes | US_PREFILL, US_PREFILL_EXPRESS, or BR_PREFILL. Must match the source set in the session's module |
countryCode |
string | Yes | ISO 3166-1 alpha-2 country code. Must match the module's country: US for the US sources, BR for BR_PREFILL |
phone |
string | US_PREFILL, US_PREFILL_EXPRESS |
Phone number in E.164 format, for example +12025550123. Only +1 numbers are accepted |
dateOfBirth |
string | US_PREFILL (one of three) |
yyyy-MM-dd, not in the future and not more than 130 years ago |
ssn |
string | US_PREFILL (one of three) |
9 digits, as 123456789 or 123-45-6789 |
surName |
string | US_PREFILL (one of three) |
Last name, at most 100 characters |
taxIdNumber |
string | BR_PREFILL |
Brazilian CPF, as 11 digits or XXX.XXX.XXX-XX |
Take source and countryCode from the module in the session's flow configuration rather than hardcoding them. An organization can switch the module's source, and a request with the old source then returns 400.
Inputs per source
US_PREFILL:phone, plus at least one ofdateOfBirth,ssn, orsurName. Only the identifiers enabled in the module configuration are accepted; sending one that is disabled returns400.US_PREFILL_EXPRESS:phoneonly.BR_PREFILL:taxIdNumberonly. The CPF check digits are verified before the lookup, so an invalid CPF returns400without using up a lookup.
Each source ignores the fields it does not use, and never sends them to the data source. No field may be longer than 255 characters. Unknown fields are ignored. firstName and includeDriverLicenseData have no effect: driver's license data is returned only when the module's Include driver's license data option is on.
Legacy fields
plugins (string array) is a legacy field. Do not include it in new integrations. When sent, it must be ["kyc-prefill"]; any other value returns 400.
Example requests
{
"source": "US_PREFILL",
"countryCode": "US",
"phone": "+12025550123",
"dateOfBirth": "1985-11-22"
}
{
"source": "US_PREFILL_EXPRESS",
"countryCode": "US",
"phone": "+12025550143"
}
{
"source": "BR_PREFILL",
"countryCode": "BR",
"taxIdNumber": "123.456.789-00"
}
Info
The CPF in this example fails check-digit validation on purpose, so no real CPF appears in Incode's documentation. Send a valid CPF in production requests.
Response
200 OK. The result is under kyc-prefill. Null fields are omitted, and not every source returns every field; see Returned data per source in eKYC Prefill Coverage.
Response field categories
Response fields fall into six categories:
- Status and reasons describe the outcome of the lookup:
checkStatus,message,reasonCodes,reasons. - Person data returns the identity the source holds on the looked-up person:
returnedFirstName,returnedLastName,returnedFullName,returnedDob,returnedSsn,returnedIsItin,returnedTaxIdNumber. - Contact information returns the person's emails, addresses, and phone details:
returnedEmails,returnedAddresses,returnedPhoneDetails,returnedPhoneStatus,phoneValid,returnedAssociatedPhoneNumbers. - Signals flag characteristics of the person or their contact details:
returnedPersonSignals,returnedCreditSignals, plus contact signals nested inside addresses and phone details. - Driver's license data is returned only when the module's Include driver's license data option is on:
returnedDriverLicenses. - Alternate identities (
US_PREFILL_EXPRESSonly) list other people the source links to the same phone number:additionalProfiles.
Response fields
| Field | Type | Description |
|---|---|---|
checkStatus |
string | pass, partialPass, fail, or inconclusive. See Check statuses in eKYC Prefill Reference |
message |
string | Present only when no person data was returned. Human-readable and different per source: branch on checkStatus, not on this text |
returnedFirstName |
string | First name. Not returned by BR_PREFILL |
returnedLastName |
string | Last name. Not returned by BR_PREFILL |
returnedFullName |
string | Full name |
returnedDob |
string | Date of birth as the source holds it. Usually yyyy-MM-dd, but parse it defensively |
returnedSsn |
string | SSN as the source holds it. Some sources return it masked |
returnedIsItin |
boolean | Whether returnedSsn is an Individual Taxpayer Identification Number |
returnedTaxIdNumber |
string | BR_PREFILL only. The CPF the source holds for the person found, as 11 digits |
returnedPersonSignals |
object | Person signals, see below |
returnedPhoneDetails |
object | Phone details of the looked-up number, see below |
returnedPhoneStatus |
string | US_PREFILL_EXPRESS only. Phone status as the source reports it, for example inactive. Not a closed list |
phoneValid |
boolean | US_PREFILL_EXPRESS only. Whether the source considers the looked-up number valid |
returnedEmails |
string[] | Email addresses linked to the person |
returnedAddresses |
object[] | Addresses linked to the person, see below |
returnedCreditSignals |
object | Credit signals, see below |
returnedDriverLicenses |
object[] | Driver's licenses. Only when the module requests them |
returnedAssociatedPhoneNumbers |
object[] | Other phone numbers linked to the person. The looked-up number is left out |
additionalProfiles |
object[] | US_PREFILL_EXPRESS only. See Additional profiles below |
reasonCodes |
string[] | Reason codes behind the answer. Not a closed list |
reasons |
object[] | Each reason with its code and message |
For the list fields, absent and [] both mean none.
Person signals
| Field | Type | Description |
|---|---|---|
isDeceased |
boolean | The person is reported deceased |
hasSanction |
boolean | The person appears on a sanctions list |
activeMilitary |
boolean | The person is on active military duty |
fraudCriminalBackground |
boolean | The person has a fraud or criminal record |
Phone details
| Field | Type | Description |
|---|---|---|
activityScore |
integer | Phone activity score from the source |
type |
string | Line type, for example Mobile |
carrier |
string | Carrier name |
lastPorted |
string | Date the number was last ported. Not every source returns it |
activityDescription |
string | Free text from the source. Do not branch on it. Not every source returns it |
codeRangeAllocated |
boolean | Passed through from the source. Not every source returns it |
signals |
object | Contact signals, see below |
Address
| Field | Type | Description |
|---|---|---|
street |
string | Street address |
street2 |
string | Second address line, when the record has one |
city |
string | City |
state |
string | State |
postalCode |
string | Postal code |
signals |
object | Contact signals, see below. Not returned by BR_PREFILL |
Contact signals
| Field | Type | Description |
|---|---|---|
highFrequency |
boolean | The phone or address is used by an unusually high number of identities |
possibleFraudRisk |
boolean | The phone or address is linked to possible fraud |
Credit signals
| Field | Type | Description |
|---|---|---|
consumerVictimStatement |
boolean | A consumer victim statement is on file |
extendedConsumerVictimStatement |
boolean | An extended consumer victim statement is on file |
Driver's license
| Field | Type | Description |
|---|---|---|
licenseNumber |
string | License number |
issuingState |
string | Issuing state |
firstReportedDate |
string | First date the license was reported |
lastReportedDate |
string | Last date the license was reported |
Associated phone number
| Field | Type | Description |
|---|---|---|
phoneNumber |
string | Phone number |
firstReportedDate |
string | First date the number was reported for the person |
lastReportedDate |
string | Last date the number was reported for the person |
Additional profiles
US_PREFILL_EXPRESS only. Other identities the source links to the same phone number. They are less reliable than the main result and can be different people. Each profile has the main result's person and contact fields (returnedFirstName, returnedLastName, returnedFullName, returnedDob, returnedPersonSignals, returnedEmails, returnedAddresses, returnedCreditSignals, returnedDriverLicenses, returnedAssociatedPhoneNumbers), and never an SSN, phone details, a checkStatus, or reasons.
At most 4 profiles are returned. The field is absent when there are none, which does not mean that nobody else is linked to the number.
Example response
US_PREFILL, fictional data:
{
"kyc-prefill": {
"checkStatus": "pass",
"returnedFirstName": "Sarah",
"returnedLastName": "Johnson",
"returnedFullName": "Sarah Johnson",
"returnedDob": "1985-11-22",
"returnedSsn": "987-65-4321",
"returnedPersonSignals": { "isDeceased": false, "hasSanction": false, "activeMilitary": false, "fraudCriminalBackground": false },
"returnedPhoneDetails": {
"activityScore": 1000,
"type": "Mobile",
"carrier": "Example Wireless",
"signals": { "highFrequency": false, "possibleFraudRisk": false }
},
"returnedEmails": ["sarah.johnson@example.com"],
"returnedAddresses": [
{
"street": "100 Maple Dr",
"city": "Bethesda",
"state": "MD",
"postalCode": "20814",
"signals": { "highFrequency": false, "possibleFraudRisk": false }
}
],
"returnedCreditSignals": { "consumerVictimStatement": false, "extendedConsumerVictimStatement": false },
"returnedAssociatedPhoneNumbers": [
{ "phoneNumber": "+12025550147", "firstReportedDate": "2025-08-15", "lastReportedDate": "2025-11-06" }
],
"reasonCodes": ["MC1006", "MC1000"],
"reasons": [
{ "code": "MC1006", "message": "Phone number intelligence check met" },
{ "code": "MC1000", "message": "Phone Number and date of birth match" }
]
}
}
BR_PREFILL, fictional data:
{
"kyc-prefill": {
"checkStatus": "pass",
"returnedFullName": "Ana Paula Costa Ferreira",
"returnedDob": "1970-03-12",
"returnedTaxIdNumber": "12345678900",
"returnedEmails": ["ana.ferreira@example.com"],
"returnedAddresses": [
{ "street": "R Exemplo 307", "city": "Fortaleza", "state": "CE", "postalCode": "60710160" },
{ "street": "AV Modelo 696", "street2": "AP 3", "city": "Fortaleza", "state": "CE", "postalCode": "60415540" }
],
"reasonCodes": ["MC1008"],
"reasons": [{ "code": "MC1008", "message": "Id number match" }]
}
}
No data found
When the source holds no data for the identifier, the response is still 200, with checkStatus fail (or inconclusive for BR_PREFILL), a message, and the source's reason codes. US_PREFILL_EXPRESS also returns the phone fields for the looked-up number when the source checked it.
{
"kyc-prefill": {
"checkStatus": "fail",
"message": "No person data was returned for the provided phone number.",
"returnedPhoneStatus": "inactive",
"phoneValid": false,
"reasonCodes": ["RC2001", "RC1006"],
"reasons": [ ... ]
}
}
A fail means nobody is on file. A failure of the data source is never reported as fail; it returns 503, see Errors below.
Minimum age
A source can set a minimum age for the people it returns. BR_PREFILL sets it at 18; the US sources set none. When the person found is under that age, or their age cannot be established from the date of birth, the answer is withheld:
{
"kyc-prefill": {
"checkStatus": "pass",
"returnedEmails": [],
"returnedAddresses": [],
"reasonCodes": ["Minor"],
"reasons": [{ "code": "Minor", "message": "..." }]
}
}
checkStatusstayspass, because the source did match, and no person field is returned.MinorandAgeUnknownare the two reason codes. They come from Incode, not from the source.- No person data from the source is stored for the lookup, and neither is the identifier that was sent.
- The lookup counts against the session limit, and a repeat of it is not matched to the stored answer. With
BR_PREFILL's limit of one lookup per session, treat a withheld answer as final.
Lookups per session
Lookups are limited per session and the limit does not reset. See Lookup limits in eKYC Prefill Coverage.
- Any answer (
pass,partialPass,fail, orinconclusive) uses up one lookup. A400or a503does not. - A repeated call with the same input in the same session returns the stored result. It does not make a new lookup and does not use up the limit.
- Once the limit is reached, a call with new input returns
429.
Errors
The eKYC Prefill endpoint returns conventional HTTP response codes. Validation errors return 400 with a specific message; authentication and authorization errors return 401 or 403; lookup limits return 429; data source failures return 503. The error body has this shape:
{
"timestamp": 1760600000000,
"status": 400,
"error": "Send at least one of: dateOfBirth, ssn, surName.",
"message": "Send at least one of: dateOfBirth, ssn, surName.",
"path": "/omni/externalVerification/ekyc-prefill"
}
The error and message fields are always identical. Parse either one.
| HTTP | Body status | Cause |
|---|---|---|
| 400 | 400 | A field is missing, too long, or has the wrong format; source or countryCode does not match the module; or an identifier is not enabled in the module. See the messages below |
| 400 | 4210 | Phone number country is not supported. The phone is not a +1 number, or the source rejects it for the country |
| 401 | (no body) | Missing, invalid, or expired session token, or a token from a different organization than the x-api-key |
| 403 | 4091 | The token is not an onboarding session token with the required access level |
| 403 | 403 | The session or the organization cannot use this module. See the messages below |
| 406 | 406 | The body is empty or not JSON, or a field has the wrong JSON type |
| 409 | 409 | Another call for the same session is still running |
| 415 | 415 | Content-Type is missing or is not application/json |
| 429 | 429 | The eKYC Prefill lookup limit for this session has been reached |
| 429 | (plain text) | The organization rate limit was reached. Only this one sends Retry-After |
| 503 | 8001 | The data source could not be reached or did not give a usable answer. Retrying later can succeed |
400 messages
| Message | Cause |
|---|---|
| source is required. Supported sources: ... | source is missing |
| source is not supported. Supported sources: ... | source is not one of the listed values |
| source XX is not the source configured for this session. | source does not match the module |
| countryCode must be XX for source YY. | countryCode does not match the source |
| phone is required. / taxIdNumber is required. | The source's lookup identifier (phone or taxIdNumber) is missing |
| Send at least one of: dateOfBirth, ssn, surName. | US_PREFILL was called with the phone only |
| XX is not enabled in this session's eKYC Prefill configuration. | An identifier was sent that the module does not enable |
| phone must be in E.164 format..., phone is not a valid phone number. | phone is not a valid E.164 number |
| dateOfBirth must use the yyyy-MM-dd format., etc. | dateOfBirth is invalid |
| ssn must have 9 digits, as 123456789 or 123-45-6789. | ssn is invalid |
| surName cannot be blank. | surName is blank |
| taxIdNumber must be a CPF, as 11 digits or XXX.XXX.XXX-XX. | taxIdNumber does not have a CPF format |
| taxIdNumber is not a valid CPF. | The CPF check digits do not match |
| XX cannot be longer than N characters. | A field is too long |
| plugins must be ["kyc-prefill"] when it is sent. | plugins has another value |
403 messages
| Message | Cause |
|---|---|
| The onboarding session is closed or does not belong to this organization. | The session is closed, deleted, or belongs to another organization |
| eKYC Prefill is not part of this session's flow or workflow. | The session's Flow or Workflow does not contain the module |
| The eKYC Prefill module is configured with a country its source does not serve. | The module's country is not the source's country |
| eKYC Prefill is not available for this source. | The source is not enabled |
| eKYC Prefill is not provisioned for this organization and country. | The organization is not enabled for the source in that country |