Verify Way: WhatsApp OTP API Provider

WhatsApp and Telegram OTP API

Examples:

POSTMANhttps://www.postman.com/universal-desert-634382/verifyway-com/request/j3eufz7/https-api-verifyway-com-api-v1?tab=body

WhatsApp OTP API using Curl
Supported Languages: en, ar, ru, de, pt_BR (Contact us for More languages)

curl -X POST https://api.verifyway.com/api/v1/ \
-H 'Authorization: Bearer API_KEY' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"recipient":"+31612345678",
"type":"otp",
"channel":"whatsapp",
"fallback":"no",
"code":"123456",
"lang":"en"
}'

Set fallback to yes to enable Auto Fallback!

Telegram OTP API using Curl

curl -X POST https://api.verifyway.com/api/v1/ \
-H 'Authorization: Bearer API_KEY' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"recipient":"+31612345678",
"type":"otp",
"code":"123456",
"channel":"telegram",
"fallback":"no",
"lang":"en"
}'

Languages: (Default English)

Changing template language supported, please contact us to enable other language.

PHP Example using Curl:


$api_url = 'https://api.verifyway.com/api/v1/';
$api_key = 'API_KEY'; // Replace with your actual API key
$data = array(
    'recipient' => '+31612345678',
    'type' => 'otp',
    'code' => '123456',
    'channel' => 'whatsapp', //or 'telegram'
    'lang' => 'en',
);
$headers = array(
    'Authorization: Bearer ' . $api_key,
    'Content-Type: application/json',
    'Accept: application/json'
);
$ch = curl_init($api_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if ($response === false) {
    echo 'cURL Error: ' . curl_error($ch);
} else {
    echo 'Response: ' . $response;
}
curl_close($ch);
?>

PHP Example using Guzzle:


require 'vendor/autoload.php'; // Make sure to include the Guzzle library
use GuzzleHttp\Client;
$api_url = 'https://api.verifyway.com/api/v1/';
$api_key = 'API_KEY'; // Replace with your actual API key
$data = array(
    'recipient' => '+31612345678',
    'type' => 'otp',
    'code' => '123456',
    'channel' => 'whatsapp', //or 'telegram'
    'lang' => 'en',

);
$headers = array(
    'Authorization' => 'Bearer ' . $api_key,
    'Content-Type' => 'application/json',
    'Accept' => 'application/json'
);
$client = new Client();
$response = $client->post($api_url, [
    'headers' => $headers,
    'json' => $data
]);
$body = $response->getBody();
echo $body;
?>
Responses:

Success

{
	"status": "success",
        "message_id": "RANDOM_ID",
	"recipient": "+31612345678",
	"code": "123456"
}

Failure

{
    "error": "detail of the error" 
}

VerifyWay – Message Status Webhook Guide

How it works

When you send a message using our API, you will receive an immediate response like this:

{
  "status": "success",
  "message_id": "c4ecdcda43057ea7cec985b34264499a160c",
  "recipient": "+447598078178",
  "code": "123456"
}

You must save the message_id in your system.

Important

  • message_id is the unique ID of your message
  • You will use this ID to track future status updates

What happens next

After sending the message, you should save:

  • message_id
  • recipient
  • code if needed

Then wait for a webhook from our system.

Webhook from VerifyWay

We will send a POST request to your webhook URL with the message status:

{
  "message_id": "c4ecdcda43057ea7cec985b34264499a160c",
  "status": "delivered"
}

What you need to do

  1. Read the following fields:
    • message_id
    • status
  2. Find the related message in your database using message_id
  3. Update the status of that message

Example flow

  1. You send a message and receive:
{
  "status": "success",
  "message_id": "abc123",
  "recipient": "+447598078178",
  "code": "123456"
}
  1. You save message_id = abc123 in your database
  2. Later, you receive this webhook:
{
  "message_id": "abc123",
  "status": "read"
}
  1. You update message abc123 in your database and set its status to read

Status values

  • expired
  • delivered
  • read
  • failed

Summary

  • Save message_id when sending the message
  • Wait for the webhook from VerifyWay
  • Match the incoming message_id with your saved record
  • Update the message status in your system

PHP Example for Your Webhook


// webhook.php

// Set response type
header('Content-Type: application/json');

// Read raw POST body
$input = file_get_contents('php://input');

// Convert JSON to array
$data = json_decode($input, true);

// Validate JSON
if (!$data) {
    http_response_code(400);
    echo json_encode([
        "status" => "error",
        "message" => "Invalid JSON"
    ]);
    exit;
}

// Extract values
$message_id = $data['message_id'] ?? null;
$status     = $data['status'] ?? null;

// Validate required fields
if (!$message_id || !$status) {
    http_response_code(400);
    echo json_encode([
        "status" => "error",
        "message" => "Missing message_id or status"
    ]);
    exit;
}

// ====== Log webhook to file ======
$logData = [
    "time" => date("Y-m-d H:i:s"),
    "message_id" => $message_id,
    "status" => $status,
    "raw" => $data
];

// Save as JSON line (good for later processing)
file_put_contents(
    __DIR__ . "/webhook.log",
    json_encode($logData) . PHP_EOL,
    FILE_APPEND
);

// ====== Optional: Save latest status per message ======
$statusFile = __DIR__ . "/statuses.json";

// Load existing data
$statuses = [];
if (file_exists($statusFile)) {
    $statuses = json_decode(file_get_contents($statusFile), true) ?? [];
}

// Update status
$statuses[$message_id] = [
    "status" => $status,
    "updated_at" => date("Y-m-d H:i:s")
];

// Save back
file_put_contents($statusFile, json_encode($statuses, JSON_PRETTY_PRINT));

// Respond OK (VERY IMPORTANT)
http_response_code(200);
echo json_encode([
    "status" => "success"
]);