Load the loader script once per page load. The loader attaches itself as window.Proview. Injecting it a second time — on a client-side route change, for example — can duplicate listeners and re-run initialization. Guard the injection with a check for window.Proview.Define window.proviewOnLoad before the loader tag. The SDK fires it as soon as it is ready, and Proview.init() belongs inside it. If you assign the callback after the loader tag, the SDK may have already fired and your callback will never run.Handle a failed script load. A CDN failure is otherwise silent:
<script src="https://sdk.tlv.cx" async crossorigin="anonymous" onerror="console.error('Proview SDK failed to load')"></script>
Declare dsn and credential once. They are set on Proview.init() and inherited by every module in the modules array. Do not repeat them per module.Declare only the modules you use. Each factory in modules pulls in its own runtime.
Always await init and check the result.Proview.init() resolves to a boolean. Using a module before it resolves is a race:
const success = await Proview.init({ dsn, credential, modules: [Proview.scheduler()] });if (!success) { // Surface a user-facing message; do not proceed to mount the UI return;}
Fetch tokens as late as possible. Tokens are short-lived. One embedded in server-rendered HTML may already be expired by the time the user acts. Have your backend fetch it at bootstrap time instead.Never hard-code credentials in client source. The DSN identifies the project and is safe to ship; the credential is not.Plan for expiry. Long assessments outlive most token lifetimes. Decide up front whether your integration refreshes the token or fails closed, and make that behavior visible to the user.
When errors thrown by callback functions are not handled by the parent application, Proview swallows them to prevent disruption of the SDK’s core functionality. Always implement proper error handling inside your callbacks.
Register one global handler, early.Proview.onError supports a single handler — registering a new one replaces the previous. Register it before Proview.init() so initialization failures are captured, and fan out from inside it if several parts of your app need to react.
Handle errors inside callbacks too. A throw inside your own callback is swallowed by the SDK, so it will not reach the global handler:
// Good — errors handled locallyProview.session.onSessionPause('User requested break', function (sessionStateOutput, err) { try { if (err) { console.error('Hook error:', err); return; } saveUserProgress(); showPauseUI(); } catch (error) { console.error('Error in pause handler:', error); }});// Bad — a throw here disappears silentlyProview.session.onSessionPause('User requested break', function (sessionStateOutput, err) { riskyOperation();});
Respect type.critical means core functionality is impacted and the user needs to know. warning and info should be logged, not surfaced. Severity is set per occurrence, so read type on every error rather than assuming a fixed severity per code.
Make sure the container exists before you mount. Mount targets are resolved at call time, so the element must already be in the DOM. In a component framework, mount from the effect that runs after render, not during it.Give the container explicit dimensions. A container with no height renders nothing visible. Either size it with CSS or pass explicit dimensions to the module.
Log every SDK error to your own monitoring system, tagged with the DSN, environment, and the user or attempt identifier. Console logs are not available to you when a customer reports a problem in production.Capture the error code, not just the message. On validation failures also capture validationErrors.formattedMessage — it names the fields that were rejected.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Talview Docs","colors":{"primary":"#1D4ED8","light":"#2059f5","dark":"#1741b3"},"logo":{"light":"https://mintcdn.com/talview-f3acd66d/4nxeCBiNgVZtoctt/logo/light.png?fit=max\u0026auto=format\u0026n=4nxeCBiNgVZtoctt\u0026q=85\u0026s=5c272fb59a6d1ae9d78a98e6ba767eba","dark":"https://mintcdn.com/talview-f3acd66d/4nxeCBiNgVZtoctt/logo/dark.png?fit=max\u0026auto=format\u0026n=4nxeCBiNgVZtoctt\u0026q=85\u0026s=c0ace49b68ee35fc864942b4c5bb93df"},"favicon":"https://mintcdn.com/talview-f3acd66d/auUfq4nfNITfsnOi/favicon.ico?fit=max\u0026auto=format\u0026n=auUfq4nfNITfsnOi\u0026q=85\u0026s=ec54f9b1628c75468c025b6ac0a8db6e","footer":{"socials":{"x":"https://x.com/talview","linkedin":"https://www.linkedin.com/company/talview","website":"https://www.talview.com/"},"links":[{"header":"Resources","items":[{"label":"Our Ethical AI Practices","href":"https://www.talview.com/en/ethical-ai-practices"},{"label":"Zero Code Integration","href":"https://www.talview.com/en/zero-code-integration"},{"label":"Our Integration Partners","href":"https://www.talview.com/en/integrations"}]},{"header":"Support","items":[{"label":"Seven Layer Security Framework","href":"https://www.talview.com/en/seven-layer-security-framework"},{"label":"The Empathy Advantage","href":"https://www.talview.com/en/empathy-advantage"},{"label":"Frequently Asked Questions","href":"https://www.talview.com/en/faq"}]},{"header":"Contact Us","items":[{"label":"Talk to Sales","href":"https://www.talview.com/talk-to-sales?utm_source=docs.talview.com\u0026utm_medium=footer\u0026utm_campaign=talk_to_sales"}]}]},"seo":{"metatags":{"google-site-verification":"-YCNNWMi1t69X2myeM5WhTLU005LRJLmthsEQ59RcRs"}},"integrations":{"mixpanel":{"projectToken":"1c7c27fca7274aadf357a735e3979cc0"}},"contextual":{"options":["copy","view"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"talview-f3acd66d","hasAudioNarration":false,"actualSubdomain":"talview-f3acd66d","customDomains":["docs.talview.com"],"gitSource":{"type":"github","owner":"talview","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aec2d2e4c75a873192ca962","collectionId":"53dd4602-b704-4ca4-b9a8-a8f2e82c3dfe","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aec2d2e4c75a873192ca962"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aed9d2661234cac2656b92d","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"default","tag":"Candidates","count":248},{"language":"default","tag":"Hiring Teams","count":213},{"language":"default","tag":"Diagnostics","count":176},{"language":"default","tag":"How-tos","count":159},{"language":"default","tag":"Recruiter","count":133},{"language":"default","tag":"System Diagnostics","count":117},{"language":"default","tag":"Admin","count":109},{"language":"default","tag":"Interviews","count":94},{"language":"default","tag":"Evaluator","count":79},{"language":"default","tag":"Configurations","count":65}],"searchSettings":{"isFiltersEnabled":true}},"assistantConfig":{"enableAskAiButton":true,"enableStarterQuestions":false,"enableAskAiSearchBar":false,"deflection":{"enabled":true,"type":"link","email":"support@talview.com","url":"https://talview.freshdesk.com/support/tickets/new","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"sdk/best-practices","slug":"/sdk/best-practices","pageMetadata":{"title":"Best Practices","description":"Recommended practices for integrating the Proview SDK effectively and securely","href":"/sdk/best-practices"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Recommended practices for integrating the Proview SDK effectively and securely\"\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`,em:`em`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`These practices apply to every Proview SDK module. Module-specific guidance lives on each module’s own page.`}),`\n`,_jsx(Heading,{level:`2`,id:`loading`,children:`Loading`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Load the loader script once per page load.`}),` The loader attaches itself as `,_jsx(_components.code,{children:`window.Proview`}),`. Injecting it a second time — on a client-side route change, for example — can duplicate listeners and re-run initialization. Guard the injection with a check for `,_jsx(_components.code,{children:`window.Proview`}),`.`]}),`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Define `,_jsx(_components.code,{children:`window.proviewOnLoad`}),` before the loader tag.`]}),` The SDK fires it as soon as it is ready, and `,_jsx(_components.code,{children:`Proview.init()`}),` belongs inside it. If you assign the callback `,_jsx(_components.em,{children:`after`}),` the loader tag, the SDK may have already fired and your callback will never run.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Handle a failed script load.`}),` A CDN failure is otherwise silent:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`html`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`html`,children:_jsxs(_components.code,{language:`html`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`script`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:` src`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://sdk.tlv.cx\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:` async`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:` crossorigin`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"anonymous\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:` onerror`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`error`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`('Proview SDK failed to load')\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>\u003c/`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`script`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`initialization`,children:`Initialization`}),`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Declare `,_jsx(_components.code,{children:`dsn`}),` and `,_jsx(_components.code,{children:`credential`}),` once.`]}),` They are set on `,_jsx(_components.code,{children:`Proview.init()`}),` and inherited by every module in the `,_jsx(_components.code,{children:`modules`}),` array. Do not repeat them per module.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Declare only the modules you use.`}),` Each factory in `,_jsx(_components.code,{children:`modules`}),` pulls in its own runtime.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#C8C8C8`},children:`modules`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Proview`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`form`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()]`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Scheduling page`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#C8C8C8`},children:`modules`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Proview`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`scheduler`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()]`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Always `,_jsx(_components.code,{children:`await`}),` init and check the result.`]}),` `,_jsx(_components.code,{children:`Proview.init()`}),` resolves to a boolean. Using a module before it resolves is a race:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` success`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` Proview`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`init`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`dsn`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`credential`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`modules:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Proview`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`scheduler`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()] });`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`!`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`success`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Surface a user-facing message; do not proceed to mount the UI`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`credentials`,children:`Credentials`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Fetch tokens as late as possible.`}),` Tokens are short-lived. One embedded in server-rendered HTML may already be expired by the time the user acts. Have your backend fetch it at bootstrap time instead.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Never hard-code credentials in client source.`}),` The DSN identifies the project and is safe to ship; the credential is not.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Plan for expiry.`}),` Long assessments outlive most token lifetimes. Decide up front whether your integration refreshes the token or fails closed, and make that behavior visible to the user.`]}),`\n`,_jsx(Heading,{level:`2`,id:`error-handling`,children:`Error handling`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`When errors thrown by callback functions are not handled by the parent application, Proview swallows them to prevent disruption of the SDK’s core functionality. Always implement proper error handling inside your callbacks.`})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Register one global handler, early.`}),` `,_jsx(_components.code,{children:`Proview.onError`}),` supports a `,_jsx(_components.strong,{children:`single`}),` handler — registering a new one replaces the previous. Register it before `,_jsx(_components.code,{children:`Proview.init()`}),` so initialization failures are captured, and fan out from inside it if several parts of your app need to react.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`9`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`9`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Proview`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`onError`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`((`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`err`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`=>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Proview SDK Error:'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`err`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` logToMonitoring`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`err`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`err`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`type`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ===`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'critical'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` showUserNotification`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'A technical issue occurred. Please contact support.'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Handle errors inside callbacks too.`}),` A throw inside your own callback is swallowed by the SDK, so it will not reach the global handler:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`18`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`18`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Good — errors handled locally`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Proview`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`session`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`onSessionPause`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'User requested break'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`function`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`sessionStateOutput`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`err`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` try`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`err`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Hook error:'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`err`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` saveUserProgress`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` showPauseUI`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`catch`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Error in pause handler:'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`error`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Bad — a throw here disappears silently`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Proview`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`session`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`onSessionPause`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'User requested break'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`function`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`sessionStateOutput`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`err`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` riskyOperation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Respect `,_jsx(_components.code,{children:`type`}),`.`]}),` `,_jsx(_components.code,{children:`critical`}),` means core functionality is impacted and the user needs to know. `,_jsx(_components.code,{children:`warning`}),` and `,_jsx(_components.code,{children:`info`}),` should be logged, not surfaced. Severity is set per occurrence, so read `,_jsx(_components.code,{children:`type`}),` on every error rather than assuming a fixed severity per code.`]}),`\n`,_jsx(Heading,{level:`2`,id:`mount-targets`,children:`Mount targets`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Make sure the container exists before you mount.`}),` Mount targets are resolved at call time, so the element must already be in the DOM. In a component framework, mount from the effect that runs after render, not during it.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Give the container explicit dimensions.`}),` A container with no height renders nothing visible. Either size it with CSS or pass explicit dimensions to the module.`]}),`\n`,_jsx(Heading,{level:`2`,id:`monitoring-your-integration`,children:`Monitoring your integration`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Log every SDK error to your own monitoring system`}),`, tagged with the DSN, environment, and the user or attempt identifier. Console logs are not available to you when a customer reports a problem in production.`]}),`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Capture the error `,_jsx(_components.code,{children:`code`}),`, not just the message.`]}),` On validation failures also capture `,_jsx(_components.code,{children:`validationErrors.formattedMessage`}),` — it names the fields that were rejected.`]})]})}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":"Best Practices","description":"Recommended practices for integrating the Proview SDK effectively and securely","href":"/sdk/best-practices"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Loading","slug":"loading","depth":2,"children":[]},{"title":"Initialization","slug":"initialization","depth":2,"children":[]},{"title":"Credentials","slug":"credentials","depth":2,"children":[]},{"title":"Error handling","slug":"error-handling","depth":2,"children":[]},{"title":"Mount targets","slug":"mount-targets","depth":2,"children":[]},{"title":"Monitoring your integration","slug":"monitoring-your-integration","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"talview-f3acd66d","siteName":"Talview Docs","title":"Best Practices - Talview Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-23T07:38:52.383Z","originalFileLocation":"sdk/best-practices.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=\"Recommended practices for integrating the Proview SDK effectively and securely\">\u003cmeta data-mint-head name=\"application-name\" content=\"Talview Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/talview-f3acd66d/oP3MBQjW12IuBTni/_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=\"/mintlify-assets/_mintlify/favicons/talview-f3acd66d/oP3MBQjW12IuBTni/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/talview-f3acd66d/oP3MBQjW12IuBTni/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/talview-f3acd66d/oP3MBQjW12IuBTni/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/talview-f3acd66d/oP3MBQjW12IuBTni/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/talview-f3acd66d/oP3MBQjW12IuBTni/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/talview-f3acd66d/oP3MBQjW12IuBTni/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/talview-f3acd66d/oP3MBQjW12IuBTni/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/talview-f3acd66d/oP3MBQjW12IuBTni/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Best Practices - Talview Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Recommended practices for integrating the Proview SDK effectively and securely\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Talview Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.talview.com/sdk/best-practices\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://talview-f3acd66d.mintlify.site/_mintlify/api/og/v2?division=SDK\u0026amp;title=Best+Practices\u0026amp;description=Recommended+practices+for+integrating+the+Proview+SDK+effectively+and+securely\u0026amp;theme=cc5ff9daf6f714b6f0bf4c33\u0026amp;signature=63af39319e43cf4b68a4d40e5ac91afe7284f9549ce96714340806c5964f7db4\">\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=\"Best Practices - Talview Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Recommended practices for integrating the Proview SDK effectively and securely\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://talview-f3acd66d.mintlify.site/_mintlify/api/og/v2?division=SDK\u0026amp;title=Best+Practices\u0026amp;description=Recommended+practices+for+integrating+the+Proview+SDK+effectively+and+securely\u0026amp;theme=cc5ff9daf6f714b6f0bf4c33\u0026amp;signature=63af39319e43cf4b68a4d40e5ac91afe7284f9549ce96714340806c5964f7db4\">\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=\"/mintlify-assets/_mintlify/favicons/talview-f3acd66d/oP3MBQjW12IuBTni/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Talview Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1D4ED8\">\u003cmeta data-mint-head name=\"google-site-verification\" content=\"-YCNNWMi1t69X2myeM5WhTLU005LRJLmthsEQ59RcRs\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.talview.com/sdk/best-practices\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/sdk/best-practices.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.talview.com/#organization\",\"name\":\"Talview Docs\",\"url\":\"https://docs.talview.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/talview-f3acd66d/4nxeCBiNgVZtoctt/logo/light.png?fit=max\u0026auto=format\u0026n=4nxeCBiNgVZtoctt\u0026q=85\u0026s=5c272fb59a6d1ae9d78a98e6ba767eba\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.talview.com#website\",\"name\":\"Talview Docs\",\"url\":\"https://docs.talview.com\",\"publisher\":{\"@id\":\"https://docs.talview.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.talview.com/sdk/best-practices#webpage\",\"url\":\"https://docs.talview.com/sdk/best-practices\",\"name\":\"Best Practices\",\"description\":\"Recommended practices for integrating the Proview SDK effectively and securely\",\"dateModified\":\"2026-09-23T07:38:52.383Z\",\"isPartOf\":{\"@id\":\"https://docs.talview.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.talview.com/sdk/best-practices#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.talview.com/sdk/best-practices#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"SDK\",\"item\":\"https://docs.talview.com/sdk/getting-started\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Best Practices\",\"item\":\"https://docs.talview.com/sdk/best-practices\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.talview.com/sdk/best-practices#article\",\"headline\":\"Best Practices\",\"name\":\"Best Practices\",\"description\":\"Recommended practices for integrating the Proview SDK effectively and securely\",\"url\":\"https://docs.talview.com/sdk/best-practices\",\"mainEntityOfPage\":{\"@id\":\"https://docs.talview.com/sdk/best-practices#webpage\"},\"dateModified\":\"2026-09-23T07:38:52.383Z\",\"publisher\":{\"@id\":\"https://docs.talview.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.talview.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Talview Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Talview Docs","nav":{"global":null,"tabs":[{"tab":"Home","pages":[{"title":"Home","href":""}]},{"tab":"Candidates","pages":[{"title":"Candidates","href":"/candidates/getting-started"}]},{"tab":"Hiring Teams","pages":[{"title":"Hiring Teams","href":"/hiring-teams/getting-started"}]},{"tab":"Content and Exam Admins","pages":[{"title":"Content and Exam Admins","href":"/content-and-exam-admins/getting-started"}]},{"tab":"Center and Proctor Administration","hidden":true,"pages":[{"title":"Center and Proctor Administration","href":"/center-and-proctor-administration/center-getting-started"}]},{"tab":"Releases","pages":[{"title":"Releases","href":"/releasenotes/q4-2026/october-2026-release-updates"}]},{"tab":"Developer Docs","groups":[{"group":"SDK","pages":[{"title":"Getting Started","href":"/sdk/getting-started"},{"title":"Authentication","href":"/sdk/authentication"},{"title":"Form","href":"/sdk/forms"},{"title":"Scheduler","href":"/sdk/scheduler"},{"group":"Proctoring","pages":[{"title":"Getting Started","href":"/sdk/proctoring/getting-started"},{"group":"Installation","pages":[{"title":"Installation Methods","href":"/sdk/proctoring/installation/overview"},{"title":"Loader Script","href":"/sdk/proctoring/installation/loader-script"},{"title":"NPM","href":"/sdk/proctoring/installation/npm"}]},{"title":"Interfaces","href":"/sdk/proctoring/configuration"},{"title":"Event Callbacks","href":"/sdk/proctoring/callbacks"},{"title":"SDK Types","href":"/sdk/proctoring/types"},{"title":"Error Reference","href":"/sdk/errors"},{"title":"Secure Browser","sidebarTitle":"Secure Browser","href":"/sdk/proctoring/secure-browser"},{"title":"Proview SDK — v7 to v8 Migration Guide","sidebarTitle":"Migration Guide v7 to v8","href":"/sdk/proctoring/migrations/v7-to-v8"}]},{"group":"System and Network Requirements","pages":[{"title":"System Requirements","sidebarTitle":"System Requirements","href":"/sdk/system-requirements"},{"title":"Network Requirements","sidebarTitle":"Network Requirements","href":"/sdk/network-requirements"}]},{"title":"Troubleshooting","description":"Diagnose and resolve common Proview SDK integration issues across all modules","href":"/sdk/troubleshooting"},{"title":"Best Practices","href":"/sdk/best-practices"}]},{"group":"Graph API","pages":[{"title":"Getting Started","description":"Introduction to the Graph API","href":"/graph-api-reference/getting-started"},{"title":"Authentication","href":"/graph-api-reference/authentication"},{"title":"Pagination","href":"/graph-api-reference/pagination"},{"title":"Filtering","href":"/graph-api-reference/filtering"},{"title":"Rate Limiting","href":"/graph-api-reference/rate-limiting"},{"title":"Error Codes","href":"/graph-api-reference/error-codes"},{"group":"Webhooks","pages":[{"title":"Overview","href":"/graph-api-reference/webhooks/overview"},{"title":"Webhook Concepts","href":"/graph-api-reference/webhooks/concepts"},{"title":"Subscribing to Webhooks","href":"/graph-api-reference/webhooks/subscribing"},{"title":"Unsubscribing from Webhooks","href":"/graph-api-reference/webhooks/unsubscribing"},{"group":"Assessment Engine","pages":[{"title":"Test Instance Created","href":"/graph-api-reference/webhooks/ae/test-instance-created"},{"title":"Test Instance Updated","href":"/graph-api-reference/webhooks/ae/test-instance-updated"}]},{"group":"Auth","pages":[{"title":"User Created","href":"/graph-api-reference/webhooks/auth/user-created"},{"title":"User Updated","href":"/graph-api-reference/webhooks/auth/user-updated"}]},{"group":"Candidate","pages":[{"title":"Candidate Created","href":"/graph-api-reference/webhooks/candidate/candidate-created"},{"title":"Candidate Updated","href":"/graph-api-reference/webhooks/candidate/candidate-updated"}]},{"group":"Coordinator","pages":[{"title":"Exam Created","href":"/graph-api-reference/webhooks/coordinator/exam-created"},{"title":"Exam Updated","href":"/graph-api-reference/webhooks/coordinator/exam-updated"}]},{"group":"Form","pages":[{"title":"Form Instance Created","href":"/graph-api-reference/webhooks/form/form-instance-created"},{"title":"Form Instance Updated","href":"/graph-api-reference/webhooks/form/form-instance-updated"}]},{"group":"Incident","pages":[{"title":"Incident Instance Created","href":"/graph-api-reference/webhooks/incident/instance-created"},{"title":"Incident Instance Updated","href":"/graph-api-reference/webhooks/incident/instance-updated"}]},{"group":"Payment","pages":[{"title":"Transaction Created","href":"/graph-api-reference/webhooks/payment/transaction-created"},{"title":"Transaction Updated","href":"/graph-api-reference/webhooks/payment/transaction-updated"}]},{"group":"Proctoring Management","pages":[{"title":"Center Created","href":"/graph-api-reference/webhooks/pm/center-created"},{"title":"Center Updated","href":"/graph-api-reference/webhooks/pm/center-updated"}]},{"group":"Scheduler","pages":[{"title":"Meeting Created","href":"/graph-api-reference/webhooks/scheduler/meeting-created"},{"title":"Meeting Updated","href":"/graph-api-reference/webhooks/scheduler/meeting-updated"}]}]},{"title":"Graph API Reference","url":"https://studio.apollographql.com/public/talview/variant/current/home","href":"/graph-api-reference/reference"}]}]},{"tab":"Admin","pages":[{"title":"Admin","href":"/admin/configurations/forms/diagnostics/forms-application-missing-from-platform-dashboard"}]}]},"basePath":"","title":"Best Practices - Talview Docs","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":[],"chunks":[]}