ghijk / smseveryone-sdk
Laravel SDK for the SMSEveryone API using Saloon
Requires
- php: ^8.2
- illuminate/support: ^11.0|^12.0
- saloonphp/laravel-plugin: ^3.0
- saloonphp/saloon: ^3.0
Requires (Dev)
- laravel/pint: ^1.0
- orchestra/testbench: ^9.0|^10.0
- pestphp/pest: ^3.0
README
A Laravel SDK for the SMSEveryone SMS API, built with Saloon.
Requirements
- PHP 8.2+
- Laravel 11 or 12
Installation
composer require ghijk/smseveryone-sdk
The service provider and facade are auto-discovered.
Publish the config file:
php artisan vendor:publish --tag=smseveryone-config
Configuration
Add your credentials to .env:
SMSEVERYONE_API_KEY=your-base64-encoded-key SMSEVERYONE_DEFAULT_ORIGINATOR=61400190499
Your API key is your username:password base64 encoded. For example, if your username is jimsbusiness and password is s56sbdyte83fs:
jimsbusiness:s56sbdyte83fs → base64 → amltc2J1c2luZXNzOnM1NnNiZHl0ZTgzZnM=
Config options (config/smseveryone.php):
return [ 'api_key' => env('SMSEVERYONE_API_KEY', ''), 'base_url' => env('SMSEVERYONE_BASE_URL', 'https://smseveryone.com/api'), 'default_originator' => env('SMSEVERYONE_DEFAULT_ORIGINATOR', ''), 'timeout' => [ 'connect' => env('SMSEVERYONE_CONNECT_TIMEOUT', 10), 'request' => env('SMSEVERYONE_REQUEST_TIMEOUT', 30), ], ];
Usage
Use the SmsEveryone facade or inject Ghijk\SmsEveryoneSdk\SmsEveryone via dependency injection.
Sending SMS
use Ghijk\SmsEveryoneSdk\Facades\SmsEveryone; // Send to one recipient $response = SmsEveryone::sendSms('Hello!', ['61400123456']); if ($response->successful()) { echo "Campaign ID: {$response->campaignId}"; echo "Credits used: {$response->credits}"; } // Send to multiple recipients $response = SmsEveryone::sendSms( message: 'Hello everyone!', destinations: ['61400123456', '61400123999'], originator: '61400190499', ); // Schedule for later (format: YYYYMMDDHHMM) $response = SmsEveryone::scheduleSms( message: 'Reminder: appointment tomorrow', destinations: ['61400123456'], timeScheduled: '202503121300', reference: 'appt-reminder-123', ); // Send to a stored CRM list $response = SmsEveryone::sendToList( message: 'Weekly update', crmIds: [4398], );
Managing Campaigns
// Check campaign status $response = SmsEveryone::campaignStatus('11967222'); echo $response->message; // "Scheduled", "Running", "Paused", "Deleted" // Modify a scheduled campaign SmsEveryone::modifyCampaign( campaignId: '11967222', message: 'Updated message text', timeScheduled: '202503121400', ); // Pause / unpause / delete SmsEveryone::pauseCampaign('11967222'); SmsEveryone::unpauseCampaign('11967222'); SmsEveryone::deleteCampaign('11967222');
Delivery Reports
// Check delivery status for entire campaign $report = SmsEveryone::deliveryStatus('11967215'); foreach ($report->destinations as $status) { echo "{$status->destination}: {$status->status->label()}"; // "61400123456: Delivered" if ($status->delivered()) { // Message delivered successfully } if ($status->failed()) { echo "Error: {$status->errorCode->description()}"; if ($status->errorCode->isPermanent()) { // Remove this number from your database } } } // Check a specific number $report = SmsEveryone::deliveryStatus('11967215', '61400123456');
Replies
// Get new replies (marks them as retrieved) $replies = SmsEveryone::replies(); foreach ($replies->messages as $reply) { echo "From: {$reply->originator}"; echo "To: {$reply->recipient}"; echo "Message: {$reply->messageText}"; echo "Received: {$reply->received}"; } // Test mode (won't mark as retrieved) $replies = SmsEveryone::replies(test: true); // Filter by date range (max 30 days) $replies = SmsEveryone::replies( dateStart: '2025-03-01', dateEnd: '2025-03-11', ); // Filter by days back (max 7) $replies = SmsEveryone::replies(days: 2); // Filter by originator number $replies = SmsEveryone::replies(originator: '61400123456');
Webhook Replies
SMSEveryone can POST replies to your URL via HTTP GET. Parse incoming webhooks:
use Ghijk\SmsEveryoneSdk\Data\WebhookReply; Route::get('/sms/webhook', function (Request $request) { $reply = WebhookReply::fromRequest($request); Log::info("SMS from {$reply->originator}: {$reply->messageText}"); // Must respond with just "0" return response('0', 200)->header('Content-Type', 'text/plain'); });
Account & Credits
// Get account settings $settings = SmsEveryone::userSettings(); echo "Credits: {$settings->credits}"; echo "User ID: {$settings->userId}"; echo "Unicode: " . ($settings->allowUnicode ? 'yes' : 'no'); echo "International: " . ($settings->allowInternational ? 'yes' : 'no'); // Quick credit check $credits = SmsEveryone::credits(); // returns int // Add credits to a sub-account (requires pre-approval) $response = SmsEveryone::addCredits(1000); if ($response->successful()) { echo "New balance: {$response->credits}"; }
Opt-outs
// Unsubscribe numbers SmsEveryone::addOptOuts(['61400123456', '61400222333']); // Resubscribe a number SmsEveryone::deleteOptOuts(['61400123456']); // List all opted-out numbers $list = SmsEveryone::listOptOuts(); foreach ($list->optOuts as $optOut) { echo "{$optOut->originator} - {$optOut->reason} ({$optOut->added})"; }
CRM Lists
// List all CRM groups $groups = SmsEveryone::listCrmGroups(); foreach ($groups->groups as $group) { echo "{$group->crmId}: {$group->description} ({$group->count} numbers)"; } // Include deleted lists $groups = SmsEveryone::listCrmGroups(showDeleted: true); // Get numbers in a list $details = SmsEveryone::crmDetails(710); foreach ($details->records as $number) { echo $number; // "61400000000" } // Create a new list $result = SmsEveryone::createCrmList( description: 'VIP Clients', numbers: ['61400123456', '61400999111'], ); echo "Created list ID: {$result->crmId}"; // Add numbers to a list SmsEveryone::appendToCrmList(14456, ['61400111555']); // Remove numbers from a list SmsEveryone::removeFromCrmList(14456, ['61400111555']); // Delete a list SmsEveryone::deleteCrmList(14456);
MSISDN Formatting
use Ghijk\SmsEveryoneSdk\SmsEveryone; SmsEveryone::formatMsisdn('0412345678'); // "61412345678" SmsEveryone::formatMsisdn('+61 412 345 678'); // "61412345678" SmsEveryone::formatMsisdn('412345678'); // "61412345678"
Direct Connector Access
For advanced use cases, access the Saloon connector directly:
$connector = SmsEveryone::connector(); // Send any custom request $response = $connector->send(new CustomRequest());
Error Handling
All response DTOs have successful() and/or failed() methods:
$response = SmsEveryone::sendSms('Hello', ['61400123456']); if ($response->failed()) { // Check the API error code $errorCode = ApiErrorCode::tryFrom($response->code); echo $errorCode?->description(); // "Insufficient credits available to start campaign" }
Key error code enums:
ApiErrorCode- API-level errors (insufficient credits, invalid action, etc.)DeliveryReceiptStatus- Delivery statuses (Delivered, Failed, Expired, etc.)DeliveryErrorCode- Carrier-level delivery errors withisPermanent()/isTemporary()
Phone Number Format
The API requires phone numbers in international MSISDN format without the + sign:
- Australian:
61400123456(not0400123456or+61400123456) - New Zealand:
6421123456
Use SmsEveryone::formatMsisdn() to convert Australian local numbers.
SMS Character Limits
Standard GSM characters:
- 1 SMS = 160 characters
- 2 SMS = 306 characters (2 x 153)
- Max 2000 characters per message
Unicode characters (emojis, non-English):
- 1 SMS = 70 characters
- 2 SMS = 134 characters (2 x 67)
Extended characters (counted as 2): | ^ € { } [ ] ~ \
Testing
composer test
License
MIT