پرش به مطلب اصلی

وب سرویس پیامک

وب سرویس پیامک برای ارسال پیامک از خطوط شما، خواندن پیام‌های ارسالی و دریافتی، و مدیریت قالب‌ها، شماره‌های مسدود و وب‌هوک است. دستورهای arianet sms روی همین وب سرویس ساخته شده‌اند. کیف پول، شارژ، تیکت و اعضای تیم بخشی از حساب آریانت هستند و در این وب سرویس نیستند.

وب سرویس قبلی پیامک

آدرس‌های قبلی sms-api.ariaservice.net/api/v1 و کلیدهای قبلی آن در دوره انتقال کار می‌کنند و پاسخ‌هایشان هدر Deprecation: true و پیوندی به همین صفحه دارد. برای پروژه‌های جدید از این وب سرویس و توکن حساب آریانت استفاده کنید.

شروع سریع​

  1. در پنل، در cloud.ariaservice.net/users/api-tokens توکنی با دسترسی‌های لازم (جدول زیر) بسازید.
  2. خطوط ارسال را ببینید و از یکی از آن‌ها پیامک بفرستید (from شماره خط یا id آن است):
export ARIANET_TOKEN="paste-your-token-here"
BASE=https://api.ariaservice.net/sms/v1
AUTH="Authorization: Bearer $ARIANET_TOKEN"

curl -s $BASE/lines -H "$AUTH"
curl -s -X POST $BASE/messages -H "$AUTH" -H "Content-Type: application/json" \
-d '{"from":"300074360","recipients":["09121234567","09351234567"],"body":"Your code is 1234","client_reference":"order-981"}'

پاسخ 202 Accepted است:

{"batch_id":"01JC8Z...","status":"processing","total_recipients":2,"total_cost_rial":3000,"filtered_blocked_count":0}

هر ارسال یک batch می‌سازد و هزینه از کیف پول حساب کسر می‌شود؛ وضعیت را با GET /batches/{id} و GET /messages?batch_id=... دنبال کنید. شماره‌هایی که در فهرست مسدود شما هستند ارسال نمی‌شوند (filtered_blocked_count). قیمت هر پیام، و اینکه هزینه به ازای هر پیام است یا هر بخش پیامک، در GET /prices آمده است.

ارسال​

POST /messages این فیلدها را می‌گیرد:

فیلدنوع
recipientsآرایه رشته، ۱ تا ۱۰۰شماره‌های موبایل (الزامی)
fromرشته عددیشماره خط (number) یا id آن از GET /lines (الزامی)
bodyرشته، حداکثر ۲۰۰۰ نویسهمتن پیام؛ الزامی مگر اینکه template_id داده شود
template_idعددارسال یکی از قالب‌های شما به جای body
scheduled_atزمان ISO 8601 در آیندهارسال در زمان مشخص به جای همین حالا
client_referenceرشتهشناسه شما برای این ارسال؛ اگر نباشد هدر Idempotency-Key به کار می‌رود. ارسال تکراری با همان شناسه دوباره انجام نمی‌شود

با scheduled_at هنوز چیزی ارسال یا کسر نمی‌شود: پاسخ {"scheduled_id":12,"status":"pending","scheduled_at":"..."} است، ارسال در GET /scheduled دیده می‌شود و تا وقتی در انتظار است با DELETE /scheduled/{id} لغو می‌شود.

فهرست‌ها و صفحه‌بندی​

همه فهرست‌ها page و per_page (حداکثر ۲۰۰) می‌گیرند و این‌طور پاسخ می‌دهند:

{"data":[...],"meta":{"total":134,"current_page":1,"per_page":50}}

GET /messages بر اساس batch_id، status و to هم فیلتر می‌شود و GET /blocked-recipients بر اساس phone.

احراز هویت و دسترسی‌ها​

دسترسی (scope)اجازه
sms:messages:readپیام‌های ارسالی و دریافتی، batchها، ارسال‌های زمان‌بندی‌شده، قیمت‌ها و گزارش
sms:messages:writeارسال و لغو ارسال زمان‌بندی‌شده، شماره‌های مسدود و وب‌هوک
sms:lines:readخطوط ارسال
sms:templates:readقالب‌ها
sms:templates:writeساخت، ویرایش و حذف قالب

توکن بدون هیچ دسترسی، بدون محدودیت است؛ درخواست خط اختصاصی (POST /lines) چنین توکنی می‌خواهد. پیامک فقط در ریجن iran-1 اجرا می‌شود و به هدر Arianet-Region نیازی ندارد.

منابع​

متد و مسیرکاربرد
POST /messagesارسال فوری یا در scheduled_at (بخش ارسال)
GET /messages ، GET /messages/{id}پیام‌های ارسالی و وضعیت تحویل
GET /batches ، GET /batches/{id}batchهای ارسال
GET /scheduled ، DELETE /scheduled/{id}ارسال‌های زمان‌بندی‌شده و لغو ارسال در انتظار
GET /inboundپیام‌های دریافتی روی خطوط شما
GET /lines ، POST /linesخطوط ارسال؛ درخواست خط اختصاصی (number، note)
GET /templates ، POST /templates ، GET/PUT/DELETE /templates/{id}قالب‌ها (name، body)
GET /blocked-recipients ، POST /blocked-recipients ، DELETE /blocked-recipients/{id}شماره‌های مسدود؛ ورودی phone و note، خروجی mobile و reason
GET /webhook ، PUT /webhook ، POST /webhook/secretوب‌هوک (url، enabled، events) و ساخت کلید امضای جدید؛ بخش وب‌هوک
GET /reports/summaryارسال‌شده، تحویل‌شده، ناموفق و هزینه، با ریز روزانه (from، to)
GET /pricesقیمت هر پیام و پله‌های حجمی

