Vizo Digital Api
Sign in

AEPS Express · Agents & Outlets

Outlet Biometric eKYC

Step 5: One-time biometric eKYC for AEPS Express outlet activation.

POST request

URL: https://uat-api.vizodigital.com/api/v1/aeps-express/agents/{agent_code}/kyc

Body

{
    "reference_id": "KYC2026100300001",
    "channel": "APP",
    "device_id": "8f2d7c9a12bc45ef",
    "ip_address": "49.47.133.99",
    "user_agent": "Mozilla/5.0 Android",
    "latitude": "25.5899",
    "longitude": "85.1606",
    "business_nature": "Retail Shop",
    "annual_income": "300000",
    "bio_type": "0",
    "pid_data": "BASE64_ENCODED_PID_XML"
}

Include a valid Bearer token with every request

Code sample

curl -X POST "https://uat-api.vizodigital.com/api/v1/aeps-express/agents/AC12345678/kyc" \
  -H "X-API-Key: YOUR_API_KEY_OR_TOKEN" \
  -H "X-Timestamp: $(TZ=Asia/Kolkata date '+%Y-%m-%d %H:%M:%S')" \
  -H "Content-Type: application/json" \
  -d '{
    "reference_id": "KYC2026100300001",
    "channel": "APP",
    "device_id": "8f2d7c9a12bc45ef",
    "ip_address": "49.47.133.99",
    "user_agent": "Mozilla/5.0 Android",
    "latitude": "25.5899",
    "longitude": "85.1606",
    "business_nature": "Retail Shop",
    "annual_income": "300000",
    "bio_type": "0",
    "pid_data": "BASE64_ENCODED_PID_XML"
}'

Success Response

{
    "status": "success",
    "message": "Outlet KYC completed successfully.",
    "data": {
        "reference_id": "KYC2026100300001",
        "kyc_status": "verified"
    }
}

Failure response

{
    "status": "error",
    "code": "provider_rejected",
    "message": "Biometric data did not match."
}

Overview

Step 5: Completes the agent's biometric eKYC on AEPS Express switch. The merchant must capture their finger, face, or iris on a certified RD Service device using the kyc_wadh provided in Outlet Status & WADH.

Headers

  • X-API-Key · string required

    Your credential: either your `rr_live_` API key, or the Bearer token from `POST /api/v1/auth/client-credentials` (the same token every other API uses). The token may instead be sent as `Authorization: Bearer <token>`. A token follows the same IP whitelist as your keys, and all your tokens share one requests-per-minute allowance.

    Example: rr_live_xxxxxxxxxxxxx

  • X-Timestamp · string required

    Current time in IST as `YYYY-MM-DD HH:MM:SS` (or `YYYY-MM-DDTHH:MM:SS`). Do not add a timezone suffix such as `+05:30`. Must be within 15 seconds of our server time.

    Example: 2026-10-03 10:30:45

  • Content-Type · string required

    Request content type.

    Example: application/json

Parameters

  • agent_code · path · string required

    The `agent_code` of the AEPS Express registered agent.

    Example: AC12345678

    Schema

    {
        "type": "string"
    }

Body

application/json required

Outlet Biometric eKYC request body

Schema

{
    "type": "object",
    "required": [
        "reference_id",
        "channel",
        "device_id",
        "ip_address",
        "user_agent",
        "latitude",
        "longitude",
        "business_nature",
        "annual_income",
        "bio_type",
        "pid_data"
    ],
    "properties": {
        "reference_id": {
            "type": "string",
            "description": "Your unique ID for this request."
        },
        "channel": {
            "type": "string",
            "enum": [
                "APP",
                "WEB"
            ],
            "description": "Where the request comes from."
        },
        "device_id": {
            "type": "string",
            "description": "Android ID of the agent device (16 hex characters) when `channel` is `APP`. Send `Browser` when `channel` is `WEB`. Max 40 characters."
        },
        "ip_address": {
            "type": "string",
            "description": "Public IPv4 address of the agent device."
        },
        "user_agent": {
            "type": "string",
            "description": "App or browser user-agent string. Max 50 characters."
        },
        "latitude": {
            "type": "string",
            "description": "Live latitude of the agent, exactly 4 decimal places. Must not be hardcoded."
        },
        "longitude": {
            "type": "string",
            "description": "Live longitude of the agent, exactly 4 decimal places. Must not be hardcoded."
        },
        "business_nature": {
            "type": "string",
            "enum": [
                "Mobility",
                "Pharma",
                "Import And Export Trader",
                "Law",
                "Accountancy Firm",
                "Liquor",
                "Manufacturing",
                "Marketing including Multi-level Marketing",
                "Media",
                "Pawn Shop",
                "Money Lender",
                "Money Changer",
                "Real Estate",
                "Restaurant And Hospitality",
                "Retail Shop",
                "Service Provider",
                "Small Vendor",
                "Kirana Shop",
                "Stock Trading",
                "Brokerage",
                "Transport",
                "Logistics",
                "Wholesale Trading",
                "Agriculture",
                "Antique Dealer",
                "Arms Dealer",
                "Art Dealer",
                "Banking",
                "Barber",
                "Parlour",
                "Salon",
                "Bullion Dealer and Jeweller",
                "Casino",
                "Gaming Application",
                "Educational Institute",
                "Financial Institution",
                "Healthcare",
                "Others"
            ],
            "description": "Type of business the agent runs."
        },
        "annual_income": {
            "type": "string",
            "description": "Annual income in INR, digits only."
        },
        "bio_type": {
            "type": "string",
            "enum": [
                "0",
                "1",
                "2"
            ],
            "description": "`0` = fingerprint, `1` = face, `2` = iris."
        },
        "pid_data": {
            "type": "string",
            "description": "Base64-encoded PID XML captured from a registered RD service device."
        }
    }
}

