Validate an OTPless auth token and retrieve device fingerprint data in a single backend call. Call this after the OTPless SDK returns an auth token; the response includes both authentication details and device fingerprint data.
Device fingerprinting mode. The OTPless SDK supports two modes, ASYNC and SYNC, configured by your native developer at the SDK level. Both modes use this same endpoint; only the timing of when the token is available to your app differs.
Authentication and device fingerprinting run concurrently. The SDK returns the auth token as soon as authentication completes, without waiting for fingerprinting to finish. The fingerprint result is attached by the OTPless backend when your backend calls validate token.
Step
Actor
Action
1
Client App
OTPless SDK initiates authentication. Device fingerprinting runs in the background concurrently.
2
OTPless SDK
Authentication completes and returns the auth token to the Client App. Fingerprinting continues in the background.
3
Client App
Receives the auth token and sends it to the Client Backend.
4
Client Backend
Calls POST /auth/v2/validate/token with the token to validate authentication and retrieve device fingerprint data.
5
OTPless Backend
Validates the token, attaches the fingerprint result (if available), and returns the full response.
6
Client Backend
Reads deviceFingerprinting.status: SUCCESS includes full data, FAILED means fingerprinting errored, PENDING means fingerprinting not yet complete, TIMEOUT means the threshold time was exceeded.
The SDK returns the auth token only after both authentication and device fingerprinting have completed. This guarantees fingerprint data is always available when your backend calls validate token.
Step
Actor
Action
1
Client App
OTPless SDK initiates authentication and device fingerprinting together.
2
OTPless SDK
Waits for both authentication and device fingerprinting to complete before returning.
3
Client App
Receives the auth token only after fingerprinting is complete. Sends the token to the Client Backend.
4
Client Backend
Calls POST /auth/v2/validate/token with the token.
5
OTPless Backend
Validates the token and returns the full response with device fingerprint data.
6
Client Backend
Reads deviceFingerprinting.status: SUCCESS includes full fingerprint data, FAILED includes message only.
PENDING and TIMEOUT can only occur in ASYNC mode, where the SDK returns the auth token before fingerprinting completes. In SYNC mode, the SDK waits for fingerprinting to finish, so the status is always SUCCESS or FAILED.
Device fingerprint result. Present when Device Fingerprinting is enabled.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"OTPLESS","colors":{"primary":"#2759CD","light":"#8DB0FB","dark":"#113997"},"logo":{"light":"https://mintcdn.com/otpless-96/_aEz_FhlLI0izHsE/logo/otpless-dark.svg?fit=max\u0026auto=format\u0026n=_aEz_FhlLI0izHsE\u0026q=85\u0026s=c211521d204eaa2c4148109d50d19edd","dark":"https://mintcdn.com/otpless-96/_aEz_FhlLI0izHsE/logo/otpless-light.svg?fit=max\u0026auto=format\u0026n=_aEz_FhlLI0izHsE\u0026q=85\u0026s=3fd27e254b68526fa18064c62467b18a","href":"https://otpless.com/"},"favicon":"https://mintcdn.com/otpless-96/_aEz_FhlLI0izHsE/favicon.svg?fit=max\u0026auto=format\u0026n=_aEz_FhlLI0izHsE\u0026q=85\u0026s=b0f8f3a3e4b70cf463375510df120336","background":{"image":"https://mintcdn.com/otpless-96/MG5MLCTUP00EUtvA/images/background-documentation-min.png?fit=max\u0026auto=format\u0026n=MG5MLCTUP00EUtvA\u0026q=85\u0026s=c85d6a33e17f625c33c28433c7a595cf","color":{"light":"#F9F9F9","dark":"#0c101f"}},"navbar":{"links":[{"href":"https://otpless.com/support","label":"Contact Support"}],"primary":{"type":"button","label":"Sign in","href":"https://otpless.com/dashboard"}},"footer":{"socials":{"x":"https://x.com/otpless","github":"https://github.com/orgs/otpless-tech/repositories","linkedin":"https://www.linkedin.com/company/otpless"}},"seo":{"indexing":"all"},"contextual":{"options":["copy","view","chatgpt","claude","mcp"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"otpless-96","hasAudioNarration":false,"actualSubdomain":"otpless-96","customDomains":["otpless.com"],"gitSource":{"type":"github","owner":"otpless-tech","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adb487a7ebcfcb7ce77c284","collectionId":"615c67d8-2ad1-47c5-9b47-83eedd597d3a","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adb487a7ebcfcb7ce77c284"},"feedback":{"thumbs":false,"issues":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6adb487a7ebcfcb7ce77c284","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"default","tag":"Frontend SDKs","count":77},{"language":"default","tag":"References","count":61},{"language":"default","tag":"Native/Mobile SDKs","count":51},{"language":"default","tag":"Web SDKs","count":20},{"language":"default","tag":"Android","count":14},{"language":"default","tag":"Server-Initiated Auth","count":12},{"language":"default","tag":"SDK based Integration","count":12},{"language":"default","tag":"Ionic","count":10},{"language":"default","tag":"Silent Network Auth","count":9},{"language":"default","tag":"SNA-SDK based Integration","count":9}]},"assistantConfig":{"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"deflection":{"enabled":true,"email":"help@otpless.com"}},"basePath":"/docs","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"button_style.css","content":".activate-button{display:inline-block;padding:10px 20px;font-size:14px;font-weight:400;color:#fff;border-radius:4px;text-decoration:none;text-align:center;transition:all .3s ease;cursor:pointer;background:#113997}.activate-button p{margin:0}.activate-button:focus,.activate-button:hover{background-color:#113997e1;color:#fff;text-decoration:none;cursor:pointer}.activate-button:active{background-color:#0a3495;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}"}],"page":{"pagePath":"device-fingerprint/validate-token","slug":"/device-fingerprint/validate-token","pageMetadata":{"title":"Auth + Device Fingerprint","openapi":"POST /auth/v2/validate/token","description":"Validates an OTPless auth token and returns the device fingerprint in one backend-to-backend call. Requires `clientId` and `clientSecret`.\n\n- Read `deviceFingerprinting.status` (`SUCCESS`, `FAILED`, `PENDING`, `TIMEOUT`) before using the data.\n- `PENDING` and `TIMEOUT` occur only in ASYNC mode.\n- A `FAILED` fingerprint does not mean auth failed; the top-level `status` is still `SUCCESS`.\n","href":"/device-fingerprint/validate-token"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n li: \"li\",\n p: \"p\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Validates an OTPless auth token and returns the device fingerprint in one backend-to-backend call. Requires \", _jsx(_components.code, {\n children: \"clientId\"\n }), \" and \", _jsx(_components.code, {\n children: \"clientSecret\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [\"Read \", _jsx(_components.code, {\n children: \"deviceFingerprinting.status\"\n }), \" (\", _jsx(_components.code, {\n children: \"SUCCESS\"\n }), \", \", _jsx(_components.code, {\n children: \"FAILED\"\n }), \", \", _jsx(_components.code, {\n children: \"PENDING\"\n }), \", \", _jsx(_components.code, {\n children: \"TIMEOUT\"\n }), \") before using the data.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"PENDING\"\n }), \" and \", _jsx(_components.code, {\n children: \"TIMEOUT\"\n }), \" occur only in ASYNC mode.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [\"A \", _jsx(_components.code, {\n children: \"FAILED\"\n }), \" fingerprint does not mean auth failed; the top-level \", _jsx(_components.code, {\n children: \"status\"\n }), \" is still \", _jsx(_components.code, {\n children: \"SUCCESS\"\n }), \".\"]\n }), \"\\n\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{Heading,Info,Table}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Table)_missingMdxReference(`Table`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Validate an OTPless auth token and retrieve device fingerprint data in a single backend call. Call this after the OTPless SDK returns an auth token; the response includes both authentication details and device fingerprint data.`}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Device fingerprinting mode.`}),` The OTPless SDK supports two modes, ASYNC and SYNC, configured by your native developer at the SDK level. Both modes use this same endpoint; only the timing of when the token is available to your app differs.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`integration-flows`,children:`Integration flows`}),`\n`,_jsx(_components.p,{children:`Both modes call this same endpoint. The difference is only in when the SDK returns the auth token to your app.`}),`\n`,_jsx(Heading,{level:`3`,id:`async-mode`,children:`ASYNC mode`}),`\n`,_jsx(_components.p,{children:`Authentication and device fingerprinting run concurrently. The SDK returns the auth token as soon as authentication completes, without waiting for fingerprinting to finish. The fingerprint result is attached by the OTPless backend when your backend calls validate token.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Step`}),_jsx(_components.th,{children:`Actor`}),_jsx(_components.th,{children:`Action`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`1`}),_jsx(_components.td,{children:`Client App`}),_jsx(_components.td,{children:`OTPless SDK initiates authentication. Device fingerprinting runs in the background concurrently.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`2`}),_jsx(_components.td,{children:`OTPless SDK`}),_jsx(_components.td,{children:`Authentication completes and returns the auth token to the Client App. Fingerprinting continues in the background.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`3`}),_jsx(_components.td,{children:`Client App`}),_jsx(_components.td,{children:`Receives the auth token and sends it to the Client Backend.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`4`}),_jsx(_components.td,{children:`Client Backend`}),_jsxs(_components.td,{children:[`Calls `,_jsx(_components.code,{children:`POST /auth/v2/validate/token`}),` with the token to validate authentication and retrieve device fingerprint data.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`5`}),_jsx(_components.td,{children:`OTPless Backend`}),_jsx(_components.td,{children:`Validates the token, attaches the fingerprint result (if available), and returns the full response.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`6`}),_jsx(_components.td,{children:`Client Backend`}),_jsxs(_components.td,{children:[`Reads `,_jsx(_components.code,{children:`deviceFingerprinting.status`}),`: SUCCESS includes full data, FAILED means fingerprinting errored, PENDING means fingerprinting not yet complete, TIMEOUT means the threshold time was exceeded.`]})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`sync-mode`,children:`SYNC mode`}),`\n`,_jsx(_components.p,{children:`The SDK returns the auth token only after both authentication and device fingerprinting have completed. This guarantees fingerprint data is always available when your backend calls validate token.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Step`}),_jsx(_components.th,{children:`Actor`}),_jsx(_components.th,{children:`Action`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`1`}),_jsx(_components.td,{children:`Client App`}),_jsx(_components.td,{children:`OTPless SDK initiates authentication and device fingerprinting together.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`2`}),_jsx(_components.td,{children:`OTPless SDK`}),_jsx(_components.td,{children:`Waits for both authentication and device fingerprinting to complete before returning.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`3`}),_jsx(_components.td,{children:`Client App`}),_jsx(_components.td,{children:`Receives the auth token only after fingerprinting is complete. Sends the token to the Client Backend.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`4`}),_jsx(_components.td,{children:`Client Backend`}),_jsxs(_components.td,{children:[`Calls `,_jsx(_components.code,{children:`POST /auth/v2/validate/token`}),` with the token.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`5`}),_jsx(_components.td,{children:`OTPless Backend`}),_jsx(_components.td,{children:`Validates the token and returns the full response with device fingerprint data.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`6`}),_jsx(_components.td,{children:`Client Backend`}),_jsxs(_components.td,{children:[`Reads `,_jsx(_components.code,{children:`deviceFingerprinting.status`}),`: SUCCESS includes full fingerprint data, FAILED includes message only.`]})]})]})]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`PENDING`}),` and `,_jsx(_components.code,{children:`TIMEOUT`}),` can only occur in ASYNC mode, where the SDK returns the auth token before fingerprinting completes. In SYNC mode, the SDK waits for fingerprinting to finish, so the status is always `,_jsx(_components.code,{children:`SUCCESS`}),` or `,_jsx(_components.code,{children:`FAILED`}),`.`]})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Auth + Device Fingerprint","openapi":"POST /auth/v2/validate/token","description":"Validates an OTPless auth token and returns the device fingerprint in one backend-to-backend call. Requires `clientId` and `clientSecret`.\n\n- Read `deviceFingerprinting.status` (`SUCCESS`, `FAILED`, `PENDING`, `TIMEOUT`) before using the data.\n- `PENDING` and `TIMEOUT` occur only in ASYNC mode.\n- A `FAILED` fingerprint does not mean auth failed; the top-level `status` is still `SUCCESS`.\n","href":"/device-fingerprint/validate-token"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Integration flows","slug":"integration-flows","depth":2,"children":[{"title":"ASYNC mode","slug":"async-mode","depth":3,"children":[]},{"title":"SYNC mode","slug":"sync-mode","depth":3,"children":[]}]}],"codeExamples":{}},"jsLinks":["/docs/_mintlify/custom/otpless-96/b09595f2b6159bec/script.js"],"openApiReferenceData":{"operation":{"summary":"Validate token with device fingerprint","operationId":"validateTokenWithDeviceFingerprint","description":"Validates an OTPless auth token and returns the device fingerprint in one backend-to-backend call. Requires `clientId` and `clientSecret`.\n\n- Read `deviceFingerprinting.status` (`SUCCESS`, `FAILED`, `PENDING`, `TIMEOUT`) before using the data.\n- `PENDING` and `TIMEOUT` occur only in ASYNC mode.\n- A `FAILED` fingerprint does not mean auth failed; the top-level `status` is still `SUCCESS`.\n","x-codeSamples":[{"lang":"shell","label":"cURL","source":"curl --location 'https://auth.otpless.app/auth/v2/validate/token' \\\n --header 'Content-Type: application/json' \\\n --header 'clientId: YOUR_CLIENT_ID' \\\n --header 'clientSecret: YOUR_CLIENT_SECRET' \\\n --data '{\n \"token\": \"1efbffd3ebd64132b7b9d0c08ac063b3\"\n }'\n"}],"requestBody":"43e73712-50a8-452b-9548-2f26bd892b63","responses":{"200":"c32f0fa8-e395-41e8-85f4-e9f88f685086","400":"c9e42416-cc0f-43d9-82c2-91c09fa28336","401":"e7438e8f-f31e-47f1-a86d-231240b8390e"},"method":"post","type":"path","servers":["4c5c94e0-ec56-47e2-928f-35cad3e5d94b"],"security":["c057a6ed-5165-4dad-8561-349a8fac0eff"],"path":"/auth/v2/validate/token","baseUrlOptions":["https://auth.otpless.app"],"title":"Validate token with device fingerprint","codeSamples":[{"label":"cURL","lang":"shell","source":"curl --location 'https://auth.otpless.app/auth/v2/validate/token' \\\n --header 'Content-Type: application/json' \\\n --header 'clientId: YOUR_CLIENT_ID' \\\n --header 'clientSecret: YOUR_CLIENT_SECRET' \\\n --data '{\n \"token\": \"1efbffd3ebd64132b7b9d0c08ac063b3\"\n }'\n"}],"requiredOnlyExamples":false,"requestExampleType":"codeSamples","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"description":"Payload containing the auth token received from the OTPless SDK.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","description":"The auth token received from the OTPless SDK.","isRequired":true,"uniqueKey":"token","typeLabel":"string"}},"required":["token"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"token":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"c32f0fa8-e395-41e8-85f4-e9f88f685086":{"description":"Authentication completed. Check deviceFingerprinting.status for the fingerprint result.","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","description":"The auth token passed in the request.","uniqueKey":"token","typeLabel":"string"},"status":{"type":"string","description":"SUCCESS when authentication passed.","example":"SUCCESS","uniqueKey":"status","typeLabel":"string"},"userId":{"type":"string","description":"Unique user identifier assigned by OTPless.","uniqueKey":"userId","typeLabel":"string"},"timestamp":{"type":"string","format":"date-time","description":"ISO 8601 timestamp of the authentication event.","uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"},"identities":{"type":"array","items":{"type":"object","properties":{"identityType":{"type":"string","description":"Type of identity verified, e.g. MOBILE, EMAIL.","example":"MOBILE","uniqueKey":"identities.items.[INDEX].identityType","typeLabel":"string"},"identityValue":{"type":"string","description":"The verified identity value, e.g. the phone number.","example":"91XXXXXXXXXX","uniqueKey":"identities.items.[INDEX].identityValue","typeLabel":"string"},"channel":{"type":"string","description":"Authentication channel used, e.g. SILENT_AUTH, OTP.","example":"SILENT_AUTH","uniqueKey":"identities.items.[INDEX].channel","typeLabel":"string"},"methods":{"type":"array","items":{"type":"string","uniqueKey":"identities.items.[INDEX].methods.items.[INDEX]","typeLabel":"string"},"example":["SILENT_AUTH"],"uniqueKey":"identities.items.[INDEX].methods","typeLabel":"string[]"},"verified":{"type":"boolean","example":true,"uniqueKey":"identities.items.[INDEX].verified","typeLabel":"boolean"},"verifiedAt":{"type":"string","format":"date-time","uniqueKey":"identities.items.[INDEX].verifiedAt","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"identities.items.[INDEX]","typeLabel":"object"},"uniqueKey":"identities","typeLabel":"object[]"},"deviceFingerprinting":{"type":"object","description":"Device fingerprint result. Present when Device Fingerprinting is enabled.","properties":{"status":{"type":"string","enum":["SUCCESS","FAILED","PENDING","TIMEOUT"],"description":"SUCCESS includes the full fingerprint data. FAILED means fingerprinting could not complete (status and message only). PENDING means fingerprinting had not completed when the token was validated (ASYNC only). TIMEOUT means it exceeded the allowed threshold and was terminated (ASYNC only).","uniqueKey":"deviceFingerprinting.status","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Descriptive message. Present when status is FAILED, PENDING, or TIMEOUT.","uniqueKey":"deviceFingerprinting.message","typeLabel":"string"},"sessionId":{"type":"string","description":"Session identifier. Present on SUCCESS.","uniqueKey":"deviceFingerprinting.sessionId","typeLabel":"string"},"deviceId":{"type":"string","description":"Persistent device identifier. Present on SUCCESS.","uniqueKey":"deviceFingerprinting.deviceId","typeLabel":"string"},"newDevice":{"type":"boolean","description":"true if this device has not been seen before. Present on SUCCESS.","uniqueKey":"deviceFingerprinting.newDevice","typeLabel":"boolean"},"riskAssessment":{"type":"object","description":"Risk scores and boolean flags. Present on SUCCESS.","properties":{"sessionRiskLevel":{"type":"string","example":"HIGH","uniqueKey":"deviceFingerprinting.riskAssessment.sessionRiskLevel","typeLabel":"string"},"deviceRiskLevel":{"type":"string","example":"HIGH","uniqueKey":"deviceFingerprinting.riskAssessment.deviceRiskLevel","typeLabel":"string"},"sessionRiskScore":{"type":"integer","example":99,"uniqueKey":"deviceFingerprinting.riskAssessment.sessionRiskScore","typeLabel":"integer"},"deviceRiskScore":{"type":"integer","example":95,"uniqueKey":"deviceFingerprinting.riskAssessment.deviceRiskScore","typeLabel":"integer"},"ipFraudScore":{"type":"integer","example":0,"uniqueKey":"deviceFingerprinting.riskAssessment.ipFraudScore","typeLabel":"integer"},"flags":{"type":"object","description":"Boolean device signals.","uniqueKey":"deviceFingerprinting.riskAssessment.flags","typeLabel":"object"}},"uniqueKey":"deviceFingerprinting.riskAssessment","typeLabel":"object"},"deviceContext":{"type":"object","description":"Hardware, storage, lifecycle, and SIM information. Present on SUCCESS.","uniqueKey":"deviceFingerprinting.deviceContext","typeLabel":"object"},"networkContext":{"type":"object","description":"IP address, ISP, and geolocation. Present on SUCCESS.","uniqueKey":"deviceFingerprinting.networkContext","typeLabel":"object"}},"uniqueKey":"deviceFingerprinting","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"fingerprintAvailable":{"title":"fingerprintAvailable","value":{"token":"e9e3f030c1384b55bb42f2ecf8fd1786","status":"SUCCESS","userId":"MO-ceb09c6e14cf4733b72a4317f30a3f0f","timestamp":"2026-05-12T07:19:42Z","identities":[{"identityType":"MOBILE","identityValue":"91XXXXXXXXXX","channel":"SILENT_AUTH","methods":["SILENT_AUTH"],"verified":true,"verifiedAt":"2026-05-12T07:19:42Z"}],"deviceFingerprinting":{"status":"SUCCESS","sessionId":"8481663f-ceec-499d-ba04-2afd1527cdb8","deviceId":"781b21f7-220b-4f44-9155-6261f8564924","newDevice":false,"riskAssessment":{"sessionRiskLevel":"HIGH","deviceRiskLevel":"HIGH","sessionRiskScore":99,"deviceRiskScore":95,"ipFraudScore":0,"flags":{"isAppTampered":true,"debuggingEnabled":true,"googlePlayStoreInstall":false}},"deviceContext":{"brand":"iQOO","model":"I2410","os":"Android","osVersion":"16","screenResolution":"1080x2238","totalRamBytes":7804567552,"simInfo":{"totalSimsUsed":5,"activeSims":[{"id":4,"slotIndex":0,"carrierName":"Vi India"},{"id":1,"slotIndex":1,"carrierName":"airtel"}]}},"networkContext":{"ipAddress":"xxx.xxx.xxx.xxx","isp":"Bharti Airtel Limited","location":{"city":"Ahmedabad","region":"Gujarat","country":"India"}}}}},"fingerprintUnavailable":{"title":"fingerprintUnavailable","value":{"token":"51086843d2bd432ebff9d8ec33b07202","status":"SUCCESS","userId":"MO-ceb09c6e14cf4733b72a4317f30a3f0f","timestamp":"2026-05-11T14:19:59Z","identities":[{"identityType":"MOBILE","identityValue":"91XXXXXXXXXX","channel":"SILENT_AUTH","methods":["SILENT_AUTH"],"verified":true,"verifiedAt":"2026-05-11T14:19:59Z"}],"deviceFingerprinting":{"status":"FAILED","message":"Device intelligence data not available"}}}},"exampleType":"examples"}},"exampleType":"examples"},"c9e42416-cc0f-43d9-82c2-91c09fa28336":{"description":"Bad Request - missing or invalid request parameters.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Short error message.","uniqueKey":"message","typeLabel":"string"},"errorCode":{"type":"string","description":"OTPless error code.","uniqueKey":"errorCode","typeLabel":"string"},"description":{"type":"string","description":"Longer error description.","uniqueKey":"description","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"example":{"message":"Invalid Request","errorCode":"7114","description":"Request error: Invalid token"},"examples":{"Example":{"title":"Example","value":{"message":"Invalid Request","errorCode":"7114","description":"Request error: Invalid token"}}},"exampleType":"examples"}},"exampleType":"examples"},"e7438e8f-f31e-47f1-a86d-231240b8390e":{"description":"Unauthorized - the token is expired, or clientId / clientSecret is missing or invalid.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Short error message.","uniqueKey":"message","typeLabel":"string"},"errorCode":{"type":"string","description":"OTPless error code.","uniqueKey":"errorCode","typeLabel":"string"},"description":{"type":"string","description":"Longer error description.","uniqueKey":"description","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"tokenExpired":{"title":"tokenExpired","value":{"message":"Expired","errorCode":"7301","description":"Request error: Token is expired"}},"merchantCredentialsEmpty":{"title":"merchantCredentialsEmpty","value":{"message":"Access blocked","errorCode":"7012","description":"Authorization error: Merchant credentials are empty"}},"invalidCredentials":{"title":"invalidCredentials","value":{"message":"Access blocked","errorCode":"7002","description":"Authorization error: Invalid credentials"}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"c057a6ed-5165-4dad-8561-349a8fac0eff":{"clientIdHeader":{"type":"apiKey","in":"header","name":"clientId","description":"The clientId used for API authentication.","scopes":[]},"clientSecretHeader":{"type":"apiKey","in":"header","name":"clientSecret","description":"The clientSecret used for API authentication.","scopes":[]}}},"servers":{"4c5c94e0-ec56-47e2-928f-35cad3e5d94b":{"url":"https://auth.otpless.app","description":"OTPless authentication service"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"clientId","description":"The clientId used for API authentication.","scopes":[]},"schema":{"title":"clientId","type":"string","description":"The clientId used for API authentication.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"clientIdHeader","name":"clientId"},{"scheme":{"type":"apiKey","in":"header","name":"clientSecret","description":"The clientSecret used for API authentication.","scopes":[]},"schema":{"title":"clientSecret","type":"string","description":"The clientSecret used for API authentication.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"clientSecretHeader","name":"clientSecret"}],"title":"clientIdHeader \u0026 clientSecretHeader"}]},"originalFileLocation":"device-fingerprint/validate-token.yaml"},"subdomain":"otpless-96","siteName":"OTPLESS","title":"Auth + Device Fingerprint - OTPLESS","contextualStarterQuestions":[{"_id":"6a577959e6f02825c3dfa3af","deploymentId":"65507bb0b99260c1f65d01cc","questionText":"How do ASYNC and SYNC modes differ?","status":"active","generatedBy":"contextual","path":"device-fingerprint/validate-token","createdAt":"2026-07-15T12:13:13.863Z","updatedAt":"2026-07-15T12:13:13.863Z","__v":0},{"_id":"6a577959e6f02825c3dfa3b0","deploymentId":"65507bb0b99260c1f65d01cc","questionText":"When should I validate the auth token?","status":"active","generatedBy":"contextual","path":"device-fingerprint/validate-token","createdAt":"2026-07-15T12:13:13.863Z","updatedAt":"2026-07-15T12:13:13.863Z","__v":0}],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-07-15T12:12:52.507Z","originalFileLocation":"device-fingerprint/validate-token.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Validates an OTPless auth token and returns the device fingerprint in one backend-to-backend call. Requires clientId and clientSecret. - Read deviceFingerprinting.status (SUCCESS, FAILED, PENDING, TIMEOUT) before using the data. - PENDING and TIMEOUT occur only in ASYNC mode. - A FAILED fingerprint does not mean auth failed; the top-level status is still SUCCESS.\">\u003cmeta data-mint-head name=\"application-name\" content=\"OTPLESS\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/otpless-96/4ecEfjOYTKC7Ncnz/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/otpless-96/4ecEfjOYTKC7Ncnz/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/otpless-96/4ecEfjOYTKC7Ncnz/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/otpless-96/4ecEfjOYTKC7Ncnz/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/otpless-96/4ecEfjOYTKC7Ncnz/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/otpless-96/4ecEfjOYTKC7Ncnz/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/otpless-96/4ecEfjOYTKC7Ncnz/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/otpless-96/4ecEfjOYTKC7Ncnz/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/otpless-96/4ecEfjOYTKC7Ncnz/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Auth + Device Fingerprint - OTPLESS\">\u003cmeta data-mint-head property=\"og:description\" content=\"Validates an OTPless auth token and returns the device fingerprint in one backend-to-backend call. Requires clientId and clientSecret. - Read deviceFingerprinting.status (SUCCESS, FAILED, PENDING, TIMEOUT) before using the data. - PENDING and TIMEOUT occur only in ASYNC mode. - A FAILED fingerprint does not mean auth failed; the top-level status is still SUCCESS.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"OTPLESS\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://otpless.com/docs/device-fingerprint/validate-token\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://otpless-96.mintlify.app/_mintlify/api/og/v2?division=Backend+API\u0026amp;title=Auth+%2B+Device+Fingerprint\u0026amp;description=Validates+an+OTPless+auth+token+and+returns+the+device+fingerprint+in+one+backend-to-backend+call.+Requires+%60clientId%60+and+%60clientSecret%60.%0A%0A-+Read+%60deviceFinger\u0026amp;theme=7f8688bffaa68a7d5c144e80\u0026amp;signature=2265950e1cdf07199981bbc03e257f6f5c9fd66093400b5c6798d301048ce8ca\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Auth + Device Fingerprint - OTPLESS\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Validates an OTPless auth token and returns the device fingerprint in one backend-to-backend call. Requires clientId and clientSecret. - Read deviceFingerprinting.status (SUCCESS, FAILED, PENDING, TIMEOUT) before using the data. - PENDING and TIMEOUT occur only in ASYNC mode. - A FAILED fingerprint does not mean auth failed; the top-level status is still SUCCESS.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://otpless-96.mintlify.app/_mintlify/api/og/v2?division=Backend+API\u0026amp;title=Auth+%2B+Device+Fingerprint\u0026amp;description=Validates+an+OTPless+auth+token+and+returns+the+device+fingerprint+in+one+backend-to-backend+call.+Requires+%60clientId%60+and+%60clientSecret%60.%0A%0A-+Read+%60deviceFinger\u0026amp;theme=7f8688bffaa68a7d5c144e80\u0026amp;signature=2265950e1cdf07199981bbc03e257f6f5c9fd66093400b5c6798d301048ce8ca\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/otpless-96/4ecEfjOYTKC7Ncnz/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"OTPLESS\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2759CD\">\u003clink data-mint-head rel=\"canonical\" href=\"https://otpless.com/docs/device-fingerprint/validate-token\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/device-fingerprint/validate-token.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://otpless.com/#organization\",\"name\":\"OTPLESS\",\"url\":\"https://otpless.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/otpless-96/_aEz_FhlLI0izHsE/logo/otpless-dark.svg?fit=max\u0026auto=format\u0026n=_aEz_FhlLI0izHsE\u0026q=85\u0026s=c211521d204eaa2c4148109d50d19edd\"}},{\"@type\":\"WebSite\",\"@id\":\"https://otpless.com/docs#website\",\"name\":\"OTPLESS\",\"url\":\"https://otpless.com/docs\",\"publisher\":{\"@id\":\"https://otpless.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://otpless.com/docs/device-fingerprint/validate-token#webpage\",\"url\":\"https://otpless.com/docs/device-fingerprint/validate-token\",\"name\":\"Auth + Device Fingerprint\",\"description\":\"Validates an OTPless auth token and returns the device fingerprint in one backend-to-backend call. Requires clientId and clientSecret. - Read deviceFingerprinting.status (SUCCESS, FAILED, PENDING, TIMEOUT) before using the data. - PENDING and TIMEOUT occur only in ASYNC mode. - A FAILED fingerprint does not mean auth failed; the top-level status is still SUCCESS.\",\"dateModified\":\"2026-07-15T12:12:52.507Z\",\"isPartOf\":{\"@id\":\"https://otpless.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://otpless.com/docs/device-fingerprint/validate-token#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://otpless.com/docs/device-fingerprint/validate-token#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"OTPLESS\",\"item\":\"https://otpless.com/docs\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Auth + Device Fingerprint\",\"item\":\"https://otpless.com/docs/device-fingerprint/validate-token\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://otpless.com/docs/device-fingerprint/validate-token#apireference\",\"headline\":\"Auth + Device Fingerprint\",\"name\":\"Auth + Device Fingerprint\",\"description\":\"Validates an OTPless auth token and returns the device fingerprint in one backend-to-backend call. Requires clientId and clientSecret. - Read deviceFingerprinting.status (SUCCESS, FAILED, PENDING, TIMEOUT) before using the data. - PENDING and TIMEOUT occur only in ASYNC mode. - A FAILED fingerprint does not mean auth failed; the top-level status is still SUCCESS.\",\"url\":\"https://otpless.com/docs/device-fingerprint/validate-token\",\"mainEntityOfPage\":{\"@id\":\"https://otpless.com/docs/device-fingerprint/validate-token#webpage\"},\"dateModified\":\"2026-07-15T12:12:52.507Z\",\"publisher\":{\"@id\":\"https://otpless.com/#organization\"},\"isPartOf\":{\"@id\":\"https://otpless.com/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"OTPLESS\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"OTPLESS","nav":{"global":null,"tabs":[{"tab":"Home","pages":[{"title":"Home","href":"/introduction"}]},{"tab":"Frontend SDKs","pages":[{"title":"Frontend SDKs","href":"/quick-start"}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/introduction"}]},{"tab":"Server-Initiated Auth","pages":[{"title":"Server-Initiated Auth","href":"/server-initiated-auth/overview"}]},{"tab":"Silent Network Auth","pages":[{"title":"Silent Network Auth","href":"/sna/overview"}]},{"tab":"Device Fingerprint","groups":[{"group":"Device Fingerprint","pages":[{"title":"Overview","mode":"wide","href":"/device-fingerprint/overview"}]},{"group":"SDK","pages":[{"title":"Android","mode":"wide","href":"/device-fingerprint/sdk/android"},{"title":"iOS","description":"Integrate Device Fingerprint SDK in your iOS app.","mode":"wide","href":"/device-fingerprint/sdk/ios"}]},{"group":"Backend API","pages":[{"title":"Auth + Device Fingerprint","openapi":"POST /auth/v2/validate/token","href":"/device-fingerprint/validate-token"}]}]},{"tab":"Resources","hidden":true}]},"title":"Auth + Device Fingerprint - OTPLESS","buildId":"dpl_GvhK4qVXq51DpfYJLCtPpYNN4YHN","deploymentId":"dpl_GvhK4qVXq51DpfYJLCtPpYNN4YHN","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-Bg4Z7D_G.js","utils-Biz734EK.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-C6F9YHs6.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BoJjY_VP.js","snippetPresets-CnZ-mOFh.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-DC_SB2pp.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BYKtOiIP.js","shallow-COAac_UD.js","getApiPlaygroundDisplay-BV4Viqi2.js","CodeSnippet-DDgW-JXl.js","CodeSnippets-CP1LpNhG.js","Page-BeiUfucV.js","getPastedJson-Cvgvbfmv.js","icon-D-H368xH.js","MethodPill-CXSxH1VW.js","DuplicateIcon-JcbBzF1x.js","createIcon-BDt_aHZM.js","DynamicMarkdown-DO1Fz7ar.js","SectionHeading-mwKBArs3.js","axios-vUo_bRtp.js","Markdown-C3KUTGJN.js","clsx-C6CAjViH.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-C3vb5JQZ.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-C8Hisf3g.js"]}