احراز هویت

کلید API را از پنل ← کلیدهای API بسازید و در هدر هر درخواست بفرستید. بدنه‌ی درخواست می‌تواند JSON یا فرم معمولی (application/x-www-form-urlencoded) باشد. پاسخ همیشه JSON است.

Authorization: Bearer vrm_live_xxxxxxxxxxxxxxxx
Base URL: https://verimo.ir

کلید را فقط روی سرور نگه دارید، نه در اپ موبایل یا کد مرورگر. اپ شما باید از سرور خودتان درخواست کد بدهد.

خطاها

خطاها با کد HTTP مناسب و بدنه‌ی { "error": "code", ... } برمی‌گردند.

HTTPerrorیعنی
400invalid_phoneشماره موبایل ایران معتبر نیست
401unauthorizedکلید API نیست یا باطل شده
402insufficient_balanceموجودی کافی نیست (balance و required برمی‌گردد)
404not_foundکد یا منبع پیدا نشد
409instance_not_connectedشماره‌ی واتساپ وصل نیست
429too_many_requestsمحدودیت؛ retry_after (ثانیه) و reason را ببینید
503channel_unavailableکانال خواسته‌شده الان در دسترس نیست

ارسال کد تأیید

POST/v1/verify/send
پارامترتوضیح
phoneموبایل ایران با هر قالبی: 09121234567، +989121234567، ارقام فارسی
channelauto (پیش‌فرض: واتساپ، در صورت نیاز پیامک)، whatsapp یا sms
code_length۴ تا ۸ رقم، پیش‌فرض ۵
ttlاعتبار کد به ثانیه، ۶۰ تا ۹۰۰، پیش‌فرض ۳۰۰
client_ipاختیاری: IP کاربر نهایی، برای گزارش

ارسال یک کد جدید برای همان شماره، کد قبلی را باطل می‌کند. پاسخ فوری است و ارسال در پس‌زمینه انجام می‌شود.

curl -X POST https://verimo.ir/v1/verify/send \
  -H "Authorization: Bearer $VERIMO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"phone":"09121234567"}'
const r = await fetch("https://verimo.ir/v1/verify/send", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.VERIMO_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({ phone: "09121234567" }),
});
const v = await r.json(); // { id, status: "pending", ... }
$ch = curl_init("https://verimo.ir/v1/verify/send");
curl_setopt_array($ch, [
  CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("VERIMO_KEY")],
  CURLOPT_POSTFIELDS => ["phone" => "09121234567"],
]);
$v = json_decode(curl_exec($ch), true);
import os, requests
v = requests.post("https://verimo.ir/v1/verify/send",
    headers={"Authorization": f"Bearer {os.environ['VERIMO_KEY']}"},
    json={"phone": "09121234567"}).json()
201 Created
{
  "id": "5f0c2a8e-…",
  "phone": "989121234567",
  "status": "pending",
  "channel": null,          // بعد از ارسال: "whatsapp" یا "sms"
  "channels": [],
  "delivered": false,
  "failure": null,
  "expires_at": "2026-10-18T09:15:00.000Z",
  "created_at": "2026-10-18T09:10:00.000Z",
  "verified_at": null
}

بررسی کد

POST/v1/verify/check

code به‌همراه id (از پاسخ send) یا phone (آخرین کد همان شماره). هر کد حداکثر 5 بار قابل امتحان است.

curl -X POST https://verimo.ir/v1/verify/check \
  -H "Authorization: Bearer $VERIMO_KEY" \
  -d phone=09121234567 -d code=48213
const r = await fetch("https://verimo.ir/v1/verify/check", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.VERIMO_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({ phone: "09121234567", code: req.body.code }),
});
const { valid } = await r.json();
if (valid) { /* کاربر را وارد کنید */ }
$res = json_decode(curl_exec($ch), true);
if ($res["valid"]) { /* login */ }
200 OK
{ "valid": true,  "status": "approved", "verification": { … } }
{ "valid": false, "status": "pending",  "attempts_left": 3, "verification": { … } }
{ "valid": false, "status": "expired" | "failed" | "canceled", … }

