Skip to main content
This guide shows the recommended path from zero to a connected instance sending messages through VZaps.

1. Install and create the client

composer require vzaps/sdk
require __DIR__ . '/vendor/autoload.php';

use VZaps\Sdk\VZapsClient;

$vzaps = new VZapsClient(
    clientToken: getenv('VZAPS_CLIENT_TOKEN'),
    clientSecret: getenv('VZAPS_CLIENT_SECRET'),
);

2. Validate authentication

$jwt = $vzaps->auth()->getAccessToken();
echo substr($jwt, 0, 16) . PHP_EOL;
In most flows, you do not need to call getAccessToken(). SDK resources do that automatically.

3. List existing instances

$instances = $vzaps->instances()->list([
    'page' => 1,
    'pageSize' => 20,
    'search' => 'support',
]);

print_r($instances);

4. Create an instance

$created = $vzaps->instances()->create([
    'name' => 'Commercial Support',
    'webhook' => 'https://example.com/webhooks/vzaps',
    'eventsSubscribe' => ['Message', 'ReadReceipt', 'Connected', 'Disconnected'],
]);

print_r($created);
Save from the response:
  • id: instance identifier.
  • token: instance token. Use it as instanceToken on instance calls.

5. Subscribe the instance

$subscription = $vzaps->instances()->subscribe(
    'VZ...',
    [],
    'instance-token',
);

print_r($subscription);
If there is a scheduled cancellation and you want to reactivate the subscription:
$resumed = $vzaps->instances()->resumeSubscription(
    'VZ...',
    'instance-token',
);

6. Pair WhatsApp

Check status:
$status = $vzaps->sessions()->status('VZ...', 'instance-token');

print_r($status);
Fetch QR code:
$qr = $vzaps->sessions()->qr('VZ...', 'instance-token');

print_r($qr);
Fetch phone pairing code:
$pairCode = $vzaps->sessions()->pairCode(
    'VZ...',
    '5511999999999',
    'instance-token',
);

print_r($pairCode);

7. Configure webhook

See Webhooks for complete configuration, logs, and examples.
$vzaps->webhooks()->set([
    'instanceId' => 'VZ...',
    'instanceToken' => 'instance-token',
    'webhookURL' => 'https://example.com/webhooks/vzaps',
    'events' => ['Message', 'ReadReceipt', 'Connected', 'Disconnected'],
]);

8. Subscribe to realtime

See Realtime for subscription, ack, and reconnect details.
use VZaps\Sdk\Models\Realtime\EventSubscribeRequest;
use VZaps\Sdk\Models\Realtime\VZapsEventType;

$subscription = $vzaps->events()->subscribe(new EventSubscribeRequest(
    instanceId: 'VZ...',
    instanceToken: 'instance-token',
    events: [VZapsEventType::Message, VZapsEventType::Connected, VZapsEventType::Disconnected],
    reconnect: true,
));

$subscription->on(VZapsEventType::Message, function ($event): void {
    echo $event->id . PHP_EOL;
    print_r($event->data);
});

$subscription->onError(function ($error): void {
    error_log((string) $error);
});

9. Send the first message

$vzaps->messages()->sendText([
    'instanceId' => 'VZ...',
    'instanceToken' => 'instance-token',
    'phone' => '5511999999999',
    'message' => 'Hello! This message was sent through VZaps.',
]);

10. Send media

Image:
$vzaps->messages()->sendImage([
    'instanceId' => 'VZ...',
    'instanceToken' => 'instance-token',
    'phone' => '5511999999999',
    'image' => 'https://example.com/image.jpg',
    'caption' => 'Image sent through VZaps',
]);
Document:
$vzaps->messages()->sendDocument([
    'instanceId' => 'VZ...',
    'instanceToken' => 'instance-token',
    'phone' => '5511999999999',
    'document' => 'https://example.com/contract.pdf',
    'fileName' => 'contract.pdf',
    'caption' => 'Here is the contract',
]);
See Messages for every send type and payload.

11. Check queues

See Queues to list, remove, and purge queues.

12. Handle errors

use VZaps\Sdk\Exceptions\VZapsApiException;
use VZaps\Sdk\Exceptions\VZapsAuthenticationException;
use VZaps\Sdk\Exceptions\VZapsException;
use VZaps\Sdk\Exceptions\VZapsTimeoutException;

try {
    $vzaps->messages()->sendText([
        'instanceId' => 'VZ...',
        'instanceToken' => 'instance-token',
        'phone' => '5511999999999',
        'message' => 'Hello',
    ]);
} catch (VZapsAuthenticationException $error) {
    error_log('Invalid credentials');
} catch (VZapsTimeoutException $error) {
    error_log('Request timed out');
} catch (VZapsApiException $error) {
    error_log($error->statusCode . ' ' . $error->getMessage());
    print_r($error->details);
} catch (VZapsException $error) {
    error_log($error->getMessage());
}