craftivelabs / ci4-syncraft
CodeIgniter 4 library for Syncraft WhatsApp Gateway API
v1.1.0
2026-07-25 14:06 UTC
Requires
- php: >=7.4
- guzzlehttp/guzzle: ^7.0
Requires (Dev)
- mockery/mockery: ^1.0
- phpunit/phpunit: ^9.0
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