Money is integer paise — ₹15,000 = 1500000. Follow GET /application/journey. Skipping a step returns 409 step_not_ready.
product_id must match the request.phoneSessionToken. accounts is only people whose PAN already succeeded on this number — a User still in onboarding is not listed. If nobody is verified yet, you get User tokens. If one Customer exists, they auto-login. Two or more Customers → pick next.aud / claim productId = the selected product. isNewUser is true only when a new User draft was just created. application is the open in-progress screen when tokens are issued. Mismatch of product → product_mismatch. Too soon after a terminal case → reapply_cooldown.accessToken is present, send Authorization: Bearer {{accessToken}} and continue the journey. If not, POST /auth/accounts/select with phoneSessionToken + an accounts[].id, or POST /auth/accounts to start another person (they join this number only after PAN).401 otp_invalid · 403 otp_not_requested | reapply_cooldown · 422 phone_required | otp_code_required | product_id_required | invalid_phone | invalid_product | product_mismatch · 503 product_unavailablecurl --location 'https://api-dev.myemipay.com/auth/otp/verify' \
--header 'Content-Type: application/json' \
--data '{
"phone": "{{phone}}",
"code": "{{otpCode}}",
"product_id": ""
}'{
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…",
"refreshToken": "refresh_…",
"tokenType": "Bearer",
"expiresIn": 86400,
"phoneSessionToken": "phone_session_…",
"identityKind": "user",
"userId": "user_1735123456789",
"customerId": "user_1735123456789",
"productId": "prod_personal",
"isNewUser": true,
"canAddAccount": true,
"accounts": [],
"application": {
"application": {
"id": "app_1735123456789",
"reference": "PME-A1B2C3D4"
},
"status": "started",
"message": "Your application has been started.",
"youCanNow": [
{
"action": "begin_verification",
"title": "Begin verification",
"submitTo": "/applications/begin-verification"
}
],
"revision": "1"
},
"applicationHistory": []
}