{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-@l10n/en-US/guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["code-group"]},"type":"markdown"},"seo":{"title":"Biometrics Flow","description":"Documentação oficial da API da plataforma de crédito embarcado Dinie. Integre produtos de crédito diretamente na sua aplicação.","siteUrl":"https://docs.dinie.com","lang":"pt-BR","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"biometrics-flow","__idx":0},"children":["Biometrics Flow"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Guide customers through identity verification, track progress, and handle each outcome."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"overview","__idx":1},"children":["Overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["After ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/en-us/guides/customer-registration"},"children":["creating a customer"]},", two processes run in parallel:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Credit analysis"]}," — Dinie automatically starts evaluating the company's credit profile."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["KYC verification"]}," — the customer needs to submit documents and complete biometrics at their own pace."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You don't need to wait for the credit analysis to start the verification. As soon as the customer reaches ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pending_kyc"]}," status, present the option to start biometrics."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"1-present-the-verification-to-the-customer","__idx":2},"children":["1. Present the Verification to the Customer"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["customer.created"]}," webhook arrives (or when the status changes to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pending_kyc"]},"), present the customer with the option to start verification. You can show an explicit button or start automatically."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/flow-start-verification.93dfa08d0b6edfe2a811752438ba1f4a979bb096586f099406a0fc32e0c6ee76.047687d6.svg","alt":"Flow from registration to biometrics session"},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The key is to communicate that the customer needs to complete identity verification to receive credit offers."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2-create-the-biometrics-session","__idx":3},"children":["2. Create the Biometrics Session"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When the customer confirms they want to start, create a biometrics session:"]},{"$$mdtype":"Tag","name":"CodeGroup","attributes":{"mode":"tabs"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"typescript","data-title":"Node.js","header":{"title":"Node.js","controls":{"copy":{}}},"source":"const session = await client.customers.createBiometricsSession(customer.id);\n\n// Open this URL in a webview or redirect the customer\nconsole.log(session.session_url);\nconsole.log(session.expires_at); // Expires in 30 minutes\n","lang":"typescript"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"ruby","data-title":"Ruby","header":{"title":"Ruby","controls":{"copy":{}}},"source":"session = client.customers.create_biometrics_session(customer.id)\n\n# Open this URL in a webview or redirect the customer\nputs session.session_url\nputs session.expires_at # Expires in 30 minutes\n","lang":"ruby"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","data-title":"Python","header":{"title":"Python","controls":{"copy":{}}},"source":"session = client.customers.create_biometrics_session(customer.id)\n\n# Open this URL in a webview or redirect the customer\nprint(session.session_url)\nprint(session.expires_at)  # Expires in 30 minutes\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","data-title":"cURL","header":{"title":"cURL","controls":{"copy":{}}},"source":"curl -X POST \"https://sandbox.api.dinie.com.br/v3/customers/${CUSTOMER_ID}/biometrics\" \\\n  -H \"Authorization: Bearer dinie_at_...\"\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Open the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["session_url"]}," in a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["webview"]}," (mobile) or ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["redirect"]}," the browser (web). The session expires in 30 minutes — if it expires, generate a new one."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Tip:"]}," If you already have some of the customer's documents, you can upload them via API before generating the session. Pre-uploaded documents will already appear as complete in the session, speeding up the process for the customer. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/en-us/guides/kyc-requirements#advance-api-uploads"},"children":["Advance API Uploads"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"3-what-the-customer-will-see","__idx":4},"children":["3. What the Customer Will See"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In the biometrics session, the customer will see the list of required documents. Documents already uploaded via API appear as complete. The customer needs to complete the pending items."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/flow-biometrics-session.cd7f9cfac3175708f025b890fc2bcf288b5666847cdde7ce2efcdfa99bb4cfd7.047687d6.svg","alt":"Biometrics session: documents, selfie, and review"},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The session flow includes:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Document upload"]}," — photos of ID (CNH or RG), proof of address, company documents"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Selfie"]}," — captured by the customer via the device camera"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Review"]}," — view everything submitted before confirming"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["At the end, the customer will have two options:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Save for later"]}," — progress is kept, but analysis is not triggered"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Submit for analysis"]}," — triggers verification of all documents"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"4-save-for-later","__idx":5},"children":["4. Save for Later"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the customer chooses \"Save for later\", they will return to your environment. No analysis is triggered at this point — the customer can come back at any time to continue."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can track progress in two ways:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Via webhook:"]}," receive ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["customer.kyc_updated"]}," whenever a document is uploaded. The payload includes the updated ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["kyc"]}," array."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Via API:"]}," query the customer and check the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["kyc"]}," field:"]},{"$$mdtype":"Tag","name":"CodeGroup","attributes":{"mode":"tabs"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"typescript","data-title":"Node.js","header":{"title":"Node.js","controls":{"copy":{}}},"source":"const customer = await client.customers.get(customerId);\n\nfor (const req of customer.kyc) {\n  const status = req.submitted ? \"Submitted\" : \"Pending\";\n  console.log(`${req.label}: ${status}`);\n}\n","lang":"typescript"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"ruby","data-title":"Ruby","header":{"title":"Ruby","controls":{"copy":{}}},"source":"customer = client.customers.get(customer_id)\n\ncustomer.kyc.each do |req|\n  status = req[\"submitted\"] ? \"Submitted\" : \"Pending\"\n  puts \"#{req[\"label\"]}: #{status}\"\nend\n","lang":"ruby"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","data-title":"Python","header":{"title":"Python","controls":{"copy":{}}},"source":"customer = client.customers.get(customer_id)\n\nfor req in customer.kyc:\n    status = \"Submitted\" if req[\"submitted\"] else \"Pending\"\n    print(f\"{req['label']}: {status}\")\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","data-title":"cURL","header":{"title":"cURL","controls":{"copy":{}}},"source":"curl \"https://sandbox.api.dinie.com.br/v3/customers/${CUSTOMER_ID}\" \\\n  -H \"Authorization: Bearer dinie_at_...\"\n\n# Check customer.kyc[].submitted for each requirement\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Show the customer their verification progress — which documents have been submitted and which are still pending. To let the customer resume, just generate a new biometrics session. Previous progress is preserved."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/flow-save-resume.c73f4727390691c7993309c7d57f43b851ceb09e8449e2fa60680e5377a4143c.047687d6.svg","alt":"Save, track, and resume flow"},"children":[]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"5-submit-for-analysis","__idx":6},"children":["5. Submit for Analysis"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When the customer clicks \"Submit for analysis\" in the biometrics session, Dinie starts verifying all documents. You will receive the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["customer.under_review"]}," webhook, and the customer's status will change to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["under_review"]},"."]},{"$$mdtype":"Tag","name":"CodeGroup","attributes":{"mode":"tabs"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"typescript","data-title":"Node.js","header":{"title":"Node.js","controls":{"copy":{}}},"source":"app.post(\"/webhooks/dinie\", express.raw({ type: \"application/json\" }), (req, res) => {\n  const event = client.webhooks.unwrap(req.body.toString(), req.headers);\n\n  if (event.type === \"customer.under_review\") {\n    updateCustomerScreen(event.data.external_id, \"Under review\");\n  }\n\n  res.sendStatus(200);\n});\n","lang":"typescript"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"ruby","data-title":"Ruby","header":{"title":"Ruby","controls":{"copy":{}}},"source":"post \"/webhooks/dinie\" do\n  event = client.webhooks.unwrap(request.body.read, request.env)\n\n  if event[\"type\"] == \"customer.under_review\"\n    update_customer_screen(event.dig(\"data\", \"external_id\"), \"Under review\")\n  end\n\n  status 200\nend\n","lang":"ruby"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","data-title":"Python","header":{"title":"Python","controls":{"copy":{}}},"source":"@app.post(\"/webhooks/dinie\")\nasync def handle_webhook(request: Request):\n    event = client.webhooks.unwrap(await request.body(), request.headers)\n\n    if event[\"type\"] == \"customer.under_review\":\n        update_customer_screen(event[\"data\"][\"external_id\"], \"Under review\")\n\n    return Response(status_code=200)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","data-title":"cURL","header":{"title":"cURL","controls":{"copy":{}}},"source":"# Webhook received at your endpoint:\n# {\n#   \"type\": \"customer.under_review\",\n#   \"data\": {\n#     \"id\": \"cust_550e8400...\",\n#     \"external_id\": \"partner-ref-123\",\n#     \"status\": \"under_review\"\n#   }\n# }\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["From here, Dinie can approve, deny, or flag specific documents for correction."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"6-outcome-approved","__idx":7},"children":["6. Outcome: Approved"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If all documents are approved, the customer receives ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["active"]}," status and you receive the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["customer.active"]}," webhook."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["does not mean"]}," credit offers are ready. Credit analysis runs in parallel and may take longer. Once the customer is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["active"]},", Dinie continues processing the credit analysis."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When an offer is available, you will receive the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["credit_offer.available"]}," webhook:"]},{"$$mdtype":"Tag","name":"CodeGroup","attributes":{"mode":"tabs"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"typescript","data-title":"Node.js","header":{"title":"Node.js","controls":{"copy":{}}},"source":"app.post(\"/webhooks/dinie\", express.raw({ type: \"application/json\" }), (req, res) => {\n  const event = client.webhooks.unwrap(req.body.toString(), req.headers);\n\n  if (event.type === \"customer.active\") {\n    updateCustomerScreen(event.data.external_id, \"Verified\");\n  }\n\n  if (event.type === \"credit_offer.available\") {\n    const offers = await client.creditOffers.list(event.data.customer_id);\n    notifyCustomer(event.data.external_id, offers);\n  }\n\n  res.sendStatus(200);\n});\n","lang":"typescript"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"ruby","data-title":"Ruby","header":{"title":"Ruby","controls":{"copy":{}}},"source":"post \"/webhooks/dinie\" do\n  event = client.webhooks.unwrap(request.body.read, request.env)\n\n  case event[\"type\"]\n  when \"customer.active\"\n    update_customer_screen(event.dig(\"data\", \"external_id\"), \"Verified\")\n  when \"credit_offer.available\"\n    offers = client.credit_offers.list(event.dig(\"data\", \"customer_id\"))\n    notify_customer(event.dig(\"data\", \"external_id\"), offers)\n  end\n\n  status 200\nend\n","lang":"ruby"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","data-title":"Python","header":{"title":"Python","controls":{"copy":{}}},"source":"@app.post(\"/webhooks/dinie\")\nasync def handle_webhook(request: Request):\n    event = client.webhooks.unwrap(await request.body(), request.headers)\n\n    if event[\"type\"] == \"customer.active\":\n        update_customer_screen(event[\"data\"][\"external_id\"], \"Verified\")\n\n    if event[\"type\"] == \"credit_offer.available\":\n        offers = client.credit_offers.list(event[\"data\"][\"customer_id\"])\n        notify_customer(event[\"data\"][\"external_id\"], offers)\n\n    return Response(status_code=200)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","data-title":"cURL","header":{"title":"cURL","controls":{"copy":{}}},"source":"# Webhook customer.active:\n# { \"type\": \"customer.active\", \"data\": { \"status\": \"active\", ... } }\n\n# Webhook credit_offer.available:\n# { \"type\": \"credit_offer.available\", \"data\": { \"approved_amount\": 50000.00, ... } }\n\n# List offers:\ncurl \"https://sandbox.api.dinie.com.br/v3/customers/${CUSTOMER_ID}/credit-offers\" \\\n  -H \"Authorization: Bearer dinie_at_...\"\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/flow-approved-offers.9fd27113db4f3474b82c79b298486fe36c7f3dc7c6eace4b9e03e2407894a4db.047687d6.svg","alt":"Waiting for offers and offer available"},"children":[]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Info:"]}," Between ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["customer.active"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["credit_offer.available"]},", show the customer a message like \"Verification complete, we're finding the best offers for you\". This conveys that the process is still moving forward."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"7-outcome-documents-pending","__idx":8},"children":["7. Outcome: Documents Pending"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If Dinie finds issues with any document, you will receive the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["customer.kyc_updated"]}," webhook with details. Check the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["kyc"]}," field to see which documents were rejected:"]},{"$$mdtype":"Tag","name":"CodeGroup","attributes":{"mode":"tabs"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"typescript","data-title":"Node.js","header":{"title":"Node.js","controls":{"copy":{}}},"source":"const customer = await client.customers.get(customerId);\n\nfor (const req of customer.kyc) {\n  if (req.submitted?.review_status === \"rejected\") {\n    console.log(`${req.label}: Rejected — ${req.submitted.review_reason}`);\n  }\n}\n","lang":"typescript"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"ruby","data-title":"Ruby","header":{"title":"Ruby","controls":{"copy":{}}},"source":"customer = client.customers.get(customer_id)\n\ncustomer.kyc.each do |req|\n  submitted = req[\"submitted\"]\n  if submitted && submitted[\"review_status\"] == \"rejected\"\n    puts \"#{req[\"label\"]}: Rejected — #{submitted[\"review_reason\"]}\"\n  end\nend\n","lang":"ruby"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","data-title":"Python","header":{"title":"Python","controls":{"copy":{}}},"source":"customer = client.customers.get(customer_id)\n\nfor req in customer.kyc:\n    submitted = req.get(\"submitted\")\n    if submitted and submitted.get(\"review_status\") == \"rejected\":\n        print(f\"{req['label']}: Rejected — {submitted['review_reason']}\")\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","data-title":"cURL","header":{"title":"cURL","controls":{"copy":{}}},"source":"curl \"https://sandbox.api.dinie.com.br/v3/customers/${CUSTOMER_ID}\" \\\n  -H \"Authorization: Bearer dinie_at_...\"\n\n# Check customer.kyc[].submitted.review_status and review_reason\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Show the customer which documents need correction and the rejection reason. You don't need to do anything directly via the API — just present a button for the customer to open the biometrics session again:"]},{"$$mdtype":"Tag","name":"CodeGroup","attributes":{"mode":"tabs"},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"typescript","data-title":"Node.js","header":{"title":"Node.js","controls":{"copy":{}}},"source":"// Generate a new session for the customer to fix documents\nconst session = await client.customers.createBiometricsSession(customer.id);\nredirectCustomer(session.session_url);\n","lang":"typescript"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"ruby","data-title":"Ruby","header":{"title":"Ruby","controls":{"copy":{}}},"source":"# Generate a new session for the customer to fix documents\nsession = client.customers.create_biometrics_session(customer.id)\nredirect_customer(session.session_url)\n","lang":"ruby"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","data-title":"Python","header":{"title":"Python","controls":{"copy":{}}},"source":"# Generate a new session for the customer to fix documents\nsession = client.customers.create_biometrics_session(customer.id)\nredirect_customer(session.session_url)\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","data-title":"cURL","header":{"title":"cURL","controls":{"copy":{}}},"source":"# Generate a new session\ncurl -X POST \"https://sandbox.api.dinie.com.br/v3/customers/${CUSTOMER_ID}/biometrics\" \\\n  -H \"Authorization: Bearer dinie_at_...\"\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In the session, rejected documents will appear highlighted with the rejection reason. The customer fixes them, resubmits, and the cycle repeats until all are approved."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/flow-documents-pending.4b5ca813494ad2787378318755dc7ea2480f228b1b4823246f4b15ace1167ca3.047687d6.svg","alt":"Document correction flow"},"children":[]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"8-outcome-denied","__idx":9},"children":["8. Outcome: Denied"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the customer is permanently denied, you will receive the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["customer.denied"]}," webhook. This means Dinie could not approve the customer in the KYC analysis (e.g., fraud detected or company closed)."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In this case, inform the customer that ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["credit is not available at this time"]},". Unlike the approved-without-offers scenario (where the customer may receive offers in the future), the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["denied"]}," status is final."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/flow-denied.556e249c1276b85997fb898bb42584f0246b1b1027270bdd28395c32fd42f1be.047687d6.svg","alt":"Evaluation and denied outcome"},"children":[]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Warning:"]}," Do not communicate the specific denial reason to the customer. Only inform them that it was not possible to proceed with the analysis at this time."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"flow-summary","__idx":10},"children":["Flow Summary"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Step"},"children":["Step"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Partner action"},"children":["Partner action"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"API / Webhook"},"children":["API / Webhook"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Customer created"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Show verification button"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["customer.created"]}," webhook"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Customer starts"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Create biometrics session"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST biometrics"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Customer in session"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Wait"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["—"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Save for later"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Show progress"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["customer.kyc_updated"]}," webhook or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET customer"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Submit for analysis"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Show \"under review\""]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["customer.under_review"]}," webhook"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Approved"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Wait for offers"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["customer.active"]}," + ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["credit_offer.available"]}," webhooks"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Document rejected"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Show reason + button to fix"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["customer.kyc_updated"]}," webhook"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Denied"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Inform customer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["customer.denied"]}," webhook"]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"related-guides","__idx":11},"children":["Related Guides"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/en-us/guides/customer-registration"},"children":["Registration & Offers"]}," for the full customer creation flow"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/en-us/guides/kyc-requirements"},"children":["KYC Requirements"]}," for details on document types"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/en-us/guides/credit-workflow"},"children":["Simulation & Origination"]}," for the next step after receiving offers"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/en-us/apis/concepts/webhooks"},"children":["Webhooks"]}," to configure notification endpoints"]}]}]},"headings":[{"value":"Biometrics Flow","id":"biometrics-flow","depth":1},{"value":"Overview","id":"overview","depth":2},{"value":"1. Present the Verification to the Customer","id":"1-present-the-verification-to-the-customer","depth":2},{"value":"2. Create the Biometrics Session","id":"2-create-the-biometrics-session","depth":2},{"value":"3. What the Customer Will See","id":"3-what-the-customer-will-see","depth":2},{"value":"4. Save for Later","id":"4-save-for-later","depth":2},{"value":"5. Submit for Analysis","id":"5-submit-for-analysis","depth":2},{"value":"6. Outcome: Approved","id":"6-outcome-approved","depth":2},{"value":"7. Outcome: Documents Pending","id":"7-outcome-documents-pending","depth":2},{"value":"8. Outcome: Denied","id":"8-outcome-denied","depth":2},{"value":"Flow Summary","id":"flow-summary","depth":2},{"value":"Related Guides","id":"related-guides","depth":2}],"frontmatter":{"seo":{"title":"Biometrics Flow"}},"lastModified":"2026-03-15T13:30:00.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/en-us/guides/biometrics-flow","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}