ghijk/smseveryone-sdk

Laravel SDK for the SMSEveryone API using Saloon

Maintainers

Package info

github.com/1stevengrant/smseveryone-sdk

pkg:composer/ghijk/smseveryone-sdk

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-03-11 06:27 UTC

This package is auto-updated.

Last update: 2026-03-11 06:32:15 UTC


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 with isPermanent() / isTemporary()

Phone Number Format

The API requires phone numbers in international MSISDN format without the + sign:

  • Australian: 61400123456 (not 0400123456 or +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