craftivelabs/ci4-syncraft

CodeIgniter 4 library for Syncraft WhatsApp Gateway API

Maintainers

Package info

github.com/getsyncraft/ci4-syncraft

pkg:composer/craftivelabs/ci4-syncraft

Transparency log

Statistics

Installs: 5

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.1.0 2026-07-25 14:06 UTC

This package is not auto-updated.

Last update: 2026-08-08 14:34:14 UTC


README

CodeIgniter 4 library for Syncraft WhatsApp Gateway API.

Installation

composer require craftivelabs/ci4-syncraft

Usage

💡 See EXAMPLES.md for comprehensive code examples of every Syncraft API function.

<?php

use CraftiveLabs\Syncraft\SyncraftClient;

$client = new SyncraftClient('YOUR_API_KEY');

Connection

// Connect via QR
$qr = $client->connectQr();
echo $qr->qrCode; // data:image/png;base64,...

// Connect via phone pairing code
$code = $client->connectPhone('6281234567890');
echo $code->pairingCode; // ABCD-1234

// Disconnect (temporary)
$client->disconnect();

// Logout (permanent)
$client->logout();

// Get connection status
$status = $client->getStatus();
$status->isConnected; // bool
$status->status;      // "connected"
$status->deviceId;    // UUID
$status->jid;         // "6281234567890@s.whatsapp.net"

Send Messages

// Text message
$result = $client->sendText('6281234567890', 'Hello from Syncraft!');
$result->messageId; // "3EB08F9BB46BF22511D17C"
$result->status;    // "sent"

// Media message (file upload)
$result = $client->sendMedia(
    '6281234567890',
    'image',
    'Check this out!',
    '/path/to/photo.jpg'
);

// Media message with custom filename
$result = $client->sendMedia(
    '6281234567890',
    'document',
    'Invoice #1001',
    '/path/to/invoice.pdf',
    'invoice-1001.pdf' // optional custom filename
);

// Group text
$result = $client->sendGroupText('1203632123456789@g.us', 'Hello group!');

// Group media (file upload)
$result = $client->sendGroupMedia(
    '1203632123456789@g.us',
    'image',
    'Check this photo',
    '/path/to/photo.jpg'
);

// Group media with custom filename
$result = $client->sendGroupMedia(
    '1203632123456789@g.us',
    'document',
    'Report Q2',
    '/path/to/report.pdf',
    'quarterly-report-q2.pdf'
);

// Channel text
$result = $client->sendChannelText('12036302394829302@newsletter', 'New update!');

// Channel media
$result = $client->sendChannelMedia(
    '12036302394829302@newsletter',
    'image',
    'New banner',
    '/path/to/banner.jpg'
);

Broadcasts

// Create broadcast
$broadcast = $client->createBroadcast('Promo July', 'text', 'Hello!', [
    ['phone_number' => '62812345678'],
    ['phone_number' => '62898765432', 'message' => 'Custom message for Budi!'],
]);
$broadcast->id;     // 42
$broadcast->status; // "pending"

// Get broadcast status
$detail = $client->getBroadcast(42);
$detail->sentCount;   // 2
$detail->failedCount; // 0

// Cancel broadcast
$client->cancelBroadcast(42);

Metadata

// Get joined groups
$groups = $client->getGroups();
foreach ($groups->groups as $group) {
    echo $group->name; // "Developer Syncraft"
    echo $group->participants; // 21
}

// Get channels
$channels = $client->getChannels();

// Check WhatsApp number
$check = $client->checkNumber('6281234567890');
$check->isRegistered; // true

// Bulk check numbers
$results = $client->checkNumbers(['6281234567890', '11234567890']);

Webhook

Syncraft sends HTTP callbacks for events registered in your dashboard:

  • Incoming message (message.received)
  • Outgoing message (message.sent)
  • Connection status (device.connected / device.disconnected)

Implement the Handler interface to process callbacks:

<?php

use CraftiveLabs\Syncraft\DTO\WebhookEvent;
use CraftiveLabs\Syncraft\Webhook\Handler;
use CraftiveLabs\Syncraft\Webhook\WebhookTrait;

class MessageHandler implements Handler
{
    use WebhookTrait;

    public function handle(array $payload): void
    {
        $event = $this->parseEvent($payload);

        if ($event->isMessageReceived()) {
            $msg = $event->toMessageData();
            log_message('info', "Message from {$msg->from}: {$msg->content}");
        }

        if ($event->isDeviceDisconnected()) {
            $device = $event->toDeviceData();
            log_message('error', "Device {$event->deviceId} disconnected");
        }
    }
}

Webhook DTOs:

DTO Event Properties
WebhookEvent all event, deviceId, timestamp, data
MessageData message.received / message.sent messageId, from, messageType, content, timestamp, isGroup, isFromMe
DeviceData device.connected / device.disconnected jid (nullable), status

WebhookEvent has helper methods: isMessageReceived(), isMessageSent(), isDeviceConnected(), isDeviceDisconnected(), toMessageData(), toDeviceData().

DTOs

All API responses are returned as typed DTOs (Data Transfer Objects):

DTO Properties
QRCode qrCode
PairingCode pairingCode
ConnectionStatus deviceId, isConnected, jid, status
SentMessage messageId, status, to
BroadcastResult id, name, status, totalCount, createdAt
BroadcastDetail id, name, status, totalCount, sentCount, failedCount, recipients
GroupList groups (array of Group), total
Group jid, name, topic, ownerJid, isLocked, isAnnounce, participants
ChannelList channels (array of Channel), total
Channel jid, name, description
NumberCheck isRegistered, jid
BulkNumberCheck results (array of NumberCheck)

Requirements

  • PHP 7.4+
  • CodeIgniter 4 (optional — library is framework-agnostic)
  • Guzzle 7+

Testing

vendor/bin/phpunit