pixelsms.vercel.app

Ship SMS in minutes. Zero ceremony.

This is the entire API on one page. Grab your key, call the endpoint, and start sending. Backed by Textbelt under the hood, wrapped with PixelSMS best practices.

Base URLhttps://www.pixelsms.vercel.app/api/sms

Quickstart

  1. Set PIXELSMS_API_KEY on your server.
  2. Set TEXTBELT_API_KEY to your Textbelt key.
  3. POST to https://www.pixelsms.vercel.app/api/sms with your message.

Authentication

Send your PixelSMS key in either header:

  • Authorization: Bearer YOUR_PIXELSMS_API_KEY
  • x-api-key: YOUR_PIXELSMS_API_KEY

Keep keys server-side. Optional: lock origins via PIXELSMS_ALLOWED_ORIGINS.

Send a single SMS

Minimal request. Works worldwide. Message capped at 1000 chars.

curl -X POST https://www.pixelsms.vercel.app/api/sms \
  -H "Authorization: Bearer YOUR_PIXELSMS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+12025550100",
    "message": "Hello from PixelSMS",
    "replyWebhookUrl": "https://yourapp.com/webhooks/sms-replies",
    "webhookData": "metadata echoed back",
    "testMode": false
  }'

Response example (Textbelt-backed):

{
  "success": true,
  "summary": { "requested": 1, "sent": 1, "failed": 0 },
  "results": [
    {
      "to": "+12025550100",
      "success": true,
      "status": "queued",
      "messageId": "textbelt-abc123",
      "quotaRemaining": 41,
      "provider": "textbelt"
    }
  ]
}

Send bulk (up to 50)

Pass an array of recipients; we de-dupe and fan out safely.

curl -X POST https://www.pixelsms.vercel.app/api/sms \
  -H "x-api-key: YOUR_PIXELSMS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": ["+12025550100", "+442071838750"],
    "message": "Launch day! Thanks for being here.",
    "testMode": false
  }'

Partial failures return HTTP 207 with per-recipient results.

Client examples

// JavaScript / TypeScript
await fetch("https://www.pixelsms.vercel.app/api/sms", {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_PIXELSMS_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    to: "+12025550100",
    message: "Hello from PixelSMS",
    replyWebhookUrl: "https://yourapp.com/webhooks/sms-replies",
    webhookData: "metadata echoed back",
    testMode: false,
  }),
});
# Python
import requests

response = requests.post(
    "https://www.pixelsms.vercel.app/api/sms",
    headers={
        "Authorization": "Bearer YOUR_PIXELSMS_API_KEY",
        "Content-Type": "application/json",
    },
    json={
        "to": "+12025550100",
        "message": "Hello from PixelSMS",
        "replyWebhookUrl": "https://yourapp.com/webhooks/sms-replies",
        "webhookData": "metadata echoed back",
        "testMode": False,
    },
)
print(response.json())

Check delivery status

Use the returned messageId.

curl -X GET "https://www.pixelsms.vercel.app/api/sms/status?messageId=textbelt-abc123" \
  -H "Authorization: Bearer YOUR_PIXELSMS_API_KEY"

Returns Textbelt status payload so you can reconcile delivery.

Webhooks & retries

  • Optional replyWebhookUrl for inbound replies; must be http(s).
  • Optional webhookData (≤100 chars) is echoed back in reply webhooks.
  • We return 502 when all sends fail; mixed results return 207.
  • Respect Textbelt quotas; response includes quotaRemaining.

Environment checklist

  • PIXELSMS_API_KEY – key your customers use.
  • TEXTBELT_API_KEY – your upstream provider key.
  • PIXELSMS_ALLOWED_ORIGINS – optional CORS allowlist (comma separated).

Need help?

Email support@pixelsms.vercel.app. For status updates check status.pixelsms.com.