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, and whatever that step needs. Pick a step from the examples below to see its body.
Reseller accounts only. Request access.
steprequiredID of the client completing verification.
Region this verification is for.
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", "name": "Demo User", "email": "demo@example.com", "phone": "+919876543210" }'
{ "success": false, "status": "string", "next_step": "register", "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" } } }
Authorization
BearerAuth Bearer token authentication. Obtain your API key from the OmniDimension dashboard.
In: header
Path Parameters
The verification step to run.
"register" | "verify-otp" | "resend-otp" | "verify-pan" | "aadhaar-otp" | "aadhaar-verify" | "verify-gst" | "skip-gst" | "preview" | "accept"Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
What each step sends and returns
Every call is a POST to this endpoint with the step name in the path. The body
always carries user_id and region, plus the fields in the table below. Steps
with no fields of their own take just those two.
Every response has the same shape:
{
"success": true,
"status": "otp_verified",
"next_step": "verify-pan",
"message": "Contact details verified."
}next_step is the field to act on. Run it, read the next one off that response,
and keep going until the status comes back completed.
| Step | Body fields you add | next_step you get back | message |
|---|---|---|---|
register | name, email, phone | verify-otp | Verification codes sent to the email and mobile number. |
verify-otp | mobile_otp, email_otp | verify-pan | Contact details verified. |
verify-pan | pan, business_type | aadhaar-otp | PAN verified. |
aadhaar-otp | aadhaar | aadhaar-verify | Aadhaar verification code sent. |
aadhaar-verify | otp | verify-gst | Aadhaar verified. |
verify-gst | gst | preview | GST verified. |
skip-gst | none | preview | GST step skipped. |
preview | none | accept | Review the details, then call accept. |
accept | none | null | Verification completed. |
verify-gst and skip-gst are a choice: run one or the other, both land on
preview. Once the status is completed the client is verified and can buy a
number.
The one step that returns more
preview returns everything the client should confirm before accept commits
it, alongside the usual fields:
{
"success": true,
"status": "preview",
"next_step": "accept",
"message": "Review the details, then call accept.",
"preview": {
"client": { "name": "Demo User", "email": "demo@example.com", "mobile": "9876543210", "country_code": "91" },
"pan": { "pan": "ABCDE1234F", "business_type": "proprietorship" },
"aadhar": { "name": "Demo User", "address": "..." },
"gst": { "gst_num": "29ABCDE1234F1Z5", "gstin": "..." }
}
}Anything the verification provider does not hold yet is left out, so treat each block as optional.
Resending a code
resend-otp takes just user_id and region, and answers
next_step: verify-otp like the step it belongs to. It sits outside the
sequence and is never returned as a next_step, so call it only when the client
says a code did not arrive.
The Aadhaar steps are rate limited.
Roughly one attempt every 30 seconds on aadhaar-otp and aadhaar-verify.
Repeated rapid retries can lock the client out at the identity authority,
which is not reversible from this API. Calling too soon returns 429.
Order is enforced
Calling a step before its prerequisite is complete returns 409 naming the step
to run first, so following next_step is all you need to stay in order.
What you may keep
You are relaying what the client types into your own interface, nothing more. Never store the values you send in these requests once the call completes, and redact them from your own request logs. That covers the OTPs, the PAN, the Aadhaar number, and the GST number.
The full loop, with the step diagram, is in the Reseller API guide.
