{"info":{"_postman_id":"a77d5cfb-f56a-48c9-9002-7e27597280e3","name":"One Tap Login","description":"<html><head></head><body><img src=\"https://onetaplogin.co/assets/images/logo.svg\" alt=\"\">\n\n<h1 id=\"overview\">Overview</h1>\n<p>This API document highlights the steps using which Businesses can integrate Bureau’s One-Tap Login solution for their Customers. The fundamental idea behind this product is to enable a smooth, SMS based One-time Password (OTP) less user journey that can help businesses verify the mobile phone number of their customers.</p>\n<h1 id=\"enabling-one-tap-login\">Enabling One Tap Login</h1>\n<p>For the best user experience, it’s recommended that this API integration is done at a user sign-up or login page, where a user is asked to enter their respective phone number to receive an OTP for verification.</p>\n<p>Businesses can integrate Bureau’s One-Tap login on the following platforms:</p>\n<ol>\n<li>Android &amp; iOS App: This can be completed using Bureau’s Mobile SDKs</li>\n<li>Mobile Web Browser: This is supported via Bureau’s API Integration &amp; React SDK</li>\n</ol>\n<p><em>Note: One-Tap login functionality is currently not supported on Desktop Browsers</em></p>\n<h1 id=\"product-flow\">Product Flow</h1>\n<img src=\"https://drive.google.com/uc?export=view&amp;id=1-dAosO8DOyTkSNZn9W0sAhohcDOBxCIX\" alt=\"\">\n\n<img src=\"https://drive.google.com/uc?export=view&amp;id=1G3x_WY_4Pm-DnYQbbXunFmUrcLg7t0fH\" alt=\"\">\n\n<h1 id=\"api-integration\">API Integration</h1>\n<img src=\"https://drive.google.com/uc?export=view&amp;id=1060EQWBrNE1OVEyBr51pOpIqhcus9EHS\" alt=\"\">\n\n<p>The API integration is agnostic to application and platform in question and can easily enable Businesses to power the One-tap login product. This shall require integration for 2 APIs:</p>\n<ol>\n<li><a href=\"https://documenter.getpostman.com/view/13883930/TWDUqddC#6713b73f-0e7f-468a-aada-96b13c6a1f53\">Initiate Authentication</a><ol>\n<li>This API helps in passing Session ID and User contact number to the Bureau.</li>\n</ol>\n</li>\n<li><a href=\"https://documenter.getpostman.com/view/13883930/TWDUqddC#dc3c429f-e14b-499a-a964-31faa0d59c20\">Access User Information</a><ol>\n<li>This API helps in retrieving the verification request result</li>\n<li>Apart from GET, the result can also be retrieved via Webhook, URL for the same can be passed in the GET /initiate call</li>\n</ol>\n</li>\n</ol>\n<h2 id=\"using-the-api\">Using the API</h2>\n<p>The API works by redirecting the request to the telecom authentication gateway.<br>It is processed in 2 parts. Initially, we process it to check whether the request originates from the IP address &amp; mobile number belonging to a carrier we support. If it does not, we fail it fast using error codes. You can check for the http status code in 400 or 500 to detect an error. If it does belong to a supported carrier, the response is controlled by respective telco gateways.</p>\n<p>So you can process output to check if the http status code is in 200 series and, if yes, ignore the output. If the HTTP status code is 400 or 500 series, you can treat the authentication as non-serviceable and proceed with the backup.</p>\n<h1 id=\"testing-one-tap-login\">Testing One Tap Login</h1>\n<p>Testing in Sandbox</p>\n<p><em>Sandbox URL:</em> <a href=\"https://api.sandbox.bureau.id/v2/auth\"><em>https://api.sandbox.bureau.id/v2/auth</em></a></p>\n<p>For simulating silent authentication in sandbox, you can use any of the following phone numbers:</p>\n<ul>\n<li>779999999999</li>\n<li>779999999998</li>\n<li>779999999997</li>\n<li>779999999996</li>\n<li>779999999995</li>\n<li>779999999994</li>\n<li>779999999993</li>\n<li>779999999992</li>\n<li>779999999991</li>\n<li>779999999990</li>\n</ul>\n<ol>\n<li>For simulating the failure case, you can use any other phone number with prefix 77 except the ones mentioned above.</li>\n<li>For simulating silent authentication with scope as share in sandbox, you can use ZZ as the country code.</li>\n</ol>\n<h1 id=\"frequently-asked-questions\">Frequently Asked Questions</h1>\n<h2 id=\"what-is-one-tap-login\">What is One Tap Login?</h2>\n<p>Bureau Phone Number Verification is a turnkey API product for mobile phone number verification. It confirms the ownership of a mobile phone number by verifying the possession of an active SIM card with the same number. A mobile data session is created to a unique URL for the purpose of this verification. Bureau then resolves a match between the phone number that the mobile network operator identifies as the owner of the mobile data session, and the phone number being verified.</p>\n<h2 id=\"how-does-one-tap-login-solution-work\">How does One Tap Login Solution work?</h2>\n<p>Whenever anyone uses their mobile phone to make a phone call, send a text, or to access the internet, the provisioning mobile network operator has to first ascertain their identity. This is done through strong, cryptographic checks between the mobile operator and the SIM card in a user's mobile phone.</p>\n<p>Bureau leverages the identity that the carrier has established to verify if the provided credentials (phone number and SIM card) match. Only a valid, active SIM card can thus be identified by the carrier, thereby providing proof of possession of the phone number.</p>\n<p>Here's how mobile phone number verification works through Bureau:</p>\n<ol>\n<li>Your end-users submit their phone number through your mobile user interface. (This step is independent of Bureau and identical to any other mobile phone number verification flow.)</li>\n<li>You make the first API request (initiate) to initiate a verification request with the phone number.</li>\n<li>We verify with the mobile operator whether the mobile data session established for this request belongs to the same phone number as provided earlier.</li>\n<li>You can then make a request to check the result of the verification, to see whether the phone number provided in Step 1 was a successful match for the SIM card the user is using.</li>\n</ol>\n<p>The same steps may be repeated anytime you wish to re-verify a returning user.</p>\n<h2 id=\"best-practices\">Best Practices</h2>\n<p>For the sake of efficiency and best possible user experience it will be preferable for an application to use the mobile network data connection and on-net authorization where possible. Use Https for all requests.</p>\n<h3 id=\"pop-up-blocker\">Pop-Up Blocker</h3>\n<p>We recommend developers do everything they can to avoid pop-up blockers.<br>Pop-up blockers do not block if the action of a button, or link is a direct window.open() and users will not need to disable pop-up blockers in their browsers</p>\n<p>That means by way of example:</p>\n<p><code>[![](/gf/change.gif)](“/gf?profileSetup4=1&amp;regId=0target=“changeMealItem\")</code></p>\n<p>If window.open() is called in a success callback, or from a timer function for example, the browser is not opening a window as a result of a user action, but as a result of some programmatic activity - that’s when browsers block pop-ups</p>\n<p>E.g., if you are using ajax to invoke APIs from web client, then set attribute ‘async’ to ‘false’ as illustrated below:</p>\n<p><code>$.ajax({ url : url, type: 'GET', success : xxxxxxx, error : xxxxxxx, async: false })</code></p>\n<p>Setting async to false will not let the flow break between when the user clicks the login-button (when discovery API gets invoked) and when authorize API is hit programmatically on the basis of discovery response.</p>\n<h3 id=\"webview-for-native-apps\">Webview for native apps</h3>\n<p>Developers building native apps can process callbacks with webviews.<br>Webviews do not have to fill the entire screen – they can be simple 1 x 1 pixel views, where implementation is transparent to the user.</p>\n<h1 id=\"relevant-links-android-sdk-web-ios-sample-apps\">Relevant Links: Android SDK, Web &amp; iOS Sample Apps</h1>\n<p>Enabling One Tap Login on Android, IOS &amp; Web Integrations. Please follow the below guidelines to ensure full coverage and handle wifi connected devices:</p>\n<h2 id=\"android-sdk-integration\">Android SDK Integration</h2>\n<p><a href=\"https://github.com/Bureau-Inc/AndroidSDK\">Android SDK</a></p>\n<p>The code below can be used to make Initialise call. It takes care of creating session using mobile data even if wifi is connected.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>BureauAuth bureauAuth = new BureauAuth.Builder()\n    .mode(BureauAuth.Mode.Sandbox)\n    .clientId(\"Your Client Id\")\n    .build();\n        //Other Options in builder are\n        //timeOutInMs - total timeout\n        //callbackUrl   \n\n</code></pre><h2 id=\"ios-sdk-integration\">IOS SDK Integration</h2>\n<p><a href=\"https://github.com/Bureau-Inc/IOS-SDK\">iOS SDK</a></p>\n<p>For Handling wifi connected devices, Please download the source code from link below and follow given steps to enable Mobile Network and create https session from Mobile Network.<br><a href=\"https://drive.google.com/drive/folders/1vp54qtORTyTdJcxEYH1QOYBSM_SU83Ug\">Source Code Link</a></p>\n<ol>\n<li>Add the NetworkingLogic folder, which contains six files, to the project folder.</li>\n<li>Include #import \"HTTPRequester.h\" in the Swift bridging header file.</li>\n<li>Please use fireURL function to invoke initURL and finaliseURL.</li>\n<li>Please allow http redirects in your application.</li>\n</ol>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>let bureauObj = BureauAuth.Builder()\n          .setClientId(clientId: \"e72a4414-a416-4872-8eea-6b51d6cd96e1\")\n          .build()\n     //Other Options in builder are\n        //setTimeout - total timeout in seconds\n        //setCallBackUrl\n        //mode - sandbox and production\n\n</code></pre><h2 id=\"sample-react-app\">Sample React App</h2>\n<p><a href=\"https://github.com/Bureau-Inc/pinpoint-integration-examples\">Github Page</a></p>\n<p>On Execution of silentAuth function, backend call can be made to get status of authentication</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>//Input init URL &amp; final URL\n//No callbacks wait for a second and then call userinfo\nfunction silentAuth(correlationId, mobileNum, clientIDKey) {\n    var initURL = \"https://api.sandbox.bureau.id/v2/auth/initiate?clientId=CLIENTIDSTRING&amp;correlationId=CORRELATIONIDSTRING&amp;msisdn=MSISDNSTRING\"\n    var init = new Image();\n    init.onload = startComplete;\n    init.onerror = startComplete;\n    initURL = initURL.replace(\"CORRELATIONIDSTRING\", correlationId)\n    initURL = initURL.replace(\"CLIENTIDSTRING\", clientIDKey)\n    initURL = initURL.replace(\"MSISDNSTRING\", mobileNum)\n    init.src = initURL;\n        function startComplete() {\n            //callbacks are possible here. \n            console.log(\"Process Complete\")\n        }\n}\n\n</code></pre><h1 id=\"error-codes\">Error Codes</h1>\n<table><tbody><tr><td><b>Http Status Code</b><br></td><td><b>Code</b><br></td><td><b>Message</b><br></td><td><b>Suggested Action</b><br></td></tr><tr><td>200<br></td><td>200101<br></td><td>User verification failed<br></td><td><br></td></tr><tr><td>200<br></td><td>200100<br></td><td>User verification failed since providers failed to verify<br></td><td>Assume Authentication Failed and Backup to OTP<br></td></tr><tr><td>200<br></td><td>200102<br></td><td>User's ip doesn't belong to any supported provider<br></td><td><br></td></tr><tr><td>200<br></td><td>200103<br></td><td>User's mobile doesn't belong to any supported provider<br></td><td><br></td></tr><tr><td>202<br></td><td>202100<br></td><td>Awaiting provider acknowledgement<br></td><td><br></td></tr><tr><td>400<br></td><td>400100<br></td><td>Required parameters are missing or invalid<br></td><td>Recheck the parameters<br></td></tr><tr><td>400<br></td><td>400101<br></td><td>Duplicate correlation id<br></td><td>Retry with a Different Correlation ID<br></td></tr><tr><td>400<br></td><td>400102<br></td><td>Previous requests were not fulfilled or ended in errors<br></td><td>Assume Authentication Failed and Backup to OTP<br></td></tr><tr><td>400<br></td><td>400103<br></td><td>Cannot associate the correlation id with a flow<br></td><td>Check if Integration flow is working properly. Contact Bureau support<br></td></tr><tr><td>400<br></td><td>400104<br></td><td>Illegal application state<br></td><td>Assume Authentication Failed and Backup to OTP<br></td></tr><tr><td>400<br></td><td>410100<br></td><td>Auth state is expired<br></td><td>Please re-initiate the auth flow<br></td></tr><tr><td>400<br></td><td>400105<br></td><td>Signals are empty or invalid<br></td><td>Check API docs<br></td></tr><tr><td>400<br></td><td>400106<br></td><td>Signals are invalid or template config is missing<br></td><td>Check API docs or contact Bureau support team<br></td></tr><tr><td>401<br></td><td>401100<br></td><td>Authorization parameters are missing or invalid<br></td><td>Check Authentication Parameters<br></td></tr><tr><td>500<br></td><td>500100<br></td><td>An internal error has occurred<br></td><td>Assume Authentication Failed and Backup to OTP<br></td></tr></tbody></table></body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"Overview","slug":"overview"},{"content":"Enabling One Tap Login","slug":"enabling-one-tap-login"},{"content":"Product Flow","slug":"product-flow"},{"content":"API Integration","slug":"api-integration"},{"content":"Testing One Tap Login","slug":"testing-one-tap-login"},{"content":"Frequently Asked Questions","slug":"frequently-asked-questions"},{"content":"Relevant Links: Android SDK, Web & iOS Sample Apps","slug":"relevant-links-android-sdk-web-ios-sample-apps"},{"content":"Error Codes","slug":"error-codes"}],"owner":"13883930","collectionId":"a77d5cfb-f56a-48c9-9002-7e27597280e3","publishedId":"TWDUqddC","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"EF5B25"},"publishDate":"2021-03-04T10:30:24.000Z"},"item":[{"name":"Initiate Authentication","item":[{"name":"/initiate","id":"1c0f6a77-68c2-4eac-8206-b81bf0577f27","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://api.bureau.id/v2/auth/initiate?clientId=acxvexxc2b-e5mlkwe-wmdwef-asqw&transactionId=bcac2be5-cd70-4a0d-bda2-c9c63cd2e982&mobile=919999999999&countryCode=IN&callback=https://callback-response/callback","description":"<p>Query Parameters</p>\n<table>\n  <tr>\n   <td><strong>Parameter</strong>\n   </td>\n   <td><strong>Mandatory</strong>\n   </td>\n   <td><strong>Description</strong>\n   </td>\n  </tr>\n  <tr>\n   <td>transactionId\n   </td>\n   <td>Y\n   </td>\n   <td><em>string</em>\n<p>\nUniquely generated transaction ID\n   </p></td>\n  </tr>\n  <tr>\n   <td>callbackUrl\n   </td>\n   <td>N\n   </td>\n   <td><em>string</em>\n<p>\nClient Callback URL\n   </p></td>\n  </tr>\n  <tr>\n   <td>clientId\n   </td>\n   <td>Y\n   </td>\n   <td><em>string</em>\n<p>\nBureau Generated ClientId\n   </p></td>\n  </tr>\n  <tr>\n   <td>mobile\n   </td>\n   <td>Y\n   </td>\n   <td><em>string</em>\n<p>\nMobile Number captured from service user containing country code, E.164 format e.g 919958712345\n   </p></td>\n  </tr>\n  <tr>\n   <td>countryCode\n   </td>\n   <td>N\n   </td>\n   <td><em>string</em>\n<p>\nCountry code in ISO2 format e.g IN, US, etc.\n   </p></td>\n  </tr>\n  <tr>\n   <td>scope\n   </td>\n   <td>N\n   </td>\n   <td><em>string</em>\n<p>\n<em>Value: \"share\"</em>\n</p><p>\nThe scope of the resource access to be authorized\n   </p></td>\n  </tr>\n</table>\n\n\n\n<p>Pointers to be taken care of:</p>\n<ul>\n<li>Initiate the authentication process by calling API endpoint from user's device using mobile-carrier network.</li>\n<li>If the http status code is <strong>4XX</strong>, <strong>5XX</strong> and <strong>2XX</strong> with code in the JSON body as <strong>200102</strong> and <strong>200103</strong> (Refer the error doc), the authentication can be considered as a failure and need not proceed with rest of the API calls.</li>\n<li>The API works by redirecting the request to the telecom authentication gateway.\nIt is processed in 2 parts. Initially, we process it to check whether the request originates from the IP address &amp; mobile number belonging to a carrier we support. If it does not, we fail it fast using error codes. You can check for the http status code in 400 or 500 to detect an error. If it does belong to a supported carrier, the response is controlled by respective telco gateways.</li>\n<li>So you can process output to check if the http status code is in 200 series and, if yes, ignore the output. If the HTTP status code is 400 or 500 series, you can treat the authentication as non-serviceable and proceed with the backup</li>\n<li>The API response contract can vary based on the providers we use. The merchant application can expect the documented contract and behave accordingly.</li>\n<li>Http status code 3XX should be honored and the merchant application should follow the redirects.</li>\n<li>If the 'scope' parameter is not given then the 'mobile' parameter is mandatory.</li>\n</ul>\n","urlObject":{"protocol":"https","path":["v2","auth","initiate"],"host":["api","bureau","id"],"query":[{"description":{"content":"<p>String. Mandatory. Identifier for your business. Present on your Dashboard</p>\n","type":"text/plain"},"key":"clientId","value":"acxvexxc2b-e5mlkwe-wmdwef-asqw"},{"description":{"content":"<p>String. Mandatory. Transaction reference for the Initiate API call</p>\n","type":"text/plain"},"key":"transactionId","value":"bcac2be5-cd70-4a0d-bda2-c9c63cd2e982"},{"description":{"content":"<p>String. Mandatory. Mobile number of the user along with the country code</p>\n","type":"text/plain"},"key":"mobile","value":"919999999999"},{"description":{"content":"<p>String. Country code in ISO2 format</p>\n","type":"text/plain"},"key":"countryCode","value":"IN"},{"description":{"content":"<p>String. Callback URL for passing the response of Authentication</p>\n","type":"text/plain"},"key":"callback","value":"https://callback-response/callback"}],"variable":[]}},"response":[{"id":"dd053ce3-572a-41cc-9ebd-74eb175e14e2","name":"/initiate","originalRequest":{"method":"GET","header":[],"url":{"raw":"https://api.bureau.id/v2/auth/initiate?clientId=&transactionId=bcac2be5-cd70-4a0d-bda2-c9c63cd2e982&mobile=919999999999&countryCode=IN\n","protocol":"https","host":["api","bureau","id"],"path":["v2","auth","initiate"],"query":[{"key":"clientId","value":"","description":"The Client ID you receive from Bureau.id during onboarding."},{"key":"transactionId","value":"bcac2be5-cd70-4a0d-bda2-c9c63cd2e982","description":"A random string to correlate this transaction later."},{"key":"mobile","value":"919999999999","description":"The phone number (with country code) you want to use for this authentication request."},{"key":"countryCode","value":"IN\n"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n  \"code\": \"string\",\n  \"message\": \"string\",\n  \"details\": \"string\"\n}"}],"_postman_id":"1c0f6a77-68c2-4eac-8206-b81bf0577f27"}],"id":"6713b73f-0e7f-468a-aada-96b13c6a1f53","description":"<p>This API call is recommended to be implemented from the end-user’s end on device or front-end of the browser. This API call starts the authentication process by calling the API endpoint using User’s mobile-carrier network.</p>\n","_postman_id":"6713b73f-0e7f-468a-aada-96b13c6a1f53"},{"name":"Access User Information","item":[{"name":"/userInfo","id":"43d77fb6-059e-4563-b84b-e765d86de83f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"X-Bureau-Auth-API-Key","value":"","description":"<p>The API key provided by Bureau.id during onboarding.</p>\n","type":"text"}],"url":"https://api.bureau.id/v2/auth/userinfo?transactionId=acxvexxc2b-e5mlkwe-wmdwef-asqw","description":"<p>Query Parameters</p>\n<table>\n  <tr>\n   <td><strong>Parameter</strong>\n   </td>\n   <td><strong>Mandatory</strong>\n   </td>\n   <td><strong>Description</strong>\n   </td>\n  </tr>\n  <tr>\n   <td>correlationId\n   </td>\n   <td>Y\n   </td>\n   <td><em>string</em>\n<p>\nTransaction ID sent across in the Initiate API call\n   </p></td>\n  </tr>\n</table>\n\n\n<p>Header Parameters</p>\n<table>\n  <tr>\n   <td><strong>Parameter</strong>\n   </td>\n   <td><strong>Mandatory</strong>\n   </td>\n   <td><strong>Description</strong>\n   </td>\n  </tr>\n  <tr>\n   <td>X-Bureau-Auth-API-Key\n   </td>\n   <td>Y\n   </td>\n   <td>API Key provided by Bureau\n   </td>\n  </tr>\n</table>\n","urlObject":{"protocol":"https","path":["v2","auth","userinfo"],"host":["api","bureau","id"],"query":[{"description":{"content":"<p>The correlation ID generated during the AuthInitiate phase.</p>\n","type":"text/plain"},"key":"transactionId","value":"acxvexxc2b-e5mlkwe-wmdwef-asqw"}],"variable":[]}},"response":[{"id":"d8f03cfe-b794-4fa3-88b0-d82fb27fd972","name":"/userInfo","originalRequest":{"method":"GET","header":[{"key":"X-Bureau-Auth-API-Key","value":"","description":"The API key provided by Bureau.id during onboarding.","type":"text"}],"url":{"raw":"https://api.bureau.id/v2/auth/userinfo?transactionId=","protocol":"https","host":["api","bureau","id"],"path":["v2","auth","userinfo"],"query":[{"key":"transactionId","value":"","description":"The correlation ID generated during the AuthInitiate phase."}]}},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[],"cookie":[],"responseTime":null,"body":"{\n  \"mobileNumber\": \"string\",\n  \"country_code\": \"string\",\n  \"status\":\"string\" // \"Success\", \"Failure\" or \"Pending\"\n}"}],"_postman_id":"43d77fb6-059e-4563-b84b-e765d86de83f"},{"name":"Callback Payload Structure","id":"52423673-eebb-487d-87ce-68b53080c45e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"correlationId\": \"a15facc8-xxxx-xxxx-062\",\n    \"hurdleType\": \"SILENT_AUTH\",\n    \"mobile\": \"779999999997\",\n    \"signature\": {\n        \"alg\": \"sha256\",\n        \"data\": \"Edl4qqVm3sN7epBeehrYvahiA1rD8VEPonK3I7us3Dk=\"\n    },\n    \"status\": \"Success\",\n    \"timestamp\": \"1678161010\"\n}","options":{"raw":{"language":"json"}}},"url":"<callback-url>","description":"<p>This showcases the sample Callback payload that will be posted by us on the designated Callback URL passed in the Initiate API call.</p>\n<table>\n  <tr>\n   <td><strong>Parameter</strong>\n   </td>\n   <td><strong>Mandatory</strong>\n   </td>\n   <td><strong>Description</strong>\n   </td>\n  </tr>\n  <tr>\n   <td>correlationId\n   </td>\n   <td>Y\n   </td>\n   <td><em>string</em>\n<p>\nUniquely generated Transaction ID passed in Initiate call\n   </p></td>\n  </tr>\n  <tr>\n   <td>status\n   </td>\n   <td>Y\n   </td>\n   <td><em>string</em>\n<p>\nThis refers to the status of authentication request. Can be \"Success\"/\"Failure\"   </p></td>\n  </tr>\n  <tr>\n   <td>signature\n   </td>\n   <td>Y\n   </td>\n   <td><em>Object</em>\n<p>\nThe signature is the HMAC256 of \"CorrelationID:Status\" using the secret key.\n   </p></td>\n  </tr>\n  <tr>\n   <td>signature.\"alg\"\n   </td>\n   <td>Y\n   </td>\n   <td><em>string</em>\n<p>\nAlgorithm used for creating signature\n   </p></td>\n  </tr>\n  <tr>\n   <td>signature.\"data\"\n   </td>\n   <td>Y\n   </td>\n   <td><em>string</em>\n<p>\nValue of Signature\n   </p></td>\n  </tr>\n</table>","urlObject":{"host":["<callback-url>"],"query":[],"variable":[]}},"response":[{"id":"61ff9bfe-b5e9-45d3-b11f-0fc6439933e0","name":"Callback Payload Structure","originalRequest":{"method":"POST","header":[],"body":{"mode":"formdata","formdata":[{"key":"correlationId","value":"ABx12nMxNut3","description":"String. This refers to the Transaction ID passed in the /initiate call","type":"text"},{"key":"status","value":"Success","description":"String. This refers to the status of authentication request. Can be Success/Failure","type":"text"},{"key":"signature","value":"Object","description":"Object. This consists of the HMAC256 of \"CorrelationId:Status\" using the signing key","type":"text"}],"options":{"raw":{"language":"json"}}},"url":"https://callback-response/callback"},"_postman_previewlanguage":null,"header":null,"cookie":[],"responseTime":null,"body":null}],"_postman_id":"52423673-eebb-487d-87ce-68b53080c45e"}],"id":"dc3c429f-e14b-499a-a964-31faa0d59c20","description":"<ul>\n<li>This API should be called from the backend server with the authorization header (base64 encoded clientId:clientSecret). </li>\n<li>In case if the response status code is <strong>202</strong> (<strong>202100</strong> | Awaiting provider acknowledgement) then the client can try polling the API for a certain time and mark the authentication as a failure if the API did not respond with a 200 status. </li>\n<li>After successful auth initiation the transaction can fail if the provider has failed to verify the user or the user's network.</li>\n</ul>\n","_postman_id":"dc3c429f-e14b-499a-a964-31faa0d59c20"},{"name":"Fallback OTP","item":[{"name":"Initiate OTP","id":"9158ad08-49e7-4f08-9835-80dcbf34bd08","protocolProfileBehavior":{"disableBodyPruning":true,"disabledSystemHeaders":{}},"request":{"method":"POST","header":[{"key":"X-Bureau-Auth-API-Key","value":"$your-secret-api-key-here$","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"transactionId\": \"random-request-2021-08-27-10\",\n    \"otpConfigurationId\": \"4315cd42-db0f-4895-bb31-6fafc755c476\",\n    \"mobile\": \"919780879196\"\n}"},"url":"https://api.bureau.id/v2/auth/otp","description":"<p>This API helps initiating the OTP. The configuration ID shall be provided once the feature is enabled for your business.</p>\n<p>The Transaction ID needs to be generated from your end to track the result in the Validate OTP request.</p>\n","urlObject":{"protocol":"https","path":["v2","auth","otp"],"host":["api","bureau","id"],"query":[],"variable":[]}},"response":[{"id":"ca9808e5-1203-4d3e-bfda-7bf9a46cb323","name":"Initiate OTP - Success","originalRequest":{"method":"POST","header":[{"key":"X-Bureau-Auth-API-Key","value":"$your-secret-api-key-here$","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"transactionId\": \"random-request-2021-08-27-10\",\n    \"otpConfigurationId\": \"4315cd42-db0f-4895-bb31-6fafc755c476\",\n    \"mobile\": \"919780879196\"\n}"},"url":"https://api.bureau.id/v2/auth/otp"},"_postman_previewlanguage":null,"header":null,"cookie":[],"responseTime":null,"body":"{\n    \"transactionId\": \"shekh-otp-2021-08-22-6-prod\",\n    \"otpConfigurationId\": \"4315cd42-db0f-4895-bb31-6fafc755c476\",\n    \"mobile\": \"919780879196\",\n    \"otpStatus\": \"PENDING\",\n    \"retryAttempts\": null,\n    \"expireAt\": \"2021-08-24T11:22:51Z\",\n    \"createdAt\": \"2021-08-24T11:17:51.313731176Z\",\n    \"updatedAt\": \"2021-08-24T11:18:40.88350352Z\"\n}"},{"id":"717acfa4-440a-4cf3-ab9b-2b9f6a104582","name":"Initiate OTP - Failure","originalRequest":{"method":"POST","header":[{"key":"X-Bureau-Auth-API-Key","value":"$your-secret-api-key-here$","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"transactionId\": \"random-request-2021-08-27-10\",\n    \"otpConfigurationId\": \"4315cd42-db0f-4895-bb31-6fafc755c476\",\n    \"mobile\": \"919780879196\"\n}"},"url":"https://api.bureau.id/v2/auth/otp"},"status":"Bad Request","code":400,"_postman_previewlanguage":null,"header":null,"cookie":[],"responseTime":null,"body":"{\n    \"error\": {\n        \"code\": \"DUPLICATE_TRANSACTION_ID\",\n        \"description\": \"Duplicate transaction id\",\n        \"metadata\": {\n            \"transactionId\": \"random-request-2021-08-27-10\",\n            \"message\": \"\"\n        }\n    }\n}"}],"_postman_id":"9158ad08-49e7-4f08-9835-80dcbf34bd08"},{"name":"Validate OTP","id":"e50b24c6-0718-447b-98e1-600a12f09f93","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"X-Bureau-Auth-API-Key","value":"$your-secret-api-key$","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"transactionId\": \"random-request-2021-08-27-10\",\n    \"otpCode\": \"28613\"\n}"},"url":"https://api.bureau.id/v2/auth/otp/validate","description":"<p>OTP Status variable can have 2 values: PENDING and VERIFIED.</p>\n","urlObject":{"protocol":"https","path":["v2","auth","otp","validate"],"host":["api","bureau","id"],"query":[],"variable":[]}},"response":[{"id":"8e3c06f3-c413-439d-a9b0-f09e0ac7de71","name":"Validate OTP - Success","originalRequest":{"method":"POST","header":[{"key":"X-Bureau-Auth-API-Key","value":"$your-secret-api-key$","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"transactionId\": \"random-request-2021-08-27-10\",\n    \"otpCode\": \"28613\"\n}"},"url":"https://api.bureau.id/v2/auth/otp/validate"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":null,"cookie":[],"responseTime":null,"body":"{\n    \"transactionId\": \"shekh-otp-2021-08-22-6-prod\",\n    \"otpConfigurationId\": \"4315cd42-db0f-4895-bb31-6fafc755c476\",\n    \"mobile\": \"919780879196\",\n    \"otpStatus\": \"VERIFIED\",\n    \"retryAttempts\": null,\n    \"expireAt\": \"2021-08-24T11:22:51Z\",\n    \"createdAt\": \"2021-08-24T11:17:51.313731176Z\",\n    \"updatedAt\": \"2021-08-24T11:18:40.88350352Z\"\n}"},{"id":"8f4103d8-ba2a-4c80-a0ec-6b633761ca33","name":"Validate OTP - Failure","originalRequest":{"method":"POST","header":[{"key":"X-Bureau-Auth-API-Key","value":"$your-secret-api-key$","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"transactionId\": \"random-request-2021-08-27-10\",\n    \"otpCode\": \"28613\"\n}"},"url":"https://api.bureau.id/v2/auth/otp/validate"},"status":"Bad Request","code":400,"_postman_previewlanguage":null,"header":null,"cookie":[],"responseTime":null,"body":"{\n    \"error\": {\n        \"code\": \"USER_VERIFICATION_FAILURE\",\n        \"description\": \"OTP not matched\",\n        \"metadata\": {\n            \"transactionId\": \"random-request-2021-08-27-10\",\n            \"message\": \"\"\n        }\n    }\n}"}],"_postman_id":"e50b24c6-0718-447b-98e1-600a12f09f93"}],"id":"f7c1eaf0-dc9f-427c-8ca2-68213969948a","description":"<p>Fallback OTP can be triggered by configuring 2 APIs on your end for Initiating and Validating the OTP. For enabling this feature, please reach out to Bureau Team. </p>\n<p>The configuration for the size of OTP, expiry time etc. can be set from the Dashboard itself. In addition to that, the following error codes shall be provided for tracking the fate of OTP Requests:</p>\n<h1 id=\"error-codes\">Error Codes</h1>\n<table>\n\n<tr>\n   <td>HTTP Status Code\n\n   </td>\n   <td>Code\n\n   </td>\n   <td>Description\n\n   </td>\n  </tr><tr>\n   <td>400\n\n   </td>\n   <td>DUPLICATE_TRANSACTION_ID\n\n   </td>\n   <td>Duplicate Transaction ID\n\n   </td>\n  </tr>\n  <tr>\n   <td>404\n\n   </td>\n   <td>USER_AUTHENTICATION_REQUEST_FAILURE\n\n   </td>\n   <td>OTP configuration not found\n\n   </td>\n  </tr>\n  <tr>\n   <td>422\n\n   </td>\n   <td>USER_AUTHENTICATION_REQUEST_FAILURE\n\n   </td>\n   <td>OTP max retry attempts reached\n\n   </td>\n  </tr>\n  <tr>\n   <td>422\n\n   </td>\n   <td>USER_VERIFICATION_FAILURE\n\n   </td>\n   <td>OTP retry wait is in effect\n\n   </td>\n  </tr>\n  <tr>\n   <td>404\n\n   </td>\n   <td>AUTH_STATE_EXPIRED\n\n   </td>\n   <td>OTP expired or does not exist\n\n   </td>\n  </tr>\n  <tr>\n   <td>422\n\n   </td>\n   <td>USER_VERIFICATION_FAILURE\n\n   </td>\n   <td>OTP already verified/not matched\n\n   </td>\n  </tr>\n  <tr>\n   <td>400\n\n   </td>\n   <td>INVALID_SIGNALS\n\n   </td>\n   <td>Request body parameters are missing or invalid\n\n   </td>\n  </tr>\n  <tr>\n   <td>500\n\n   </td>\n   <td>INTERNAL_ERROR\n\n   </td>\n   <td>Internal server error\n\n   </td>\n  </tr>\n\n</table>","_postman_id":"f7c1eaf0-dc9f-427c-8ca2-68213969948a"}],"event":[{"listen":"prerequest","script":{"id":"e8395823-30dd-4b96-bf98-f31b4ed9c9f5","type":"text/javascript","exec":[""]}},{"listen":"test","script":{"id":"0ac239ca-dcc0-4005-ba0b-2bd964430d8d","type":"text/javascript","exec":[""]}}]}