Example

{
    "reference_id": "KYC2026100300001",
    "channel": "APP",
    "device_id": "8f2d7c9a12bc45ef",
    "ip_address": "49.47.133.99",
    "user_agent": "Mozilla/5.0 Android",
    "latitude": "25.5899",
    "longitude": "85.1606",
    "business_nature": "Retail Shop",
    "annual_income": "300000",
    "bio_type": "0",
    "pid_data": "BASE64_ENCODED_PID_XML"
}

Responses

  • 200 · application/json default

    Success

    Schema

    {
        "type": "object"
    }

    Example

    {
        "status": "success",
        "message": "Outlet KYC completed successfully.",
        "data": {
            "reference_id": "KYC2026100300001",
            "kyc_status": "verified"
        }
    }
  • 422 · application/json

    Failed or rejected

    Schema

    {
        "type": "object"
    }

    Example

    {
        "status": "error",
        "code": "provider_rejected",
        "message": "Biometric data did not match."
    }

Errors

  • INVALID_API_KEY · HTTP 401

    Invalid or revoked API key.

    {
        "message": "Invalid or revoked API key."
    }
  • TIMESTAMP_OUT_OF_RANGE · HTTP 400

    Request timestamp is outside the ±15 second window.

    {
        "message": "Request timestamp is outside the ±15 second window."
    }
  • service_not_enabled · HTTP 403

    AEPS is not enabled for your account. Contact your account manager to activate it.

    {
        "status": "error",
        "code": "service_not_enabled",
        "message": "AEPS is not enabled for your account. Contact your account manager to activate it."
    }
  • RATE_LIMITED · HTTP 429

    Rate limit exceeded.

    {
        "message": "Rate limit exceeded."
    }
  • agent_not_found · HTTP 404

    Agent not found.

    {
        "status": "error",
        "code": "agent_not_found",
        "message": "Agent not found."
    }
  • agent_blocked · HTTP 403

    This agent is blocked. Contact support.

    {
        "status": "error",
        "code": "agent_blocked",
        "message": "This agent is blocked. Contact support."
    }
  • duplicate_reference_id · HTTP 409

    This reference_id was already used. Send a new one.

    {
        "status": "error",
        "code": "duplicate_reference_id",
        "message": "This reference_id was already used. Send a new one."
    }
  • provider_rejected · HTTP 422

    The bank network refused the request. The message says why.

    {
        "status": "error",
        "code": "provider_rejected",
        "message": "The bank network refused the request. The message says why."
    }
  • provider_unavailable · HTTP 502

    The AEPS provider did not respond. Try again shortly.

    {
        "status": "error",
        "code": "provider_unavailable",
        "message": "The AEPS provider did not respond. Try again shortly."
    }
  • noble_credentials_unavailable · HTTP 503

    Noble credentials are not available. Contact your partner.

    {
        "status": "error",
        "code": "noble_credentials_unavailable",
        "message": "Noble credentials are not available. Contact your partner."
    }
  • instantpay_credentials_unavailable · HTTP 503

    InstantPay credentials are not configured or incomplete.

    {
        "status": "error",
        "code": "instantpay_credentials_unavailable",
        "message": "InstantPay credentials are not configured or incomplete."
    }

Rate Limits

100/min