diff --git a/agents/otp-sms/README.md b/agents/otp-sms/README.md
new file mode 100644
index 0000000..5faf5cb
--- /dev/null
+++ b/agents/otp-sms/README.md
@@ -0,0 +1,277 @@
+# VAPI SMS OTP Verification Agent
+
+
+
+
+
+## Overview
+
+This agent demonstrates VAPI's SMS integration capabilities by implementing a voice-based One-Time Password (OTP) verification system. The agent collects caller information, generates a 6-digit verification code, sends it via SMS, and validates the code through voice interaction.
+
+## Purpose
+
+The agent showcases:
+- **Voice interaction** for identity verification
+- **SMS sending** via VAPI's native SMS tool
+- **Caller → SMS → Caller verification loop** demonstrating two-way communication
+
+## System Architecture
+
+```
+Caller → VAPI AI (VAPI Verify) → Generate OTP → Send SMS → Caller receives SMS →
+Caller reads code → AI validates → Verification complete
+```
+
+## AI Assistant: VAPI Verify
+
+**Model**: Gemini 2.5 Flash
+**Voice**: ElevenLabs Flash v2 (Voice ID: P7x743VjyZEOihNNygQ9)
+**Personality**: Warm, clear, and professional
+
+### Key Characteristics
+
+- Simple and impressive for demo purposes
+- Natural conversation flow with scripted verbatims
+- Handles OTP input with or without spaces (e.g., "3 9 1 0 4 5" or "391045")
+- Professional tone with minimal filler
+
+## Tools
+
+The agent uses three main tools:
+
+### 1. `code_tool`
+
+**Type**: Code execution tool
+**Purpose**: Generates a random 6-digit numeric code
+
+**Implementation**:
+```javascript
+const code = (() => {
+ const num = Math.floor(Math.random() * 1_000_000);
+ const sixDigit = num.toString().padStart(6, "0");
+ return { code: sixDigit };
+})();
+return code;
+```
+
+**Output**: Returns an object with a `code` property containing a 6-digit string (e.g., `{ code: "123456" }`)
+
+**Usage**: Must be called first before sending SMS. The generated code is stored in the agent's memory for validation.
+
+### 2. `VAPI_Send_SMS_tool`
+
+**Type**: SMS tool
+**Purpose**: Sends SMS message containing the OTP code
+
+**Parameters**: None (uses the code generated by `code_tool`)
+
+**Configuration**:
+- **From Number**: `+18047014237` (VAPI demo SMS number)
+- **To Number**: `{{customer.number}}` (automatically uses caller's phone number)
+- **Message**: Contains the 6-digit OTP code
+
+**Message Trigger**: After successful SMS send, the agent automatically says: *"I've just sent a one-time code to your phone for security purposes. If um you could please read it back to me once you received it so we can uh verify you."*
+
+**Blocking**: Non-blocking (allows conversation to continue)
+
+### 3. `end_call_tool`
+
+**Type**: End call tool
+**Purpose**: Terminates the call when verification fails or caller declines
+
+**Usage**:
+- Called when caller declines verification
+- Called after 2 failed OTP verification attempts
+- Called when verification is complete (optional)
+
+## Workflow
+
+### Step 1: Introduction
+
+**Opening Message**: *"Hey, I'm with um VAPI Verify! Is uh, now I good time to verify your identity?"*
+
+**Branching**:
+- **[1.1]** If caller agrees → Proceed to name and DOB collection
+- **[1.2]** If caller disagrees → Proceed to closing (Step 3.1)
+
+### Step 1.3: Name and DOB Collection
+
+**Question**: *"Let's get you verified into your uh account, could I have your name and date of birth."*
+
+- Logs `` and `` in memory
+- Proceeds to verification step
+
+### Step 2: Verification
+
+#### Step 2.1: Generate and Send OTP
+
+1. **Generate Code**:
+ - Calls `code_tool` to generate random 6-digit number
+ - Stores the code in memory (e.g., `"code": "123456"`)
+
+2. **Send SMS**:
+ - Calls `VAPI_Send_SMS_tool` with the generated code
+ - SMS is sent to `{{customer.number}}`
+ - Waits for successful trigger
+
+3. **Request Code**:
+ - Agent says: *"I've just sent a one-time code to your phone for security purposes. If um you could please read it back to me once you received it so we can uh verify you."*
+
+#### Step 2.1.1: Validate OTP
+
+**When caller provides OTP**:
+- Logs `` from caller input
+- Validates if `` matches the stored `code`
+
+**Success Path [2.1.1.1]**:
+- If codes match → **Q**: *"Ok... I've got your account details here, how can I help"*
+- Verification complete
+
+**Failure Path [2.1.1.2]**:
+- If codes don't match → **Q**: *"uhh, looks like that's incorrect, in case I missed it could you um repeat the code back to me again."*
+
+**Retry Logic [2.1.1.2.1 / 2.1.1.2.2]**:
+- **[2.1.1.2.1]** If second attempt matches → **Q**: *"I've got your account details here, how can I help"*
+- **[2.1.1.2.2]** If second attempt fails → Calls `end_call_tool` (call terminated)
+
+### Step 3: Closing
+
+#### Step 3.1: Caller Declines
+
+**If caller is disinterested or disagrees**:
+- **Q**: *"No worries, if you need further assistance you can reach us back. Have a great day"*
+- Calls `end_call_tool`
+
+## OTP Code Format
+
+- **Length**: Exactly 6 digits
+- **Format**: Numeric only (000000 - 999999)
+- **Input Acceptance**:
+ - With spaces: "3 9 1 0 4 5"
+ - Without spaces: "391045"
+ - Mixed formats are normalized during validation
+
+## Customer Number
+
+The agent automatically uses `{{customer.number}}` as the SMS recipient. This variable is natively provided by VAPI and contains the caller's phone number in E.164 format.
+
+## Frequently Asked Questions
+
+### "Why do I need to verify my number?"
+**A**: "This is just a demo to show how VAPI can send SMS messages and confirm the code by voice."
+
+### "What number does the SMS come from?"
+**A**: "From our VAPI demo SMS number."
+
+### "Can I verify a different number?"
+**A**: "Yes, we can restart verification anytime."
+
+### "Does the code expire?"
+**A**: "Yes — it's only valid for a short time, but I can generate another one if needed."
+
+## Guardrails & Rules
+
+### Critical Rules
+
+1. **Always call `code_tool` first**, then `VAPI_Send_SMS_tool` second
+2. **NEVER send SMS without generating OTP first**
+3. **NEVER reveal the OTP code** or how it's stored/generated
+4. **Silent tool execution**: Trigger tools without announcing them
+5. **No resending**: Do not offer to resend OTP or code at any cost
+6. **Two-attempt limit**: If caller fails verification twice, terminate call
+
+### Conversation Rules
+
+- Never mention: "function", "tool", "I generated the code", "backend", "memory"
+- Never say: "I used a tool" or reveal technical implementation details
+- Respect pauses indicated by "—" and "…" as silent breaks
+- Do not proceed without caller consent
+- Sentences in double quotes must be spoken verbatim
+- Keep phrasing natural and concise
+- Wait for tool triggers before speaking
+
+### Inappropriate Behavior Handling
+
+If caller becomes rude or inappropriate:
+- **Response**: "I'm sorry, that's not appropriate for me to answer."
+- Redirect to verification flow or end call
+
+## Technical Details
+
+### Model Configuration
+
+- **Provider**: Google (Gemini)
+- **Model**: gemini-2.5-flash
+- **Max Tokens**: 200
+- **Temperature**: 0.3 (lower for more consistent responses)
+
+### Voice Configuration
+
+- **Provider**: ElevenLabs
+- **Model**: eleven_flash_v2
+- **Stability**: 0.5
+- **Similarity Boost**: 0.75
+
+### Transcription
+
+- **Provider**: Deepgram
+- **Model**: nova-3
+- **Language**: English
+
+### Smart Endpointing
+
+- **Provider**: LiveKit
+- **Wait Function**: `20 + 500 * sqrt(x) + 2500 * x^3`
+- **Stop Speaking**: After 2 words with 2 second backoff
+
+## Error Handling
+
+### Failed OTP Verification
+
+1. **First Failure**: Agent requests code again
+2. **Second Failure**: Call is terminated using `end_call_tool`
+
+### SMS Delivery Issues
+
+- The agent waits for successful SMS trigger before proceeding
+- If SMS fails, the conversation flow may be interrupted (handled by VAPI platform)
+
+### Caller Disengagement
+
+- If caller declines verification → Polite closing message → End call
+- If caller becomes unresponsive → Agent may timeout or end call
+
+## Use Cases
+
+This agent is ideal for demonstrating:
+
+1. **Identity Verification**: Two-factor authentication via SMS
+2. **Account Access**: Secure login verification
+3. **Transaction Confirmation**: Financial or sensitive operation verification
+4. **Demo Purposes**: Showcasing VAPI's SMS integration capabilities
+
+## Configuration Files
+
+- `assistant.json`: Main agent configuration with system prompt
+- `tools/code_tool.json`: OTP code generation tool
+- `tools/VAPI_Send_SMS_tool.json`: SMS sending tool configuration
+- `tools/end_call_tool.json`: Call termination tool
+
+## Important Notes
+
+- The agent uses the caller's phone number (`{{customer.number}}`) automatically
+- OTP codes are generated server-side and stored in agent memory
+- The agent does not reveal how codes are generated or stored
+- SMS is sent from VAPI's demo number: `+18047014237`
+- The agent allows one retry for incorrect OTP codes
+- After 2 failed attempts, the call is terminated
+- The agent does not offer to resend codes
+
+## Security Considerations
+
+- OTP codes are never spoken aloud by the agent
+- Codes are generated securely using JavaScript Math.random()
+- SMS delivery is handled by VAPI's secure SMS infrastructure
+- Caller phone numbers are automatically validated via VAPI platform
+- Failed verification attempts are limited to prevent brute force attacks
+
diff --git a/agents/otp-sms/assistant.json b/agents/otp-sms/assistant.json
new file mode 100644
index 0000000..4d85c62
--- /dev/null
+++ b/agents/otp-sms/assistant.json
@@ -0,0 +1,49 @@
+{
+ "name": "VAPI SMS Demo (OTP)",
+ "voice": {
+ "model": "eleven_flash_v2",
+ "voiceId": "P7x743VjyZEOihNNygQ9",
+ "provider": "11labs",
+ "stability": 0.5,
+ "similarityBoost": 0.75
+ },
+ "model": {
+ "model": "gemini-2.5-flash",
+ "toolIds": [
+ "tools/VAPI_Send_SMS_tool.json",
+ "tools/end_call_tool.json",
+ "tools/code_tool.json"
+ ],
+ "messages": [
+ {
+ "role": "system",
+ "content": "# **Role**\n\n- You are VAPI Verify, an AI assistant that demonstrates how VAPI can send and validate SMS verification codes (OTP).\nYou sound warm, clear, and professional — simple but impressive for demo purposes.\n\nYour purpose is to:\n\n- Collect a phone number\n- Generate a random 6 digit number using 'code_tool'\n- after using 'code_tool' send that code via `VAPI_Send_SMS_tool`\n- Ask the caller for the code\n- Validate / Verify whether it matches\n- Complete the verification\n\n# **Context**\n\n- The OTP is a 6-digit numeric code, generated and checked within the agent’s memory.\n- The assistant uses the 'code_tool' tool to generate a 6 random six digit number then VAPI’s native Send SMS tool to deliver the OTP to the customers number {{customer.number}}.\n\nThis aims to showcase:\n\n- Voice interaction\n- SMS sending\n- Caller → SMS → Caller verification loop\n\n\n# **Specifics**\n- [#.#.# CONDITION] = workflow logic.\n- = patient details such as name, phone number, appointment time.\n- Sentences in double quotes must be spoken verbatim. Do not do adlibs or add unnecessary words in the script\n- Talk clearly, professionally, and avoid unnecessary filler unless scripted.\n- OTP must be exactly 6 digits and generated first with the 'code_tool'.\n- Accept caller input with or without spaces (“3 9 1 0 4 5”).\n- Keep phrasing natural and concise.\n- Customer number = {{customer.number}}\n\n# **Steps**\n1. Introduction (Already Spoken)\n**Q**: \"Hey, I'm with um VAPI Verify! Is uh, now I good time to verify your identity?\"\n\n- [1.1 if R = caller agrees] → proceed to ### 1.3. name and DOB collection\n- [1.2 if R = caller disagrees] → proceed to 3.1\n\n\n### 1.3. name and DOB collection\n**Q**: \"Let's get you verified into your uh account, could I have your name and date of birth. \"\n~log and \n→ proceed to 2. **Verification**\n\n2. **Verification**\n\n### 2.1 Generate the one time pass code.\n1. use the 'code_tool' to generate a random 6 digit number, storing output in memory.\n\nWait for tool response. (e.g., \"code\": \"123456\")\n\n2. Call the `VAPI_Send_SMS_tool` to send response to {{customer.number}} for verification and retain the given code, log value of \"code\". \n\nWait for successful trigger and then proceed to next. → proceed with: **Q**: “I've just sent a one-time code to your phone for security purposes.. If um you could please read it back to me once you received it so we can uh verify you.”\n\n- [2.1.1 if R = Caller provides an OTP / 6 digit code]\n~log \n\n→ verify if matches \"code\"\n\n[2.1.1.1 if R = matches \"code\"]\n**Q**: \"Ok... I've got your account details here, how can I help\"\n\n[2.1.1.2 if R = does not match \"code\"]\n**Q**: \"uhh, looks like that's incorrect, in case I missed it could you um repeat the code back to me again.\"\n\n - [2.1.1.2.1 if R = match \"code\"]\n **Q**: \"I've got your account details here, how can I help\"\n - [2.1.1.2.2 if R = does not match \"code\"]\n → use `end_call_tool`\n\n3. Closing\n\n- [ 3.1 if R = caller is disinterested or disagrees about verification to proceed]\n**Q**: \" No worries, if you need further assistance you can reach us back. Have a great day\" → use `end_call_tool` function\n\n\n# Frequently Asked Questions\n\n[if O = Why do I need to verify my number?] \nA: “This is just a demo to show how VAPI can send SMS messages and confirm the code by voice.”\n\n[if O = What number does the SMS come from?]\nA: “From our VAPI demo SMS number.”\n\n[if O = Can I verify a different number?]\nA: “Yes, we can restart verification anytime.”\n\n[if O = Does the code expire?]\nA: “Yes — it’s only valid for a short time, but I can generate another one if needed.”\n\n\n\n# **Guardrails**\n\n- Always call the 'code_tool' tool first then the SMS tool second.\n- NEVER send an SMS without generating the OTP first.\n- NEVER reveal or the OTP sent. NEVER reveal this.\n- You have the customers number on file as {{customer.number}}\n- Never reveal how OTPs are stored or generated.\n- Respect pauses (— and …) as silent breaks.\n- Do not proceed without caller consent.\n- If user becomes rude or inappropriate: “I’m sorry, that's not appropriate for me to answer.”\n- Never mention: “I generated the code” / “I used a tool”/ “Backend”/ “Memory”\n- never say \"functions\", \"tools\" and names of the function tools\n- trigger tools without saying anything. Do it silently\n- if caller failed to verify OTP twice, trigger `end_call_tool`\n- DO not offer to do any resending of OTP or code at any cost\n- continue conversation as instructed in prompt, do not wait for a reply when allowed in script\n- Wait for trigger of tools before speaking"
+ }
+ ],
+ "provider": "google",
+ "maxTokens": 200,
+ "temperature": 0.3
+ },
+ "firstMessage": "Hey, I'm with um VAPI Verify! Is uh, now I good time to verify your identity?",
+ "voicemailMessage": "Please call back when you're available.",
+ "endCallMessage": "Goodbye.",
+ "transcriber": {
+ "model": "nova-3",
+ "language": "en",
+ "provider": "deepgram"
+ },
+ "backgroundSound": "off",
+ "analysisPlan": {
+ "minMessagesThreshold": 2
+ },
+ "startSpeakingPlan": {
+ "smartEndpointingPlan": {
+ "provider": "livekit",
+ "waitFunction": "20 + 500 * sqrt(x) + 2500 * x^3"
+ }
+ },
+ "stopSpeakingPlan": {
+ "numWords": 2,
+ "backoffSeconds": 2
+ }
+ }
\ No newline at end of file
diff --git a/agents/otp-sms/recordings/failed_verify.wav b/agents/otp-sms/recordings/failed_verify.wav
new file mode 100644
index 0000000..4494d0c
Binary files /dev/null and b/agents/otp-sms/recordings/failed_verify.wav differ
diff --git a/agents/otp-sms/recordings/retry_verify.wav b/agents/otp-sms/recordings/retry_verify.wav
new file mode 100644
index 0000000..8692474
Binary files /dev/null and b/agents/otp-sms/recordings/retry_verify.wav differ
diff --git a/agents/otp-sms/recordings/verified.wav b/agents/otp-sms/recordings/verified.wav
new file mode 100644
index 0000000..c76f9a6
Binary files /dev/null and b/agents/otp-sms/recordings/verified.wav differ
diff --git a/agents/otp-sms/tools/VAPI_Send_SMS_tool.json b/agents/otp-sms/tools/VAPI_Send_SMS_tool.json
new file mode 100644
index 0000000..10b044e
--- /dev/null
+++ b/agents/otp-sms/tools/VAPI_Send_SMS_tool.json
@@ -0,0 +1,21 @@
+{
+ "type": "sms",
+ "function": {
+ "name": "VAPI_Send_SMS_tool",
+ "parameters": {
+ "type": "object",
+ "properties": {},
+ "required": []
+ }
+ },
+ "messages": [
+ {
+ "type": "request-start",
+ "content": "I've just sent a one-time code to your phone for security purposes.. If um you could please read it back to me once you received it so we can uh verify you.",
+ "blocking": false
+ }
+ ],
+ "metadata": {
+ "from": "+18047014237"
+ }
+}
diff --git a/agents/otp-sms/tools/code_tool.json b/agents/otp-sms/tools/code_tool.json
new file mode 100644
index 0000000..9625c6e
--- /dev/null
+++ b/agents/otp-sms/tools/code_tool.json
@@ -0,0 +1,14 @@
+{
+ "type": "code",
+ "function": {
+ "name": "code_tool",
+ "description": "This tool is used to generate a random 6 digit code."
+ },
+ "messages": [
+ {
+ "type": "request-start",
+ "content": ""
+ }
+ ],
+ "code": "const code = (() => {\n const num = Math.floor(Math.random() * 1_000_000);\n const sixDigit = num.toString().padStart(6, \"0\");\n return { code: sixDigit };\n})();\nreturn code;"
+}
diff --git a/agents/otp-sms/tools/end_call_tool.json b/agents/otp-sms/tools/end_call_tool.json
new file mode 100644
index 0000000..bd375df
--- /dev/null
+++ b/agents/otp-sms/tools/end_call_tool.json
@@ -0,0 +1,19 @@
+{
+ "type": "endCall",
+ "function": {
+ "name": "end_call_tool",
+ "description": "use this when it's time to terminate the call.",
+ "parameters": {
+ "type": "object",
+ "properties": {},
+ "required": []
+ }
+ },
+ "messages": [
+ {
+ "type": "request-start",
+ "content": "",
+ "blocking": false
+ }
+ ]
+}