{"info":{"name":"Email SaaS Public API","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json","description":"Collection for email, SMS, and WhatsApp public API endpoints. Schemas and error codes (SMS_RECIPIENT_OPTED_OUT, WHATSAPP_*) are in GET /v1/public/openapi.json."},"variable":[{"key":"baseUrl","value":"https://api.commtunnel.cloud"},{"key":"apiKey","value":"replace-with-api-key"},{"key":"externalId","value":"replace-with-email-external-id"},{"key":"smsExternalId","value":"replace-with-sms-external-id"},{"key":"waExternalId","value":"replace-with-whatsapp-external-id"}],"item":[{"name":"Send Email","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":"{{baseUrl}}/v1/public/emails/send","body":{"mode":"raw","raw":"{\n  \"from\": \"no-reply@example.com\",\n  \"to\": \"user@example.com\",\n  \"subject\": \"Hello from Email SaaS\",\n  \"html\": \"<p>Welcome!</p>\",\n  \"tracking\": true,\n  \"sandboxMode\": true\n}"}}},{"name":"Preview Email","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":"{{baseUrl}}/v1/public/emails/preview","body":{"mode":"raw","raw":"{\n  \"from\": \"no-reply@example.com\",\n  \"to\": \"user@example.com\",\n  \"subject\": \"Preview only\",\n  \"html\": \"<p>This is preview content</p>\",\n  \"tracking\": true\n}"}}},{"name":"Get Email Status","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":"{{baseUrl}}/v1/public/emails/{{externalId}}"}},{"name":"Get Email Timeline","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":"{{baseUrl}}/v1/public/emails/{{externalId}}/timeline?limit=100"}},{"name":"Get Email Stats","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":"{{baseUrl}}/v1/public/emails/stats?start=2026-01-01T00:00:00.000Z&end=2026-01-31T23:59:59.999Z"}},{"name":"Send SMS","description":"**Success:** `202` Accepted with `id`, `status`, `segments`, etc.\n\n**Common errors** (JSON body: `error`, `code`, `requestId`):\n- `401` — `API_KEY_MISSING`, invalid key\n- `403` — `SMS_CHANNEL_DISABLED`, **`SMS_RECIPIENT_OPTED_OUT`**, **`SMS_SENDER_ID_NOT_APPROVED`** (sender not tenant-approved and not `SMS_HOLLATAGS_FROM`), scope issues\n- `429` — `SMS_QUOTA_EXCEEDED`, `SMS_RATE_LIMITED`\n- `400` — validation (`VALIDATION_ERROR`)\n\nExample opt-out rejection:\n```json\n{\n  \"error\": \"Recipient has opted out of SMS for this organization\",\n  \"code\": \"SMS_RECIPIENT_OPTED_OUT\",\n  \"requestId\": \"…\"\n}\n```","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":"{{baseUrl}}/v1/public/sms/send","body":{"mode":"raw","raw":"{\n  \"to\": \"+15551234567\",\n  \"senderId\": \"ACME\",\n  \"sendType\": 0,\n  \"body\": \"Hello via SMS API\"\n}"}},"response":[{"name":"Example 403 — recipient opted out","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"to\": \"+15551234567\",\n  \"senderId\": \"ACME\",\n  \"sendType\": 0,\n  \"body\": \"Hello\"\n}"},"url":"{{baseUrl}}/v1/public/sms/send"},"status":"Forbidden","code":403,"header":[{"key":"Content-Type","value":"application/json"}],"_postman_previewlanguage":"json","body":"{\n  \"error\": \"Recipient has opted out of SMS for this organization\",\n  \"code\": \"SMS_RECIPIENT_OPTED_OUT\",\n  \"requestId\": \"example-request-id\"\n}"}]},{"name":"Send OTP SMS","description":"**Success:** `202` Accepted with queued SMS external id and cooldown.\n\n**Common errors** (JSON body: `error`, `code`, `requestId`):\n- `401` — API key issues\n- `403` — `SMS_CHANNEL_DISABLED`, `SMS_RECIPIENT_OPTED_OUT`, `SMS_OTP_BRAND_NOT_ALLOWED`\n- `429` — `SMS_OTP_RATE_LIMITED`, `SMS_QUOTA_EXCEEDED`, `SMS_RATE_LIMITED`\n- `400` — invalid `otpCode` / `brandName`\n","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":"{{baseUrl}}/v1/public/sms/otp/send","body":{"mode":"raw","raw":"{\n  \"to\": \"+15551234567\",\n  \"purpose\": \"PHONE_VERIFICATION\",\n  \"brandName\": \"ACME\",\n  \"otpCode\": \"123456\"\n}"}}},{"name":"Get SMS Status","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":"{{baseUrl}}/v1/public/sms/{{smsExternalId}}"}},{"name":"Get SMS Timeline","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":"{{baseUrl}}/v1/public/sms/{{smsExternalId}}/timeline?limit=100"}},{"name":"Retry SMS","description":"**Success:** `202` when retry is queued.\n\nSame SMS error envelope as send. Notable codes:\n- `403` — **`SMS_RECIPIENT_OPTED_OUT`**, `SMS_CHANNEL_DISABLED`, or message cannot be retried\n- `429` — `SMS_QUOTA_EXCEEDED`, `SMS_RATE_LIMITED`\n- `401` — API key issues\n\nSee `GET /v1/public/openapi.json` → `/v1/public/sms/{externalId}/retry`.","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":"{{baseUrl}}/v1/public/sms/{{smsExternalId}}/retry"},"response":[{"name":"Example 403 — opted out on retry","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":"{{baseUrl}}/v1/public/sms/{{smsExternalId}}/retry"},"status":"Forbidden","code":403,"header":[{"key":"Content-Type","value":"application/json"}],"_postman_previewlanguage":"json","body":"{\n  \"error\": \"Recipient has opted out of SMS for this organization\",\n  \"code\": \"SMS_RECIPIENT_OPTED_OUT\",\n  \"requestId\": \"example-request-id\"\n}"}]},{"name":"Send WhatsApp","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"},{"key":"Content-Type","value":"application/json"}],"url":"{{baseUrl}}/v1/public/whatsapp/send","body":{"mode":"raw","raw":"{\n  \"to\": \"15551234567\",\n  \"body\": \"Hello via WhatsApp API\"\n}"}}},{"name":"Retry WhatsApp (failed)","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":"{{baseUrl}}/v1/public/whatsapp/{{waExternalId}}/retry"}},{"name":"Get WhatsApp Status","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":"{{baseUrl}}/v1/public/whatsapp/{{waExternalId}}"}},{"name":"Get WhatsApp Timeline","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{apiKey}}"}],"url":"{{baseUrl}}/v1/public/whatsapp/{{waExternalId}}/timeline?limit=100"}}]}