Key Takeaways
- C# android sms gateway api bulk send loop: workers, caps, and to[] — not a tight for-loop on the request thread.
- One POST can carry several E.164 numbers. Contact-list campaigns use POST /campaigns. Confirm in docs.
- Twilio-shaped throughput is not a handset promise. OEM and carrier fair-use still bind you.
- Priced by devices and SMS send volume. You use your own phone and operator SMS credit. Retries in the loop still spend operator SMS.
- Free 300 SMS lifetime is for proving pace, not a blast.
- /codebase-csharp owns samples. This is not a Complete C# SDK.
C# bulk send loops against an android sms gateway api fail when someone puts a foreach in a controller. The phone sends one PDU at a time. Samples: C# HTTPS. Docs: Developer Center.
Priced by devices and SMS send volume. You use your own phone and operator SMS credit.
Parallel.ForEach on a single SIM is how you discover rate ceilings and a surprise airtime bill in the same afternoon. One worker. One pace. One promo device.
Not a sync foreach in a web request
Hangfire, Channel, Azure Queue. Idempotency per logical send. ASP.NET notifications cover inbound; this spoke is the blast worker.
Several numbers in to[]
Documented bulk shape (docs win):
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
public static class BulkSmsGateway
{
private const string SendUrl = "https://app.sms-gateway.app/api/v1/messages";
public static async Task SendManyAsync(string apiKey)
{
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
var json = "{\"to\":[\"+14155552671\",\"+14155552672\"],\"text\":\"Hello from SMS Gateway!\",\"type\":\"sms\",\"dedupe\":true}";
using var content = new StringContent(json, Encoding.UTF8, "application/json");
var body = await (await client.PostAsync(SendUrl, content)).Content.ReadAsStringAsync();
Console.WriteLine(body);
}
}
Lists and panel CSV: Excel/CSV. Do not invent /api/send-bulk-sms.
Loop vs campaign vs radio
| Layer | Job | Failure |
|---|---|---|
| .NET worker | Chunk, backoff, persist ids | Request-thread foreach, no idempotency |
| POST /messages | to[], optional dedupe | National numbers, comma strings |
| Android radio | Serialize PDUs | Shared with OTP |
| Operator | Fair-use, filtering | Purchased lists, spam copy |
Pace like a modem, not a thread pool
Back off on 429-class responses. Watch DLR age. Carrier rejected. This is not unlimited send.
OTP stays off this worker
Pin promo with deviceIds after docs confirm the field. OTP.
HttpClient sample, not NuGet
No Complete C# SDK. Keys in env. Campaign gates still apply if the loop is marketing.
Checklist
- Worker, not MVC action.
- E.164
to[]; chunk size written. - Backoff + airtime budget.
- OTP device cannot be targeted.
- Webhook handler idempotent.
- Halt switch for on-call.
Next steps
Canary 10 numbers, then scale. Device count is how throughput grows — not a tighter loop.
Related product pages
Jump to the live product docs for this topic—not another long-form article.
- bulk SMS from Excel and CSVSpreadsheet campaigns
- bulk SMS with consent best practicesHigh-volume outreach
- SMS API documentationLive endpoint reference
- C# REST send samplesC# code examples




