Skip to main content

TypeScript SDK

The official TypeScript SDK for ZapyAPI provides a type-safe, easy-to-use interface for interacting with your WhatsApp instances.

Installation

npm install @zapyapi/sdk
# or
yarn add @zapyapi/sdk
# or
pnpm add @zapyapi/sdk

Quick Start

import { ZapyClient } from '@zapyapi/sdk';

const client = new ZapyClient({
apiKey: 'your-api-key',
});

// Send a text message
const result = await client.messages.sendText('my-instance', {
to: '5511999999999',
message: 'Hello from ZapyAPI SDK!'
});

console.log('Message sent:', result.messageId);

Client Configuration

import { ZapyClient } from '@zapyapi/sdk';

const client = new ZapyClient({
// Required: Your API key from the dashboard
apiKey: 'your-api-key',

// Optional: Base URL (defaults to production)
baseUrl: 'https://api.zapyapi.com/api',

// Optional: Request timeout in milliseconds (default: 30000)
timeout: 30000,

// Optional: Custom headers
headers: {
'X-Custom-Header': 'value'
}
});

Available Resources

Instances

Manage your WhatsApp instances:

// List all instances
const { data: instances } = await client.instances.list();

// Get QR code for connecting
const qr = await client.instances.getQRCode('my-instance');
console.log('Scan this QR:', qr.qrCode);

// Restart an instance
await client.instances.restart('my-instance');

// Logout an instance
await client.instances.logout('my-instance');

Messages

Send and manage messages:

// Send text message
await client.messages.sendText('my-instance', {
to: '5511999999999',
message: 'Hello!',
quoteMessageId: 'optional-message-id-to-reply'
});

// Send image
await client.messages.sendImage('my-instance', {
to: '5511999999999',
image: 'https://example.com/image.jpg', // URL or base64
caption: 'Check this out!',
viewOnce: false
});

// Send video
await client.messages.sendVideo('my-instance', {
to: '5511999999999',
video: 'https://example.com/video.mp4',
caption: 'Watch this video!'
});

// Send audio note (voice message)
await client.messages.sendAudioNote('my-instance', {
to: '5511999999999',
audio: 'data:audio/ogg;base64,...'
});

// Send audio file
await client.messages.sendAudioFile('my-instance', {
to: '5511999999999',
audio: 'https://example.com/audio.mp3'
});

// Send document
await client.messages.sendDocument('my-instance', {
to: '5511999999999',
document: 'https://example.com/file.pdf',
fileName: 'report.pdf',
caption: 'Here is the report'
});

// Forward a message
await client.messages.forward('my-instance', {
to: '5511999999999',
messageId: 'original-message-id'
});

// Edit a message
await client.messages.edit('my-instance', {
messageId: 'message-id',
message: 'Updated text'
});

// Mark as read
await client.messages.read('my-instance', {
messageId: 'message-id'
});

// Delete a message
await client.messages.delete('my-instance', {
messageId: 'message-id'
});

// Get media download link
const media = await client.messages.getMediaDownloadLink('my-instance', 'message-id');
console.log('Download URL:', media.url);

Enums

The SDK exports type-safe enums for common values:

import {
WebhookEventType,
InstanceStatus,
MessageAckStatus,
MessageType,
WebhookQueueStatus,
ConnectionStatus
} from '@zapyapi/sdk';

// Check instance status
if (instance.status === InstanceStatus.CONNECTED) {
console.log('Ready to send messages!');
}

// Handle webhook events
if (event.event === WebhookEventType.MESSAGE) {
console.log('New message received!');
}

// Check message delivery status
if (event.data.ack === MessageAckStatus.READ) {
console.log('Message was read!');
}

Available Enums

WebhookEventType

WebhookEventType.MESSAGE           // 'message'
WebhookEventType.MESSAGE_STATUS // 'message-status'
WebhookEventType.QR_CODE // 'qr-code'
WebhookEventType.CONTACT_CREATED // 'contact-created'
WebhookEventType.CONTACT_UPDATED // 'contact-updated'
WebhookEventType.CONTACT_DEDUPLICATED // 'contact-deduplicated'

InstanceStatus

