MCP is live.Set upAsk the community
OmniDimension
Reseller verification

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.

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

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

Authorization

BearerAuth
headerAuthorizationBearer <token>

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

Path Parameters

step*string

The 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.

Request Body

user_id*integer

ID of the client completing verification.

region*string

Region this verification is for.

Value in"IN""US"
carrier*string

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.

name?string

Customer's full name. Required for register.

email?string

Customer's email address. Required for register.

Formatemail
phone?string

Customer's phone number including country code. Required for register.

mobile_otp?string

OTP the client received by mobile. Required for verify-otp.

email_otp?string

OTP the client received by email. Required for verify-otp.

pan?string

Customer's PAN. Required for verify-pan.

business_type?string

The 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?string

Customer's Aadhaar number. Required for aadhaar-otp. Rate limited to one attempt roughly every 30 seconds.

otp?string

OTP the client received for Aadhaar verification. Required for aadhaar-verify. Rate limited to one attempt roughly every 30 seconds.

gst?string

Customer's GST number. Required for verify-gst.

state?string

Required 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?string

Customer'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?string

Customer's postal code. Required for register on carriers that register at district level.

pan_holder_name?string

Name exactly as it appears on the PAN. Required for verify-pan on carriers that check the name against the PAN record.

account_type?string

Optional 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?string

Trading name. Required when account_type is business on the India carriers, and required on the US carrier's business-details step.

business_identity?string

How the business relates to its end customers. Required on the US carrier's business-details step; values come from choices.

business_industry?string

The industry the business operates in. Required on the US carrier's business-details step; values come from choices.

ein?string

The business's tax registration number. Required on the US carrier's business-details step.

website_url?string

The business's public website. Required on the US carrier's business-details step.

regions_of_operation?string

Where the business operates. Optional on the US carrier's business-details step, defaults to USA and Canada; values come from choices.

street?string

Street address. Required on the US carrier's business-address step.

city?string

City. Required on the US carrier's business-address step.

postal_code?string

Postal code. Required on the US carrier's business-address step.

country?string

Two-letter country code. Optional on the US carrier's business-address step, defaults to US.

first_name?string

The authorized representative's first name. Required on the US carrier's representative step.

last_name?string

The authorized representative's last name. Required on the US carrier's representative step.

business_title?string

The representative's job title, as free text. Required on the US carrier's representative step.

job_position?string

The representative's role, from a fixed list. Required on the US carrier's representative step; values come from choices.

return_url?string

Optional 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.

Formaturi

Response body

application/json

Response Body

Step 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/json
success?boolean
status?string

Where 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?string

The 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?string

Echoes how the step that just ran is performed. Present on redirect steps.

Value in"submit""otp""redirect""upload"
redirect_url?string

Only 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?boolean

Only on a redirect step, and always false. Stated as a field so a client library can enforce it.

poll_step?string

Only on a redirect step. The step to call, repeatedly, to find out whether the customer finished.

message?string

Human-readable confirmation for the step that just ran.

preview?

Present only in the response to the preview step.