---
title: Send Phone Verification OTP
slug: api-documentation/send-phone-verification-otp
docTags: 
createdAt: 2026-08-27T16:18:26.773Z
---

{
  "id": "wlZJQytFwlFU1f7XCdQVP",
  "type": "api-oas-v2",
  "data": {
    "method": "POST",
    "url": "https://api.upstartcommerce.com/v1/user/phone/send-verification",
    "servers": [
      {
        "url": "https://api.upstartcommerce.com/v1/user/phone/send-verification"
      }
    ],
    "name": "Send Phone Verification OTP",
    "description": "<p>Send a verification OTP to the specified phone number.</p>\n<p>This endpoint accepts common US phone formats (e.g., 555-123-4567, (555) 123-4567)\nand normalizes them to E.164 format internally.</p>\n<p>Rate limits apply. A cooling off period prevents requesting multiple OTPs in quick succession.</p>",
    "contentType": "application/json",
    "request": {
      "pathParameters": [],
      "headerParameters": [
        {
          "name": "accept",
          "type": "string",
          "kind": "optional",
          "description": "Generated from available response content types",
          "enum": [
            "application/json"
          ],
          "default": "application/json"
        },
        {
          "kind": "required",
          "name": "x-upstart-tenant",
          "type": "string",
          "description": "Tenant identifier associated with the site this call is for."
        }
      ],
      "queryParameters": [],
      "bodyDataParameters": [
        {
          "kind": "required",
          "name": "body",
          "type": "object",
          "description": "Phone number to verify",
          "customType": "SendPhoneVerificationRequest",
          "schema": [
            {
              "name": "phoneNumber",
              "kind": "required",
              "type": "string",
              "description": "<p>Phone number to verify. Accepts common US formats (555-123-4567, (555) 123-4567) or E.164 format.</p>",
              "example": "(555) 123-4567"
            }
          ],
          "modelRef": "#/components/schemas/SendPhoneVerificationRequest",
          "isExpanded": true
        }
      ],
      "formDataParameters": [],
      "oAuthParameters": [
        {
          "id": "SessionIdAccess",
          "name": "X-Upstart-Session-Id",
          "kind": "optional",
          "type": "apiKey",
          "description": "<p>Session based authorization. This authentication is required for clients to interact with any of the management APIs. Similar to ''LoggedIn'', it indicates that the user has actually logged into the system, but in this case with a management role.</p>",
          "in": "header"
        }
      ],
      "cookieParameters": []
    },
    "responses": [
      {
        "statusCode": "200",
        "description": "OTP sent successfully",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "Response after sending phone verification OTP",
            "customType": "SendPhoneVerificationResponse",
            "schema": [
              {
                "name": "message",
                "kind": "required",
                "type": "string",
                "description": "Status message",
                "example": "Verification code sent"
              },
              {
                "name": "maskedPhone",
                "kind": "required",
                "type": "string",
                "description": "Masked phone number for display",
                "example": "***-***-4567"
              },
              {
                "name": "expiresInSeconds",
                "kind": "required",
                "type": "integer",
                "description": "OTP expiration time in seconds",
                "example": 120
              }
            ],
            "modelRef": "#/components/schemas/SendPhoneVerificationResponse",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "400",
        "description": "The request contained information that the server was unable to process. Appropriate errors are provided in the response body.",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "Details of a request that failed validation.",
            "customType": "ValidationErrorResponse",
            "schema": [
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "code",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "detail",
                "kind": "required",
                "type": "array",
                "description": "",
                "example": "",
                "itemType": "string",
                "customType": "string[]",
                "itemExample": "",
                "itemDefault": ""
              },
              {
                "name": "reason",
                "kind": "optional",
                "type": "string",
                "description": ""
              }
            ],
            "modelRef": "#/components/schemas/ValidationErrorResponse",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "401",
        "description": "The provided credentials were not valid for this endpoint. It may be that they are expired or that the user's roles are insufficient.",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "<p>Credentials are missing, expired or insufficient (HTTP 401).</p>",
            "customType": "UnauthorizedError",
            "schema": [
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "code",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "detail",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "reason",
                "kind": "optional",
                "type": "string",
                "description": ""
              }
            ],
            "modelRef": "#/components/schemas/UnauthorizedError",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "403",
        "description": "<p>An update to this resource requires the if-match and if-unmodified-since headers to be sent in order to process the request.</p>",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "<p>The request is understood but refused (HTTP 403).</p>",
            "customType": "ForbiddenError",
            "schema": [
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "code",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "detail",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "reason",
                "kind": "optional",
                "type": "string",
                "description": ""
              }
            ],
            "modelRef": "#/components/schemas/ForbiddenError",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "404",
        "description": "The requested resource was not found in the NoChannel system.",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "<p>The addressed resource does not exist (HTTP 404).</p>",
            "customType": "NotFoundError",
            "schema": [
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "code",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "detail",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "reason",
                "kind": "optional",
                "type": "string",
                "description": ""
              }
            ],
            "modelRef": "#/components/schemas/NotFoundError",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "409",
        "description": "The request conflicts with the current state of the resource.",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "<p>The request conflicts with existing state (HTTP 409).</p>",
            "customType": "ConflictError",
            "schema": [
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "code",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "detail",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "reason",
                "kind": "optional",
                "type": "string",
                "description": ""
              }
            ],
            "modelRef": "#/components/schemas/ConflictError",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "429",
        "description": "Rate limit exceeded or cooling off period active",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "Error response when rate limit or cooling off period is active",
            "customType": "RateLimitErrorResponse",
            "schema": [
              {
                "name": "error",
                "kind": "required",
                "type": "string",
                "description": "Error message",
                "example": "Rate limit exceeded"
              },
              {
                "name": "retryAfterSeconds",
                "kind": "required",
                "type": "integer",
                "description": "Seconds to wait before retrying",
                "example": 60
              }
            ],
            "modelRef": "#/components/schemas/RateLimitErrorResponse",
            "isExpanded": true
          }
        ]
      },
      {
        "statusCode": "500",
        "description": "Internal server error. The server encountered an unexpected condition that prevented it from fulfilling the request.",
        "jsonExample": "",
        "isExpanded": true,
        "schema": [
          {
            "kind": "optional",
            "type": "object",
            "description": "<p>The request failed for an unexpected reason (HTTP 500).</p>",
            "customType": "InternalServerError",
            "schema": [
              {
                "name": "name",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "code",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "detail",
                "kind": "required",
                "type": "string",
                "description": ""
              },
              {
                "name": "reason",
                "kind": "optional",
                "type": "string",
                "description": ""
              }
            ],
            "modelRef": "#/components/schemas/InternalServerError",
            "isExpanded": true
          }
        ]
      }
    ],
    "hasXCodeSamples": false,
    "examples": {
      "languages": [
        {
          "id": "F0iTfF9EbU2SLi39XeWYw",
          "language": "curl",
          "label": "cURL",
          "code": "curl --request POST \\\n     --url https://api.upstartcommerce.com/v1/user/phone/send-verification \\\n     --header 'accept: application/json' \\\n     --header 'content-type: application/json' \\\n     --header 'x-upstart-tenant: string' \\\n     --data '{\n     \"phoneNumber\": \"(555) 123-4567\"\n     }'"
        },
        {
          "id": "rTyhu7P3NTEWUIDLxV6Jm",
          "language": "javascript",
          "label": "javascript",
          "code": "var myHeaders = new Headers();\nmyHeaders.append(\"accept\", \"application/json\");\nmyHeaders.append(\"content-type\", \"application/json\");\nmyHeaders.append(\"x-upstart-tenant\", \"string\");\n\nvar raw = JSON.stringify({\n   \"phoneNumber\": \"(555) 123-4567\"\n});\n\nvar requestOptions = {\n   method: 'POST',\n   headers: myHeaders,\n   body: raw,\n   redirect: 'follow'\n};\n\nfetch(\"https://api.upstartcommerce.com/v1/user/phone/send-verification\", requestOptions)\n   .then(response => response.text())\n   .then(result => console.log(result))\n   .catch(error => console.log('error', error));"
        },
        {
          "id": "r4HjViKMKtqoTnEZd9vZx",
          "language": "ruby",
          "label": "Ruby",
          "code": "require \"uri\"\nrequire \"json\"\nrequire \"net/http\"\n\nurl = URI(\"https://api.upstartcommerce.com/v1/user/phone/send-verification\")\n\nhttps = Net::HTTP.new(url.host, url.port)\nhttps.use_ssl = true\n\nrequest = Net::HTTP::Post.new(url)\nrequest[\"accept\"] = \"application/json\"\nrequest[\"content-type\"] = \"application/json\"\nrequest[\"x-upstart-tenant\"] = \"string\"\nrequest.body = JSON.dump({\n   \"phoneNumber\": \"(555) 123-4567\"\n})\n\nresponse = https.request(request)\nputs response.read_body\n"
        },
        {
          "id": "C0EECmvAEkZS7qlqNzaNX",
          "language": "python",
          "label": "Python",
          "code": "import requests\nimport json\n\nurl = \"https://api.upstartcommerce.com/v1/user/phone/send-verification\"\n\npayload = json.dumps({\n   \"phoneNumber\": \"(555) 123-4567\"\n})\nheaders = {\n   'accept': 'application/json',\n   'content-type': 'application/json',\n   'x-upstart-tenant': 'string'\n}\n\nresponse = requests.request(\"POST\", url, headers=headers, data=payload)\n\nprint(response.text)\n"
        }
      ],
      "selectedLanguageId": "F0iTfF9EbU2SLi39XeWYw"
    },
    "results": {
      "languages": [
        {
          "id": "NUK8cuMQQPiOkvn5fSlhl",
          "language": "200",
          "code": "// OTP sent successfully\n{\n  \"message\": \"Verification code sent\",\n  \"maskedPhone\": \"***-***-4567\",\n  \"expiresInSeconds\": 120\n}"
        },
        {
          "id": "sucHydzpOxeISXtji30NR",
          "language": "400",
          "code": "// The request contained information that the server was unable to process. Appropriate errors are provided in the response body.\n{\n  \"name\": \"\",\n  \"code\": \"\",\n  \"detail\": [\n    \"\"\n  ],\n  \"reason\": \"\"\n}"
        },
        {
          "id": "zjShg73Dp9eyBXAHvv6SN",
          "language": "401",
          "code": "// The provided credentials were not valid for this endpoint. It may be that they are expired or that the user's roles are insufficient.\n{\n  \"name\": \"\",\n  \"code\": \"\",\n  \"detail\": \"\",\n  \"reason\": \"\"\n}"
        },
        {
          "id": "WphtShgEbdsI5nNEAA3jo",
          "language": "403",
          "code": "// An update to this resource requires the if-match and if-unmodified-since headers to be sent in order to process the request.\n{\n  \"name\": \"\",\n  \"code\": \"\",\n  \"detail\": \"\",\n  \"reason\": \"\"\n}"
        },
        {
          "id": "xTGbLjg-bY_bC59vYjR8N",
          "language": "404",
          "code": "// The requested resource was not found in the NoChannel system.\n{\n  \"name\": \"\",\n  \"code\": \"\",\n  \"detail\": \"\",\n  \"reason\": \"\"\n}"
        },
        {
          "id": "jnPTTpSz-3p7KeVMXlUD9",
          "language": "409",
          "code": "// The request conflicts with the current state of the resource.\n{\n  \"name\": \"\",\n  \"code\": \"\",\n  \"detail\": \"\",\n  \"reason\": \"\"\n}"
        },
        {
          "id": "aChc5yyIRdyc5pv8XW7br",
          "language": "429",
          "code": "// Rate limit exceeded or cooling off period active\n{\n  \"error\": \"Rate limit exceeded\",\n  \"retryAfterSeconds\": 60\n}"
        },
        {
          "id": "jh6eO37FaieflftdKF5B0",
          "language": "500",
          "code": "// Internal server error. The server encountered an unexpected condition that prevented it from fulfilling the request.\n{\n  \"name\": \"\",\n  \"code\": \"\",\n  \"detail\": \"\",\n  \"reason\": \"\"\n}"
        }
      ],
      "selectedLanguageId": "NUK8cuMQQPiOkvn5fSlhl"
    }
  },
  "children": [
    {
      "text": ""
    }
  ]
}