SDK PHP · Quickstart
moshipp/mosend-sdk es el SDK oficial de PHP — cero dependencias (solo ext-curl), PHP 7.4+, ideal para WooCommerce / hosting compartido. Los inputs son arrays asociativos. Ver todos los SDK →
Instalá e instanciá el cliente
composer require moshipp/mosend-sdk
<?php
require 'vendor/autoload.php';
use Mosend\MosendClient;
$mosend = new MosendClient([
'apiKey' => getenv('MOSEND_API_KEY'), // mk_live_<prefix>.<secret>
'orgId' => getenv('MOSEND_ORG_ID'), // default para rutas /organizations/{orgId}/...
// opcionales:
// 'retries' => ['max' => 3, 'on' => [429, 502, 503]],
// 'timeout' => 30000, // ms
]);El cliente acepta API key (server-to-server) o un accessToken JWT. Con orgId en el constructor no lo repetís en cada llamada (igual podés pasarlo por método).
Enviá un mensaje o una plantilla
// Texto (ventana de 24h abierta)
$mosend->messages->send([
'phoneNumberId' => '<phone-uuid>',
'to' => '573001234567', // E.164 sin '+'
'type' => 'text',
'payload' => ['body' => 'Hola 👋'],
]);
// Plantilla (body posicional)
$msg = $mosend->messages->send([
'phoneNumberId' => '<phone-uuid>',
'to' => '573001234567',
'type' => 'template',
'templateId' => '<uuid-de-la-plantilla>',
'variables' => ['Juan', 'FAC-2026-0042'],
]);
echo $msg['id'], ' ', $msg['metaMessageId'], PHP_EOL;
// Idempotencia (no duplica si reenviás el mismo key)
$mosend->messages->send([...], ['idempotencyKey' => 'order-42']);Listá y paginá
Cada listado tiene list() (una página) e iterate() (un Generator que recorre todas las páginas por vos).
// Recorrer TODAS las conversaciones abiertas
foreach ($mosend->conversations->iterate(['status' => 'open']) as $conv) {
echo $conv['id'], PHP_EOL;
}
// Contactos (paginación por página, manejada internamente)
foreach ($mosend->contacts->iterate(['q' => 'juan']) as $contact) {
echo $contact['waId'], ' ', $contact['name'] ?? '', PHP_EOL;
}
// Una sola página
$page = $mosend->conversations->list(['status' => 'open', 'take' => 50]);
// $page['data'], $page['endCursor'], $page['hasNextPage']Manejá errores tipados
Jerarquía de excepciones: MosendApiException y subclases por código HTTP (MosendAuthException, MosendRateLimitException, …), MosendNetworkException y MosendValidationException.
use Mosend\Exception\MosendRateLimitException;
use Mosend\Exception\MosendApiException;
use Mosend\Exception\MosendNetworkException;
try {
$mosend->messages->send([/* ... */]);
} catch (MosendRateLimitException $e) {
error_log('rate limit; reintentar en ' . $e->getRetryAfterSec() . 's');
} catch (MosendApiException $e) {
// 4xx/5xx; errores de Meta traen getMetaCode()/getMetaSubcode()
error_log($e->getStatus() . ' ' . $e->getMessage() . ' meta=' . $e->getMetaCode());
} catch (MosendNetworkException $e) {
error_log('falló la red/timeout: ' . $e->getMessage());
}Verificá webhooks entrantes
Validá la firma HMAC sobre el body crudo antes de procesar. parseEvent valida y devuelve el evento como array.
<?php
use Mosend\Webhooks\WebhookVerifier;
use Mosend\Exception\MosendWebhookSignatureException;
$raw = file_get_contents('php://input'); // body CRUDO
$sig = $_SERVER['HTTP_X_MOSEND_SIGNATURE'] ?? null;
try {
$event = WebhookVerifier::parseEvent($raw, $sig, getenv('MOSEND_WEBHOOK_SECRET'));
// $event['event'] => 'message.new' | 'message.status' | ...
// deduplicá por $event['deliveryId'] (puede reintentarse)
http_response_code(200);
} catch (MosendWebhookSignatureException $e) {
http_response_code(401);
}Detalles del payload y eventos en webhooks salientes.
El SDK cubre los 57 módulos. Cualquier endpoint de la referencia (ej. /api/broadcasts) tiene su método equivalente: $mosend->broadcasts->create([...]), ->send($id), etc.