ارسال‌های پیشرفته

این صفحه عملیات مکمل ارسال عادی را پوشش می‌دهد: Batch، زمان‌بندی، لغو، استعلام گروهی وضعیت و دریافت شماره‌های فرستنده مجاز حساب.

ارسال چند پیام متفاوت

POST /v1/messages/batch
X-API-Key: YOUR_API_KEY
Idempotency-Key: batch-1405-05-18-01
Content-Type: application/json
{
  "sender": "300099000121",
  "messages": [
    {
      "recipient": "09121234567",
      "message": "پیام اول",
      "clientReference": "A-1"
    },
    {
      "recipient": "09123334444",
      "message": "پیام دوم",
      "clientReference": "A-2"
    }
  ]
}
فیلد نوع توضیح
sender string شماره فرستنده مجاز حساب
messages array مجموعه پیام‌های مستقل Batch
messages[].recipient string شماره گیرنده هر ردیف
messages[].message string متن همان ردیف
messages[].clientReference string/null شناسه اختیاری همان ردیف در سیستم مشتری

در هر درخواست حداکثر ۵۰۰ پیام پذیرفته می‌شود. Idempotency-Key برای کل Batch الزامی است و SMSDaily برای پردازش داخلی آیتم‌ها شناسه‌های مستقل می‌سازد.

نمونه پاسخ:

[
  {
    "trackingCode": "SMS-20260810-B001",
    "status": "queued",
    "encoding": "Persian",
    "characterCount": 8,
    "partCount": 1,
    "submittedAt": "2026-08-10T07:25:00Z",
    "duplicate": false
  },
  {
    "trackingCode": "SMS-20260810-B002",
    "status": "queued",
    "encoding": "Persian",
    "characterCount": 8,
    "partCount": 1,
    "submittedAt": "2026-08-10T07:25:00Z",
    "duplicate": false
  }
]

نمونه C# برای Batch

using System.Net.Http.Json;

var request = new HttpRequestMessage(HttpMethod.Post, "/v1/messages/batch");
request.Headers.Add("Idempotency-Key", "batch-1405-05-18-01");
request.Content = JsonContent.Create(new
{
    sender = "300099000121",
    messages = new[]
    {
        new { recipient = "09121234567", message = "پیام اول", clientReference = "A-1" },
        new { recipient = "09123334444", message = "پیام دوم", clientReference = "A-2" }
    }
});

using var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

ارسال زمان‌بندی‌شده

POST /v1/messages/scheduled
X-API-Key: YOUR_API_KEY
Idempotency-Key: reminder-781
Content-Type: application/json
{
  "sender": "300099000121",
  "recipient": "09121234567",
  "message": "یادآوری جلسه",
  "sendAt": "2026-08-10T12:00:00Z",
  "clientReference": "meeting-781"
}
فیلد نوع توضیح
sender string شماره فرستنده مجاز
recipient string گیرنده
message string متن پیام
sendAt datetime زمان ارسال به UTC
clientReference string/null شناسه اختیاری در سیستم مشتری

در RC2 زمان ارسال باید حداقل ۳۰ ثانیه بعد و حداکثر ۳۰ روز آینده باشد. پیام تا زمان تعیین‌شده در صف SMSDaily باقی می‌ماند.

نمونه C# برای زمان‌بندی

var request = new HttpRequestMessage(HttpMethod.Post, "/v1/messages/scheduled");
request.Headers.Add("Idempotency-Key", $"meeting-{meetingId}");
request.Content = JsonContent.Create(new
{
    sender = "300099000121",
    recipient = "09121234567",
    message = "یادآوری جلسه",
    sendAt = DateTimeOffset.UtcNow.AddHours(2),
    clientReference = $"meeting-{meetingId}"
});

using var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();

لغو پیام صف‌شده

POST /v1/messages/{trackingCode}/cancel
X-API-Key: YOUR_API_KEY

فقط پیامی قابل لغو است که هنوز در وضعیت قابل لغو باشد و به مسیر پایین‌دستی ارسال نشده باشد.

نمونه پاسخ:

{
  "trackingCode": "SMS-20260810-A1B2C3D4",
  "status": "cancelled",
  "cancelledAt": "2026-08-10T07:28:00Z"
}

اگر پیام از مرحله قابل لغو عبور کرده باشد، پاسخ 409 Conflict دریافت می‌شود.

دریافت وضعیت چند پیام

POST /v1/messages/status
X-API-Key: YOUR_API_KEY
Content-Type: application/json
{
  "trackingCodes": [
    "SMS-20260810-A1B2C3D4",
    "SMS-20260810-E5F60718"
  ]
}

در هر درخواست حداکثر ۱۰۰ کد پیگیری پذیرفته می‌شود. پاسخ، وضعیت عمومی پیام‌های پیدا‌شده برای همان حساب را برمی‌گرداند.

[
  {
    "trackingCode": "SMS-20260810-A1B2C3D4",
    "clientReference": "order-781",
    "sender": "300099000121",
    "recipient": "09121234567",
    "status": "delivered",
    "partCount": 1,
    "submittedAt": "2026-08-10T07:10:00Z",
    "updatedAt": "2026-08-10T07:12:35Z"
  }
]

نمونه C# برای استعلام گروهی

using var response = await client.PostAsJsonAsync(
    "/v1/messages/status",
    new
    {
        trackingCodes = new[]
        {
            "SMS-20260810-A1B2C3D4",
            "SMS-20260810-E5F60718"
        }
    });

response.EnsureSuccessStatusCode();

شماره‌های فرستنده مجاز

GET /v1/senders
X-API-Key: YOUR_API_KEY

نمونه پاسخ:

[
  { "sender": "300099000121", "active": true },
  { "sender": "02170001234", "active": true }
]

برنامه مشتری فقط باید یکی از Senderهای فعال حساب را انتخاب کند. انتخاب سرویس‌دهنده و مسیر پایین‌دستی براساس Sender در داخل SMSDaily انجام می‌شود و جزئیات Provider بخشی از قرارداد عمومی نیست.

نمونه پایه HttpClient برای همه مثال‌ها

var client = new HttpClient
{
    BaseAddress = new Uri("https://service.smsdaily.ir")
};
client.DefaultRequestHeaders.Add("X-API-Key", apiKey);

بهتر است در برنامه واقعی HttpClient را از IHttpClientFactory دریافت کنید و برای 429 و خطاهای موقت 5xx Retry با Backoff کنترل‌شده داشته باشید. برای درخواست‌های ارسال، Retry فقط با همان Idempotency-Key درخواست اولیه انجام شود.