InstanceStatus.STOPPED             // 'stopped'
InstanceStatus.MANUALLY_STOPPED // 'manually_stopped'
InstanceStatus.CONNECTING // 'connecting'
InstanceStatus.PENDING_QR_CODE_SCAN // 'pending_qr_code_scan'
InstanceStatus.CONNECTED // 'connected'
InstanceStatus.ERROR // 'error'
InstanceStatus.CREATED // 'created'
InstanceStatus.QR_TIMEOUT // 'qr_timeout'
InstanceStatus.PAYMENT_PENDING // 'payment_pending'

MessageAckStatus

MessageAckStatus.PENDING    // 'pending'
MessageAckStatus.SENT // 'sent'
MessageAckStatus.DELIVERED // 'delivered'
MessageAckStatus.READ // 'read'
MessageAckStatus.PLAYED // 'played'

MessageType

MessageType.TEXT      // 'text'
MessageType.IMAGE // 'image'
MessageType.VIDEO // 'video'
MessageType.AUDIO // 'audio'
MessageType.DOCUMENT // 'document'
MessageType.STICKER // 'sticker'
MessageType.LOCATION // 'location'
MessageType.CONTACT // 'contact'
MessageType.POLL // 'poll'
MessageType.REACTION // 'reaction'

Webhook Handling

Type Guards

Use built-in type guards for type-safe webhook handling:

import {
WebhookEvent,
isMessageEvent,
isMessageStatusEvent,
isQRCodeEvent
} from '@zapyapi/sdk';

function handleWebhook(event: WebhookEvent) {
if (isMessageEvent(event)) {
// TypeScript knows event.data is MessageEventData
console.log('From:', event.data.from.phone);
console.log('Text:', event.data.text);
}

if (isMessageStatusEvent(event)) {
// TypeScript knows event.data is MessageStatusEventData
console.log('Status:', event.data.ack);
}

if (isQRCodeEvent(event)) {
// TypeScript knows event.data is QRCodeEventData
console.log('QR Code:', event.data.qrCode);
}
}

Signature Verification

Verify webhook signatures for security:

import { verifyWebhookSignature } from '@zapyapi/sdk';

app.post('/webhook', express.json(), (req, res) => {
const signature = req.headers['x-webhook-signature'];
const isValid = verifyWebhookSignature(
req.body,
signature,
process.env.WEBHOOK_SECRET
);

if (!isValid) {
return res.status(401).send('Invalid signature');
}

// Process webhook...
res.status(200).send('OK');
});

Error Handling

The SDK provides typed errors for better error handling:

import {
ZapyClient,
ZapyApiError,
AuthenticationError,
RateLimitError,
InstanceNotFoundError,
ValidationError
} from '@zapyapi/sdk';

try {
await client.messages.sendText('my-instance', {
to: '5511999999999',
message: 'Hello!'
});
} catch (error) {
if (error instanceof AuthenticationError) {
console.error('Invalid API key');
} else if (error instanceof RateLimitError) {
console.error('Rate limit exceeded, retry after:', error.retryAfter);
} else if (error instanceof InstanceNotFoundError) {
console.error('Instance not found');
} else if (error instanceof ValidationError) {
console.error('Invalid request:', error.message);
} else if (error instanceof ZapyApiError) {
console.error('API error:', error.statusCode, error.message);
}
}

Utilities

The SDK includes helpful utility functions:

import {
normalizePhone,
isValidPhone,
isGroup,
extractPhone
} from '@zapyapi/sdk';

// Normalize phone number to WhatsApp format
normalizePhone('11999999999'); // '5511999999999'
normalizePhone('+55 11 99999-9999'); // '5511999999999'

// Validate phone number
isValidPhone('5511999999999'); // true
isValidPhone('invalid'); // false

// Check if ID is a group
isGroup('[email protected]'); // false
isGroup('[email protected]'); // true

// Extract phone from WhatsApp ID
extractPhone('[email protected]'); // '5511999999999'

TypeScript Support

The SDK is written in TypeScript and provides full type definitions:

import type {
// Common types
ZapyClientOptions,
PaginationQuery,
PaginatedResponse,

// Instance types
Instance,
CreateInstanceOptions,
QRCodeResponse,

// Message types
SendTextMessageOptions,
SendImageMessageOptions,
MessageResponse,

// Webhook types
WebhookEvent,
MessageWebhookEvent,
MessageEventData,
ContactInfo
} from '@zapyapi/sdk';

ESM and CommonJS

The SDK supports both ESM and CommonJS:

// ESM
import { ZapyClient } from '@zapyapi/sdk';

// CommonJS
const { ZapyClient } = require('@zapyapi/sdk');