پاسخ «کد اشتباه» هم ۲۰۰ است؛ فقط valid را بررسی کنید.

وضعیت یک کد

GET/v1/verify/{id}

برای نمایش «کد از واتساپ فرستاده شد» یا «از پیامک» به کاربر: فیلدهای channel و delivered.

واتساپ: اتصال شماره

هر شماره‌ی واتساپ شما یک instance است. آن را بسازید، QR را با گوشی اسکن کنید (واتساپ ← دستگاه‌های متصل ← اتصال دستگاه) و بعد پیام بفرستید. همین کار از پنل ← واتساپ هم بدون کد ممکن است.

POST /v1/whatsapp/instancesname، webhook_url (اختیاری) ← پاسخ شامل qr (تصویر data:)
GET /v1/whatsapp/instancesفهرست شماره‌ها
GET /v1/whatsapp/instances/{id}/qrstatus: connecting | open | close و QR تازه تا وقتی وصل نشده
PATCH /v1/whatsapp/instances/{id}تغییر name یا webhook_url
DELETE /v1/whatsapp/instances/{id}قطع و حذف

واتساپ: ارسال پیام

POST/v1/whatsapp/messages
curl -X POST https://verimo.ir/v1/whatsapp/messages \
  -H "Authorization: Bearer $VERIMO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"instance_id":"8d1c…","to":"09121234567","text":"سفارش شما ارسال شد"}'
{
  "instance_id": "8d1c…",
  "to": "09121234567",
  "image_url": "https://example.com/invoice.png",
  "text": "فاکتور سفارش #1042"
}

to: موبایل ایران یا هر شماره‌ی بین‌المللی (فقط رقم). status پیام: sent ← delivered ← read یا failed. وضعیت: GET /v1/whatsapp/messages/{id}؛ فهرست: GET /v1/whatsapp/messages?instance_id=…

Webhook

اگر برای شماره webhook_url گذاشته باشید، این رویدادها را با POST (JSON) می‌فرستیم و تا ۸ بار با فاصله‌ی افزایشی تکرار می‌کنیم تا پاسخ 2xx بگیریم:

{ "event": "message.received", "instance_id": "…",
  "message": { "id": "…", "from": "989121234567", "name": "علی", "text": "سلام", "type": "text", "timestamp": 1760000000 } }

{ "event": "message.status", "instance_id": "…", "message_id": "…", "status": "delivered" }

{ "event": "instance.status", "instance_id": "…", "status": "open", "phone": "989121112233" }

هر درخواست امضا دارد: X-Verimo-Signature = HMAC-SHA256 با «کلید امضای webhook» (در تنظیمات پنل) روی {X-Verimo-Timestamp}.{body}.

import crypto from "node:crypto";
function verimoSigned(req, rawBody) {
  const ts = req.headers["x-verimo-timestamp"];
  const sig = crypto.createHmac("sha256", process.env.VERIMO_WEBHOOK_SECRET)
    .update(`${ts}.${rawBody}`).digest("hex");
  return Math.abs(Date.now() / 1000 - Number(ts)) < 300 &&
    crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(req.headers["x-verimo-signature"] ?? ""));
}
$raw = file_get_contents("php://input");
$ts  = $_SERVER["HTTP_X_VERIMO_TIMESTAMP"] ?? "";
$sig = hash_hmac("sha256", $ts . "." . $raw, getenv("VERIMO_WEBHOOK_SECRET"));
$ok  = hash_equals($sig, $_SERVER["HTTP_X_VERIMO_SIGNATURE"] ?? "") && abs(time() - (int)$ts) < 300;

موجودی

GET/v1/account
{ "name": "…", "brand": "فروشگاه من", "balance": 98500, "currency": "IRT",
  "prices": { "verify": 150, "sms": 120, "whatsapp_message": 40 } }

محدودیت‌ها