MCP is live.Set upAsk on Discord
OmniDimension
Reseller

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.

POST/reseller/kyc/steps/
Path parameters
steprequired
Body
12 fields
·

ID 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"
}'
Example response
synthetic
{
  "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
AuthorizationBearer <token>

Bearer token authentication. Obtain your API key from the OmniDimension dashboard.

In: header

Path Parameters

step*string

The verification step to run.

Value in"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.

StepBody fields you addnext_step you get backmessage
registername, email, phoneverify-otpVerification codes sent to the email and mobile number.
verify-otpmobile_otp, email_otpverify-panContact details verified.
verify-panpan, business_typeaadhaar-otpPAN verified.
aadhaar-otpaadhaaraadhaar-verifyAadhaar verification code sent.
aadhaar-verifyotpverify-gstAadhaar verified.
verify-gstgstpreviewGST verified.
skip-gstnonepreviewGST step skipped.
previewnoneacceptReview the details, then call accept.
acceptnonenullVerification 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.