Always use E.164 format: +{country_code}{number} with no spaces, dashes, or parentheses.
InputE.164Valid?(415) 555-1234+14155551234After formatting415-555-1234+14155551234After formatting+14155551234+14155551234Yes4155551234+14155551234Need country code
transactional: OTP codes, order confirmations, appointment reminders, account alerts, shipping updates. Allowed 24/7. The recipient has an existing relationship with the sender.
marketing: Promotions, sales, newsletters, product announcements. Subject to:
Misclassifying marketing as transactional violates TCPA and can result in fines up to $1,500 per message.
Sendly automatically handles opt-outs. When a recipient replies STOP, UNSUBSCRIBE, CANCEL, END, or QUIT:
opted_out erroropt_out.created webhook event firesDo not attempt to send to opted-out numbers. Check message.status for opted_out errors.
Opt-out status is checked automatically when sending — the API returns an opted_out error if the recipient has unsubscribed.
Marketing messages are blocked during quiet hours (9pm–8am recipient local time). Sendly enforces this automatically — the API returns quiet_hours_violation if you attempt a marketing send during quiet hours.
Transactional messages are exempt from quiet hours.
SMS messages are limited to 160 characters (GSM-7 encoding) or 70 characters (UCS-2 for emoji/Unicode). Longer messages are split into segments:
EncodingSingle segmentMulti-segment per partGSM-7 (ASCII)160 chars153 charsUCS-2 (emoji/Unicode)70 chars67 chars
Each segment costs credits separately. Keep messages concise.
Sendly blocks messages containing prohibited content categories (SHAFT):
Messages flagged by SHAFT filtering return content_violation error.
Check balance: GET /api/v1/credits
To send SMS in the US/CA, your toll-free number must be verified by carriers. This requires:
Verification takes 1–5 business days. Use sandbox mode ( sk_test_* keys) while waiting.
ErrorCauseFixinvalid_phone_numberNot E.164 formatFormat as +{country}{number}insufficient_creditsBalance too lowPurchase credits at sendly.livequiet_hours_violationMarketing during 9pm–8amUse transactional type or waitopted_outRecipient unsubscribedDo not retry — respect opt-outcontent_violationSHAFT filter triggeredRevise message contentnot_verifiedNumber not carrier-verifiedComplete verification at sendly.live