جزئیات بدنه و پاسخ هر endpoint در مرجع تعاملی آمده است.

وضعیت‌ها​

شیءمقدارهای status
پیام (GET /messages)queued در صف، sent ارسال‌شده، delivered تحویل‌شده، failed ناموفق، undelivered تحویل‌نشده، rejected ردشده، expired منقضی
ارسال (GET /batches)pending، processing، partial بخشی ناموفق، completed، failed
زمان‌بندی‌شده (GET /scheduled)scheduled، processing، sent، failed، cancelled

فیلتر status در GET /messages و GET /batches همین مقدارها را می‌گیرد.

جزئیات پیام و تایم‌لاین​

هر پیام در GET /messages این فیلدها را هم دارد:

فیلدمعنی
operatorاپراتور گیرنده از روی پیش‌شماره: mci همراه اول، mtn ایرانسل، rightel رایتل، other (برای شماره‌های ترابردشده تقریبی است)
encodingunicode (فارسی) یا gsm (لاتین)
queued_atزمان ثبت در صف
provider.nameدرگاه ارسال، مثلاً magfa
provider.message_idشناسه‌ی پیگیری پیام در اپراتور (مگفا)
provider.status_codeآخرین کد وضعیت اپراتور: 0 هنوز وضعیتی نیست، 8 تحویل به اپراتور، 1 تحویل به گوشی، 2 به گوشی تحویل نشد، 16 به اپراتور نرسید، -1 منقضی
provider.error_codeکد خطای مگفا وقتی پیام را نپذیرفته است
delivery_checksتعداد استعلام وضعیت تحویل
last_checked_atزمان آخرین استعلام

GET /messages/{id} علاوه بر این‌ها timeline را برمی‌گرداند: فهرست مرحله‌ها به ترتیب زمان، هر کدام با type، at، status_code و error_code.

typeمعنی
queuedثبت در صف
sent_to_providerارسال به مگفا و دریافت شناسه‌ی پیگیری
provider_refusedمگفا پیام را نپذیرفت (هزینه برگشت داده می‌شود)
status_checkedاستعلام وضعیت بدون نتیجه‌ی نهایی
delivered_to_operatorتحویل به شبکه‌ی اپراتور، در انتظار گوشی
deliveredتحویل به گوشی گیرنده
not_deliveredبه گوشی تحویل نشد
not_sent_to_operatorبه شبکه‌ی اپراتور نرسید
expiredگزارش تحویل در ۲۴ ساعت نیامد
rejectedرد شد

هر ارسال در GET /batches هم channel (panel، api یا system)، sender_ip (پوشیده، مثل 85.133.133.x) و completed_at دارد.

وب‌هوک​

با PUT /webhook آدرس، روشن یا خاموش بودن و رویدادهای دلخواه را تنظیم کنید:

curl -s -X PUT $BASE/webhook -H "$AUTH" -H "Content-Type: application/json" \
-d '{"url":"https://example.com/sms-hook","enabled":true,"events":["message.delivered","message.failed","inbound.received"]}'
رویدادچه زمانی
batch.completedپایان هر ارسال؛ برای وب‌هوک روشن همیشه فرستاده می‌شود
message.deliveredپیام به گیرنده تحویل شد
message.failedپیام هرگز تحویل نمی‌شود (failed، undelivered، rejected، expired)
inbound.receivedپیامکی روی خط اختصاصی شما دریافت شد

سه رویداد آخر فقط وقتی فرستاده می‌شوند که در events باشند؛ به‌طور پیش‌فرض خاموش‌اند.

هر رویداد یک POST با بدنهٔ {"event","occurred_at","data"} است و data همان شکلی را دارد که API برای آن شیء برمی‌گرداند:

{"event":"message.delivered","occurred_at":"2026-11-12T17:20:00+00:00","data":{"id":"01m78c...","batch_id":"01m78c...","to":"09121234567","from":"300074360","body":"Your code is 1234","parts":1,"status":"delivered","cost_rial":1750,"error":null,"sent_at":"...","delivered_at":"...","created_at":"..."}}

هدر X-Signature برابر HMAC-SHA256 بدنهٔ خام با کلید امضای وب‌هوک شماست؛ آن را بررسی کنید. پاسخ غیر 2xx تا ۵ بار با فاصلهٔ رو به افزایش دوباره فرستاده می‌شود.

خطاها​

خطاها JSON هستند: {"code": "...", "message": "..."}.

HTTPمعنی
401توکن نبود یا نامعتبر است
402insufficient_balance: موجودی کافی نیست
403insufficient_scope، forbidden، identity_needed، account_suspended یا sender_line_not_usable (این خط برای ارسال حساب شما نیست)
404not_found (مثلاً قالبِ حساب دیگر)
422validation_failed، all_recipients_blocked، already_blocked، not_cancellable
429rate_limit_exceeded / rate_limited
503sms_unavailable، region_unavailable
504gateway_timeout: پاسخ به‌موقع نرسید؛ ممکن است ارسال انجام شده باشد، قبل از تکرار GET /messages را بررسی کنید (client_reference برای همین است)