{"id":159,"date":"2026-10-25T12:59:21","date_gmt":"2026-10-25T12:59:21","guid":{"rendered":"https:\/\/vectalk.com.br\/blog\/whatsapp-otp-authentication-template\/"},"modified":"2026-10-25T13:10:08","modified_gmt":"2026-10-25T13:10:08","slug":"whatsapp-otp-authentication-template","status":"publish","type":"post","link":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-otp-authentication-template\/","title":{"rendered":"WhatsApp OTP: sending verification codes with authentication templates"},"content":{"rendered":"\n<p><em>Updated on October 25, 2026<\/em><\/p>\n\n\n\n<p>To send a one-time passcode (OTP) over WhatsApp, Meta requires an <strong>authentication template<\/strong>: preset text (&#8220;123456 is your verification code.&#8221;), an OTP button (copy code, one-tap autofill or zero-tap) and no URLs, media or emojis. You create the template once, Meta approves it and, on every login, your application sends the code as a parameter. For recipients in Brazil, each delivered authentication message costs R$ 0.0350 on the BRL rate card in effect since October 1, 2026, with volume discounts; other markets have their own rates on Meta&#8217;s rate cards.<\/p>\n\n\n\n<p>This guide covers the three button types, creation and send payloads, how to set expiration and TTL, and the security practices Meta recommends.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why it has to be an authentication template<\/h2>\n\n\n\n<p>Meta is explicit: only authentication templates may send a one-time passcode for identity verification. Marketing and utility templates cannot. If Meta detects a template from another category being used this way, it gives notice and changes the template status to <code>REJECTED<\/code> on the first day of the following month, with no option to appeal. The full category rules are in <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-template-categories\/\">how Meta categorizes your template<\/a>.<\/p>\n\n\n\n<p>To qualify as authentication, the template must:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>use Cloud API authentication templates, with fixed text defined by Meta;<\/li>\n\n\n<li>include an OTP button;<\/li>\n\n\n<li>contain no URLs, media or emojis, in the content or in parameters;<\/li>\n\n\n<li>use parameters of up to 15 characters.<\/li>\n\n<\/ul>\n\n\n\n<p>Accepted use cases: account creation, account recovery or integrity challenges, and confirmation of orders or transactions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The text is fixed: what you can configure<\/h2>\n\n\n\n<p>You don&#8217;t write the body. Meta uses preset text, localized to the template language, and offers two optional add-ons:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Option<\/th><th>Field<\/th><th>Effect<\/th><\/tr><\/thead><tbody><tr><td>Security disclaimer<\/td><td><code>add_security_recommendation: true<\/code> in the body<\/td><td>Adds &#8220;For your security, do not share this code.&#8221;<\/td><\/tr><tr><td>Code expiration<\/td><td><code>code_expiration_minutes<\/code> in the footer (1 to 90)<\/td><td>Adds &#8220;This code expires in N minutes.&#8221;<\/td><\/tr><tr><td>Message time-to-live<\/td><td><code>message_send_ttl_seconds<\/code> (30 to 900)<\/td><td>If not delivered within this time, the message is dropped<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>The default TTL for authentication templates is 10 minutes (templates created before October 23, 2024 had 30 days). Meta recommends a TTL equal to or shorter than the code&#8217;s expiration: there is no point delivering a code that has already expired. Since Meta only charges for delivered messages, messages dropped by the TTL are not billed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The three button types<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Type<\/th><th>How it works<\/th><th>Platform<\/th><th>App integration required?<\/th><\/tr><\/thead><tbody><tr><td>Copy code (<code>COPY_CODE<\/code>)<\/td><td>The user taps the button, the code goes to the clipboard and they paste it into your app<\/td><td>All<\/td><td>No<\/td><\/tr><tr><td>One-tap (<code>ONE_TAP<\/code>)<\/td><td>The button opens your app with the code already filled in<\/td><td>Android<\/td><td>Yes: handshake and an activity to receive the code<\/td><\/tr><tr><td>Zero-tap (<code>ZERO_TAP<\/code>)<\/td><td>No button: your app receives the code via broadcast and the user never leaves the screen<\/td><td>Android<\/td><td>Yes: handshake, broadcast receiver and terms acceptance<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>On iOS 26 and later, the keyboard itself suggests the code received on WhatsApp, with no integration. On earlier iOS versions, the user sees the copy code button.<\/p>\n\n\n\n<p>One important detail: one-tap and zero-tap have a <strong>fallback<\/strong>. If the handshake did not happen, if the app does not match or if the recipient is not on Android, WhatsApp shows the copy code button (zero-tap tries one-tap first). So a one-tap or zero-tap template still works as copy code in the worst case.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Creating a template with a copy code button<\/h2>\n\n\n\n<p>With the Cloud API directly, the template is created on the WhatsApp Business account&#8217;s <code>message_templates<\/code> endpoint:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-bash\">curl -X POST \"https:\/\/graph.facebook.com\/v26.0\/YOUR_WABA_ID\/message_templates\" \\\n  -H \"Authorization: Bearer META_TOKEN\" \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\n    \"name\": \"verification_code\",\n    \"language\": \"en_US\",\n    \"category\": \"AUTHENTICATION\",\n    \"message_send_ttl_seconds\": 300,\n    \"components\": [\n      { \"type\": \"BODY\", \"add_security_recommendation\": true },\n      { \"type\": \"FOOTER\", \"code_expiration_minutes\": 5 },\n      {\n        \"type\": \"BUTTONS\",\n        \"buttons\": [\n          { \"type\": \"OTP\", \"otp_type\": \"COPY_CODE\", \"text\": \"Copy code\" }\n        ]\n      }\n    ]\n  }'<\/code><\/pre>\n\n\n\n<p>Note there is no <code>text<\/code> field in the body: Meta fills it in. The button label (<code>text<\/code>) is optional and up to 25 characters; without it, Meta uses a localized default. After creation, the <code>OTP<\/code> button shows up as type <code>URL<\/code> when you query the template, which is expected.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">One-tap variant (Android)<\/h3>\n\n\n\n<p>For one-tap, change the button and list the authorized apps:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">{\n  \"type\": \"OTP\",\n  \"otp_type\": \"ONE_TAP\",\n  \"text\": \"Copy code\",\n  \"autofill_text\": \"Autofill\",\n  \"supported_apps\": [\n    { \"package_name\": \"com.example.app\", \"signature_hash\": \"K8a\/AINcGX7\" }\n  ]\n}<\/code><\/pre>\n\n\n\n<p>One-tap rules, according to the <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/templates\/authentication-templates\/autofill-button-authentication-templates\" target=\"_blank\" rel=\"noreferrer noopener\">autofill documentation<\/a>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>supported_apps<\/code> accepts up to 5 package and hash pairs;<\/li>\n\n\n<li><code>package_name<\/code> has up to 224 characters, with at least two dot-separated segments;<\/li>\n\n\n<li><code>signature_hash<\/code> is exactly 11 characters;<\/li>\n\n\n<li><code>autofill_text<\/code> and <code>text<\/code> have up to 25 characters;<\/li>\n\n\n<li>the app must start a <strong>handshake<\/strong> with WhatsApp before the send and have an activity with the <code>com.whatsapp.otp.OTP_RETRIEVED<\/code> action;<\/li>\n\n\n<li>the handshake is valid for 10 minutes, or for <code>code_expiration_minutes<\/code> if set.<\/li>\n\n<\/ul>\n\n\n\n<p>Meta recommends the official SDK for the handshake. The <code>PendingIntent<\/code>-based method is being deprecated on October 15, 2026.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zero-tap variant (Android)<\/h3>\n\n\n\n<p>Zero-tap uses <code>\"otp_type\": \"ZERO_TAP\"<\/code>, the same <code>supported_apps<\/code> and the field <code>zero_tap_terms_accepted: true<\/code>. Without that acceptance, the template is not created. The app needs a broadcast receiver for <code>com.whatsapp.otp.OTP_RETRIEVED<\/code>. Even with zero-tap, the user sees the fixed-text message in WhatsApp.<\/p>\n\n\n\n<p>To debug one-tap and zero-tap on Android, WhatsApp sends error signals via broadcast with the <code>com.whatsapp.OTP_ERROR<\/code> action, with keys such as <code>otp_request_expired<\/code> and <code>missing_handshake_or_disorder<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sending the code<\/h2>\n\n\n\n<p>The send is a regular template, with one twist: <strong>the code appears twice<\/strong>, in the body parameter and in the button parameter. The code can have up to 15 characters.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-json\">{\n  \"messaging_product\": \"whatsapp\",\n  \"recipient_type\": \"individual\",\n  \"to\": \"15551234567\",\n  \"type\": \"template\",\n  \"template\": {\n    \"name\": \"verification_code\",\n    \"language\": { \"code\": \"en_US\" },\n    \"components\": [\n      {\n        \"type\": \"body\",\n        \"parameters\": [{ \"type\": \"text\", \"text\": \"482913\" }]\n      },\n      {\n        \"type\": \"button\",\n        \"sub_type\": \"url\",\n        \"index\": \"0\",\n        \"parameters\": [{ \"type\": \"text\", \"text\": \"482913\" }]\n      }\n    ]\n  }\n}<\/code><\/pre>\n\n\n\n<p>A Node.js function that generates the code, stores its hash and sends it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-js\">import crypto from 'node:crypto';\n\nexport async function sendOtp(phone, db) {\n  const code = String(crypto.randomInt(0, 1_000_000)).padStart(6, '0');\n  const hash = crypto.createHash('sha256').update(code).digest('hex');\n  await db.saveOtp(phone, hash, Date.now() + 5 * 60 * 1000); \/\/ 5 minutes\n\n  const body = {\n    messaging_product: 'whatsapp',\n    recipient_type: 'individual',\n    to: phone,\n    type: 'template',\n    template: {\n      name: 'verification_code',\n      language: { code: 'en_US' },\n      components: [\n        { type: 'body', parameters: [{ type: 'text', text: code }] },\n        { type: 'button', sub_type: 'url', index: '0', parameters: [{ type: 'text', text: code }] },\n      ],\n    },\n  };\n\n  const r = await fetch(process.env.WHATSAPP_URL, {\n    method: 'POST',\n    headers: { Authorization: `Bearer ${process.env.WHATSAPP_TOKEN}`, 'Content-Type': 'application\/json' },\n    body: JSON.stringify(body),\n  });\n  return r.json(); \/\/ keep the wamid to match it with the status webhook\n}<\/code><\/pre>\n\n\n\n<p>Track the status through the webhook: if <code>delivered<\/code> does not arrive within the TTL, assume the message was dropped and offer another channel. The possible states are covered in <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-api-message-status-webhook\/\">message status via webhook<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Security: what Meta recommends<\/h2>\n\n\n\n<p>Meta&#8217;s <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/templates\/authentication-templates\/authentication-best-practices\" target=\"_blank\" rel=\"noreferrer noopener\">authentication best practices<\/a> include some points worth taking seriously:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Recycled numbers.<\/strong> WhatsApp only verifies number ownership at registration. A number can change hands. On the Cloud API, store the identity hash you receive after the first validated OTP and include it in later sends: if the number now belongs to someone else, delivery fails instead of reaching the new owner.<\/li>\n\n\n<li><strong>Extra challenge for sensitive flows.<\/strong> For account recovery, combine the WhatsApp code with another verification.<\/li>\n\n\n<li><strong>Forwarding disabled.<\/strong> WhatsApp disables forwarding of authentication messages, which reduces phishing.<\/li>\n\n\n<li><strong>Channel choice.<\/strong> Get consent and offer options (WhatsApp, email, SMS). Confirm which number the user has on WhatsApp, as it may differ from their SMS number.<\/li>\n\n\n<li><strong>WhatsApp installed.<\/strong> On Android, check for the <code>com.whatsapp<\/code> and <code>com.whatsapp.w4b<\/code> packages; on iOS, check whether the <code>whatsapp:\/\/otp<\/code> scheme can be opened.<\/li>\n\n\n<li><strong>One account per business.<\/strong> Each business needs its own account, Messaging account and phone number. Sharing them across businesses violates policy.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">How much each code costs<\/h2>\n\n\n\n<p>Meta charges authentication per delivered message, and rates vary by recipient country. For recipients in Brazil, the BRL rate card in effect since October 1, 2026 has progressive monthly volume discounts, aggregated across all accounts in the business portfolio:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Authentication messages per month (Brazil)<\/th><th>Price per message (BRL)<\/th><\/tr><\/thead><tbody><tr><td>Up to 500,000<\/td><td>R$ 0.0350<\/td><\/tr><tr><td>500,001 to 3,000,000<\/td><td>R$ 0.0333<\/td><\/tr><tr><td>3,000,001 to 5,250,000<\/td><td>R$ 0.0315<\/td><\/tr><tr><td>5,250,001 to 10,000,000<\/td><td>R$ 0.0298<\/td><\/tr><tr><td>10,000,001 to 20,000,000<\/td><td>R$ 0.0280<\/td><\/tr><tr><td>Over 20,000,000<\/td><td>R$ 0.0263<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Tiers reset every month. The authentication-international rate, charged in some markets, does not apply to Brazil. Messages sent inside a free entry point window, opened by Click-to-WhatsApp ads, are not charged. To model volumes, see <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-campaign-cost\/\">how much a WhatsApp campaign costs<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to do it with Vectalk<\/h2>\n\n\n\n<p>On Vectalk, the authentication template is created at <code>POST \/api\/templates<\/code> with the same body as Meta&#8217;s, using an instance token:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"language-bash\">curl -X POST https:\/\/apis.vectalk.com.br\/api\/templates \\\n  -H \"Authorization: Bearer YOUR_INSTANCE_TOKEN\" \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\n    \"name\": \"verification_code\",\n    \"language\": \"en_US\",\n    \"category\": \"AUTHENTICATION\",\n    \"components\": [\n      { \"type\": \"BODY\", \"add_security_recommendation\": true },\n      { \"type\": \"FOOTER\", \"code_expiration_minutes\": 5 },\n      { \"type\": \"BUTTONS\", \"buttons\": [ { \"type\": \"OTP\", \"otp_type\": \"COPY_CODE\", \"text\": \"Copy code\" } ] }\n    ]\n  }'<\/code><\/pre>\n\n\n\n<p>Sending uses <code>POST https:\/\/apis.vectalk.com.br\/api\/messages<\/code> with the payload from the previous section. In the Node.js code above, just point <code>WHATSAPP_URL<\/code> to that endpoint and use your Vectalk token. See the <a href=\"https:\/\/docs.vectalk.com.br\/api-reference\/templates\/create\">templates documentation<\/a> and create your account at <a href=\"https:\/\/apps.vectalk.com.br\/register\">apps.vectalk.com.br\/register<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently asked questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Can I write my own verification code text?<\/h3>\n\n\n\n<p>No. Authentication template text is preset by Meta. You only choose the language, whether to include the security disclaimer, the expiration in minutes and the button labels.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can the code include letters?<\/h3>\n\n\n\n<p>Yes, Meta refers to codes that are usually alphanumeric. The limit is 15 characters per parameter, and the same value goes in the body and the button.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Does one-tap work on iPhone?<\/h3>\n\n\n\n<p>No. One-tap and zero-tap are Android only. On iPhone, the user sees the copy code button; on iOS 26 and later, the keyboard also suggests the code automatically.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Do I need a separate template for each language?<\/h3>\n\n\n\n<p>Yes. Each language is its own template. For bulk creation, Meta&#8217;s <code>upsert_message_templates<\/code> endpoint accepts a list of languages at once.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can an authentication template be rejected?<\/h3>\n\n\n\n<p>Yes, for invalid format or parameters. The duplicate rule does not apply, since the text is standard. See <a href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-template-rejected\/\">WhatsApp template rejected<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Official sources checked on October 25, 2026:<\/strong> <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/templates\/authentication-templates\/authentication-templates\" target=\"_blank\" rel=\"noreferrer noopener\">Authentication templates<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/templates\/authentication-templates\/copy-code-button-authentication-templates\" target=\"_blank\" rel=\"noreferrer noopener\">Copy code button<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/templates\/authentication-templates\/autofill-button-authentication-templates\" target=\"_blank\" rel=\"noreferrer noopener\">One-tap autofill button<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/templates\/authentication-templates\/zero-tap-authentication-templates\" target=\"_blank\" rel=\"noreferrer noopener\">Zero-tap<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/templates\/authentication-templates\/error-signals\" target=\"_blank\" rel=\"noreferrer noopener\">Error signals<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/templates\/authentication-templates\/authentication-best-practices\" target=\"_blank\" rel=\"noreferrer noopener\">Authentication best practices<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/templates\/time-to-live\" target=\"_blank\" rel=\"noreferrer noopener\">Time-to-live<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/templates\/template-categorization\" target=\"_blank\" rel=\"noreferrer noopener\">Template categorization<\/a>, <a href=\"https:\/\/developers.facebook.com\/documentation\/business-messaging\/whatsapp\/pricing\" target=\"_blank\" rel=\"noreferrer noopener\">Pricing<\/a> and the &#8220;BRL volume tiers&#8221; spreadsheet (effective October 1, 2026).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A guide to WhatsApp Business API authentication templates for OTP: button types, creation, sending, expiration, security and what each code costs.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-159","post","type-post","status-publish","format-standard","hentry","category-blog"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>WhatsApp OTP verification codes via the API | Vectalk<\/title>\n<meta name=\"description\" content=\"How to send WhatsApp OTP verification codes with authentication templates: copy code, one-tap and zero-tap buttons, rules, payloads and pricing.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-otp-authentication-template\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WhatsApp OTP verification codes via the API | Vectalk\" \/>\n<meta property=\"og:description\" content=\"How to send WhatsApp OTP verification codes with authentication templates: copy code, one-tap and zero-tap buttons, rules, payloads and pricing.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-otp-authentication-template\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Vectalk\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-25T12:59:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-25T13:10:08+00:00\" \/>\n<meta name=\"author\" content=\"wanderleyfcunha\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"wanderleyfcunha\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-otp-authentication-template\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-otp-authentication-template\\\/\"},\"author\":{\"name\":\"wanderleyfcunha\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\"},\"headline\":\"WhatsApp OTP: sending verification codes with authentication templates\",\"datePublished\":\"2026-10-25T12:59:21+00:00\",\"dateModified\":\"2026-10-25T13:10:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-otp-authentication-template\\\/\"},\"wordCount\":1341,\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-otp-authentication-template\\\/\",\"url\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-otp-authentication-template\\\/\",\"name\":\"WhatsApp OTP verification codes via the API | Vectalk\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#website\"},\"datePublished\":\"2026-10-25T12:59:21+00:00\",\"dateModified\":\"2026-10-25T13:10:08+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\"},\"description\":\"How to send WhatsApp OTP verification codes with authentication templates: copy code, one-tap and zero-tap buttons, rules, payloads and pricing.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-otp-authentication-template\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-otp-authentication-template\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/en\\\/whatsapp-otp-authentication-template\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WhatsApp OTP: sending verification codes with authentication templates\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/\",\"name\":\"Blog Vectalk\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/vectalk.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/ff36ecd9d8257856f227f8e5d639db2b\",\"name\":\"wanderleyfcunha\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g\",\"caption\":\"wanderleyfcunha\"},\"sameAs\":[\"https:\\\/\\\/vectalk.com.br\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WhatsApp OTP verification codes via the API | Vectalk","description":"How to send WhatsApp OTP verification codes with authentication templates: copy code, one-tap and zero-tap buttons, rules, payloads and pricing.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-otp-authentication-template\/","og_locale":"en_US","og_type":"article","og_title":"WhatsApp OTP verification codes via the API | Vectalk","og_description":"How to send WhatsApp OTP verification codes with authentication templates: copy code, one-tap and zero-tap buttons, rules, payloads and pricing.","og_url":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-otp-authentication-template\/","og_site_name":"Blog Vectalk","article_published_time":"2026-10-25T12:59:21+00:00","article_modified_time":"2026-10-25T13:10:08+00:00","author":"wanderleyfcunha","twitter_card":"summary_large_image","twitter_misc":{"Written by":"wanderleyfcunha","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-otp-authentication-template\/#article","isPartOf":{"@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-otp-authentication-template\/"},"author":{"name":"wanderleyfcunha","@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b"},"headline":"WhatsApp OTP: sending verification codes with authentication templates","datePublished":"2026-10-25T12:59:21+00:00","dateModified":"2026-10-25T13:10:08+00:00","mainEntityOfPage":{"@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-otp-authentication-template\/"},"wordCount":1341,"articleSection":["Blog"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-otp-authentication-template\/","url":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-otp-authentication-template\/","name":"WhatsApp OTP verification codes via the API | Vectalk","isPartOf":{"@id":"https:\/\/vectalk.com.br\/blog\/#website"},"datePublished":"2026-10-25T12:59:21+00:00","dateModified":"2026-10-25T13:10:08+00:00","author":{"@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b"},"description":"How to send WhatsApp OTP verification codes with authentication templates: copy code, one-tap and zero-tap buttons, rules, payloads and pricing.","breadcrumb":{"@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-otp-authentication-template\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vectalk.com.br\/blog\/en\/whatsapp-otp-authentication-template\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/vectalk.com.br\/blog\/en\/whatsapp-otp-authentication-template\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vectalk.com.br\/blog\/"},{"@type":"ListItem","position":2,"name":"WhatsApp OTP: sending verification codes with authentication templates"}]},{"@type":"WebSite","@id":"https:\/\/vectalk.com.br\/blog\/#website","url":"https:\/\/vectalk.com.br\/blog\/","name":"Blog Vectalk","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vectalk.com.br\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/vectalk.com.br\/blog\/#\/schema\/person\/ff36ecd9d8257856f227f8e5d639db2b","name":"wanderleyfcunha","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/21c37077f1731eb558973f27a7b647d55f72fde5200a843ac5f5345b247ea725?s=96&d=mm&r=g","caption":"wanderleyfcunha"},"sameAs":["https:\/\/vectalk.com.br\/blog"]}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/159","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/comments?post=159"}],"version-history":[{"count":2,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/159\/revisions"}],"predecessor-version":[{"id":400,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/posts\/159\/revisions\/400"}],"wp:attachment":[{"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/media?parent=159"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/categories?post=159"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vectalk.com.br\/blog\/wp-json\/wp\/v2\/tags?post=159"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}