GetOTP Documentation

SMS OTP

The SMS OTP allows you to perform OTP via SMS.

Request for SMS OTP API

To request for SMS OTP, make a POST request to our OTP endpoint.

https://api.otp.dev/v1/verifications

With the following Basic HTTP verification method:

DescriptionRequiredData TypeExample
Your API KeyYesStringmtbi2w4hlendfpxa1igthcu5p6mzxf7k

Note

With the following parameters:

NameDescriptionRequiredData TypeExample
channelChannel for delivering OTPYesStringsms
senderName or number that appears as the sender of an SMS messageYesStringGetOTP
phoneThe user mobile phone number (with country code)YesString60123456789
templateThe template ID for the OTP SMS messageYesUUID6d16aa9d-bf19-4141-8169-48b46d972fc6
code_lengthThe length of the code, which falls within the range of 4 to 8 characters. At least one of the following is required: 'code_length' or'code'.NoNumber4
codeThe 'code' field accepts only digits and must be between 4 to 8 characters in length. At least one of the following is required: 'code_length' or'code'.NoString1234
payloadAdditional info that will be sent back to the client through the Webhook URL.NoString
For JSON object, convert into JSON string.
{\"order_id\":\"xfdu48sfdjsdf\", \"agent_id\":2258}

Note

Notes on the phone parameter:

  • You must provide a phone number as digits without spaces or special characters, beginning with the country dialing code.
  • Examples

    Below is an example request using cURL:

    curl --request POST \
         --url https://api.otp.dev/v1/verifications \
         --header 'X-OTP-Key: {YOUR_API_KEY}' \
         --header 'accept: application/json' \
         --header 'content-type: application/json' \
         --data '
    {
        "data": {
            "channel": "sms",
            "sender": "GetOTP",
            "phone": "60123456789",
            "template": "6d16aa9d-bf19-4141-8169-48b46d972fc6",
            "code_length": 4
      }
    }
    '

    The response would be a JSON structure, returned with HTTP 200 Codestatus code:

    {
      "account_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "message_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "phone": "60123456789",
      "create_date": "2025-08-18T06:28:58.962Z",
      "expire_date": "2025-08-18T06:28:58.962Z"
    }

    Response data details:

    NameDescriptionData TypeExample
    account_idThe unique identifier of the accountString3fa85f64-5717-4562-b3fc-2c963f66afa6
    message_idThe unique identifier of the messageString3fa85f64-5717-4562-b3fc-2c963f66afa6
    phoneRecipient's phone numberString60123456789
    create_dateCreation date of the verification in UTC, formatted as yyyy-mm-dd hh:mm:ssString2025-08-18 00:00:00
    expire_dateExpiration date of the verification in UTC, formatted as yyyy-mm-dd hh:mm:ssString2025-08-18 02:00:00

    If there is an error with the API call, you will receive a JSON response with 400+ status code, error code and message.

    {
      "errors": [{
        "timestamp": "2025-08-18 00:00:00",
        "path": "/v1/verifications",
        "method": "POST",
        "status": 401,
        "message": "User Not Authorized",
        "code": "1136"
      }]
    }

    Please refer to this table for details:

    Error CodeDescriptionHTTP Code
    1136User Not Authorized401
    1512Invalid template id400
    1513Template is not found400
    1515Invalid channel specified400
    1523Invalid recipient number(s)400
    1620'sender' is missing400
    1621'phone' is missing400
    1622'template' is missing400
    1623Invalid code length400
    1624Template does not contain keyword {code}400
    1629Provide either 'data.code' or 'data.code_length' but not both400
    1631When 'data.channel' is not VOICE 'data.code' must be valid and 4 to 8 characters long400
    1632'data.code' should be numeric if provided400
    1705Invalid payload400