Submit a KYC verification step
Run one step of a client's identity verification. One endpoint handles every step: the step path parameter names the step, and the body carries user_id, region, carrier, and whatever that step needs. The example below is the register step on carrier-1.
Reseller accounts only. Request access.
Every step is a POST to this operation with the step name in the path. The body carries
user_id, region and carrier, plus that step's own fields. Every response carries the next
step to run:
{
"success": true,
"status": "pan_verified",
"next_step": "upload-pan",
"message": "PAN verified."
}Run next_step, read the next one off that response, and stop when it is null.
The steps, the fields each one sends, and the walkthrough for every carrier are on the Verify a client guide. Read the carrier you are on rather than hard-coding a sequence.
steprequiredID of the client completing verification.
Region this verification is for.
The carrier to verify on: verification is per carrier, so this decides which flow the client walks and which record it writes. Always required, and omitting it returns 409 carrier_required naming that region's carriers.
Customer's full name. Required for register.
Customer's email address. Required for register.
curl -X POST 'https://backend.omnidim.io/api/v1/reseller/kyc/steps/{step}' \ -H 'Authorization: Bearer YOUR_API_KEY' \ -H 'Content-Type: application/json' \ -d '{ "user_id": 1234, "region": "IN", "carrier": "carrier-1", "name": "Demo User", "email": "demo@example.com", "phone": "+919876543210" }'
{ "success": false, "status": "string", "next_step": "string", "method": "submit", "redirect_url": "string", "reusable": false, "poll_step": "string", "message": "string", "preview": { "client": { "name": "string", "email": "demo@example.com", "mobile": "string", "country_code": "string" }, "pan": { "pan": "string", "business_type": "string" }, "aadhar": { "name": "string", "address": "string" }, "gst": { "gst_num": "string", "gstin": "string" } } }
BearerAuthAuthorizationBearer <token>Bearer token authentication. Obtain your API key from the OmniDimension dashboard.
step*stringThe verification step to run. Not a fixed list: carriers do not run
the same checks, so take the names from
GET /reseller/kyc/requirements for the carrier you are on.
user_id*integerID of the client completing verification.
region*stringRegion this verification is for.
"IN""US"carrier*stringThe carrier to verify on: verification is per carrier, so
this decides which flow the client walks and which record
it writes. Always required, and omitting it returns
409 carrier_required naming that region's carriers.
name?stringCustomer's full name. Required for register.
email?stringCustomer's email address. Required for register.
emailphone?stringCustomer's phone number including country code. Required for register.
mobile_otp?stringOTP the client received by mobile. Required for verify-otp.
email_otp?stringOTP the client received by email. Required for verify-otp.
pan?stringCustomer's PAN. Required for verify-pan.
business_type?stringThe customer's business type. Required on the PAN step of
the India carriers and on the business-details step of the
US carrier, and the accepted values differ between them.
Read them from choices on the requirements response
rather than assuming a list.
aadhaar?stringCustomer's Aadhaar number. Required for aadhaar-otp.
Rate limited to one attempt roughly every 30 seconds.
otp?stringOTP the client received for Aadhaar verification.
Required for aadhaar-verify. Rate limited to one
attempt roughly every 30 seconds.
gst?stringCustomer's GST number. Required for verify-gst.
state?stringRequired for register on carriers that register at
district level, and for the US carrier's business address
step (where it is the two-letter state code).
district?stringCustomer's district. Required for register on carriers
that register at district level, and validated against
the state, so a district that does not belong to it is
rejected with nothing written.
pincode?stringCustomer's postal code. Required for register on carriers that register at district level.
pan_holder_name?stringName exactly as it appears on the PAN. Required for
verify-pan on carriers that check the name against the
PAN record.
account_type?stringOptional on register, defaults to individual. Fixed
at registration and not changeable afterwards, and only a
business account can verify GST, so send it deliberately.
Accepted values come from choices on the requirements
response; anything else is refused with 400 invalid_request rather than quietly registered as an
individual.
business_name?stringTrading name. Required when account_type is business
on the India carriers, and required on the US carrier's
business-details step.
business_identity?stringHow the business relates to its end customers. Required on
the US carrier's business-details step; values come from
choices.
business_industry?stringThe industry the business operates in. Required on the US
carrier's business-details step; values come from
choices.
ein?stringThe business's tax registration number. Required on the US carrier's business-details step.
website_url?stringThe business's public website. Required on the US carrier's business-details step.
regions_of_operation?stringWhere the business operates. Optional on the US carrier's
business-details step, defaults to USA and Canada; values
come from choices.
street?stringStreet address. Required on the US carrier's business-address step.
city?stringCity. Required on the US carrier's business-address step.
postal_code?stringPostal code. Required on the US carrier's business-address step.
country?stringTwo-letter country code. Optional on the US carrier's business-address step, defaults to US.
first_name?stringThe authorized representative's first name. Required on the US carrier's representative step.
last_name?stringThe authorized representative's last name. Required on the US carrier's representative step.
business_title?stringThe representative's job title, as free text. Required on the US carrier's representative step.
job_position?stringThe representative's role, from a fixed list. Required on
the US carrier's representative step; values come from
choices.
return_url?stringOptional on a redirect step. The page in your own app
where your client's browser comes back after verifying.
Must be https with a host, no #fragment and no
credentials, up to 2,000 characters. Anything else is
refused with 400 invalid_request. Result parameters such
as status are added to it. Leave it out and your client
returns to their own dashboard.
uriResponse body
application/jsonStep completed. preview is only present in the response
to the preview step, and only carries the fields listed
below; any field the verification provider does not have
yet is omitted.
application/jsonsuccess?booleanstatus?stringWhere this client has reached in verification.
not_started before anything is submitted,
completed once they are verified. Drive your
integration off next_step, not this value.
next_step?stringThe step to run next. Chain to it without re-reading
status. null once there is nothing left for you to do.
Not a fixed list: which steps exist depends on the
carrier. Follow this field and the step list from
/reseller/kyc/requirements.
method?stringEchoes how the step that just ran is performed. Present on redirect steps.
"submit""otp""redirect""upload"redirect_url?stringOnly on a redirect step. Send your customer to this
link in their own browser, then poll poll_step.
Single use. It expires within minutes and must not be stored or reused. Call the step again for a new one: repeating it is safe and always returns a fresh link.
reusable?booleanOnly on a redirect step, and always false. Stated
as a field so a client library can enforce it.
poll_step?stringOnly on a redirect step. The step to call, repeatedly,
to find out whether the customer finished.
message?stringHuman-readable confirmation for the step that just ran.
preview?Present only in the response to the preview step.
Get KYC requirements for a region
Get the ordered list of verification steps for a carrier and the fields each step needs, so your integration can build a verification form without hardcoding the sequence.
Get brand identity
Read your brand and your custom email server settings. The brand is what your client organizations see: your brand name on their emails, and spoken in their verification calls. Your own emails do not change.
