API de envío
Envía mensajes de WhatsApp, Facebook e Instagram desde tu propio servidor a través de SocialHook. Un único endpoint firmado cubre las tres plataformas: tu código no cambia cuando agregas una nueva plataforma.
Cuándo usarlo
{ "reply": "..." } para enviar automáticamente un mensaje de vuelta sin llamar a este endpoint. Consulta Respuesta automática más abajo.1. Obtén una clave API
Abre Clave API en tu panel y haz clic en Generar. Verás la clave completa una sola vez: cópiala ahora y guárdala en un lugar seguro (por ejemplo, tu gestor de secretos). Si la pierdes, genera una nueva; la anterior deja de funcionar de inmediato.
Las claves comienzan con sk_live_ seguido de 64 caracteres hexadecimales. Trátala como una contraseña: nunca la subas a git, nunca la expongas en código del navegador.
2. Endpoint
POST https://api.socialhook.io/api/v1/outbound/<your_user_id>/send Content-Type: application/json
Tu user_id se muestra en la URL de la página de la clave API. La ruta es de alcance por usuario a propósito, de modo que una clave filtrada solo puede afectar a una cuenta.
3. Autenticación
Elige el método que mejor se adapte a tu configuración. Ambos funcionan con el mismo endpoint.
Método A — Clave simple (n8n, Make, Zapier, herramientas no-code)
Agrega una única cabecera. No se requiere firma.
X-Api-Key: <your_api_key>
# Method: POST
# URL: https://api.socialhook.io/api/v1/outbound/<your_user_id>/send
# Header: X-Api-Key → sk_live_…
# Body (JSON):
{
"platform": "whatsapp",
"to": "447911123456",
"message_text": "Hello from n8n!"
}Método B — Solicitud firmada (HMAC-SHA256, servidores propios)
Construye la firma aplicando HMAC-SHA256 a <timestamp>.<raw_body> con tu clave API y luego envía el digest hexadecimal en minúsculas en la cabecera X-Socialhook-Signature con el prefijo sha256=. Se rechazan las solicitudes con marcas de tiempo que difieran más de 5 minutos respecto a la hora del servidor.
X-Socialhook-Timestamp: <unix_seconds> X-Socialhook-Signature: sha256=<hmac_hex>
const crypto = require('crypto');
const API_KEY = process.env.SOCIALHOOK_API_KEY; // sk_live_…
const USER_ID = process.env.SOCIALHOOK_USER_ID; // shown on the API key page
const body = JSON.stringify({
platform: 'whatsapp',
to: '447911123456',
message_text: 'Hello from your SocialHook integration!',
});
const ts = Math.floor(Date.now() / 1000).toString();
const sig = crypto
.createHmac('sha256', API_KEY)
.update(`${ts}.${body}`)
.digest('hex');
const res = await fetch(
`https://api.socialhook.io/api/v1/outbound/${USER_ID}/send`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Socialhook-Timestamp': ts,
'X-Socialhook-Signature': `sha256=${sig}`,
},
body,
}
);
if (!res.ok) throw new Error(await res.text());# Drop your real API_KEY and USER_ID in here
TS=$(date +%s)
BODY='{"platform":"whatsapp","to":"447911123456","message_text":"Hello!"}'
SIG=$(printf "%s.%s" "$TS" "$BODY" | openssl dgst -sha256 -hmac "$API_KEY" | awk '{print $2}')
curl -X POST https://api.socialhook.io/api/v1/outbound/$USER_ID/send \
-H "Content-Type: application/json" \
-H "X-Socialhook-Timestamp: $TS" \
-H "X-Socialhook-Signature: sha256=$SIG" \
-d "$BODY"4. Cuerpo de la solicitud por plataforma
{
"platform": "whatsapp",
"to": "447911123456",
"message_text": "Hello from your integration!"
}"to" es el número de teléfono del destinatario en formato E.164 (sin el signo + inicial).
{
"platform": "facebook",
"to": "<recipient_psid>",
"page_id": "<your_facebook_page_id>",
"message_text": "Hi from SocialHook"
}"to" es el id de usuario por página (PSID). "page_id" es obligatorio para saber desde qué página enviar.
{
"platform": "instagram",
"to": "<recipient_psid>",
"page_id": "<your_facebook_page_id>",
"message_text": "Hey from SocialHook"
}"to" es el id de usuario por cuenta de IG. "page_id" es el id de la página de Facebook vinculada (Instagram se apoya en el OAuth de FB).
5. Códigos de respuesta
| Código | Significado | Qué hacer |
|---|---|---|
200 | Enviado | Mensaje aceptado por la plataforma; aparece en el hilo de la conversación. |
400 | Solicitud incorrecta | Campo faltante o inválido. Revisa platform/to/message_text/page_id. |
401 | No autorizado | X-Api-Key falta o es inválida, o X-Socialhook-Signature no coincide. Recalcúlala con el cuerpo crudo exacto. |
403 | Ventana expirada | Ventana de mensajería de 24 horas cerrada (FB / IG / WA). Espera un mensaje entrante antes de responder. |
408 | Marca de tiempo demasiado antigua | X-Socialhook-Timestamp difiere más de 5 minutos respecto a la hora del servidor. Reenvía con una marca de tiempo fresca. |
429 | Límite de velocidad | Demasiadas solicitudes. Espera y vuelve a intentarlo. |
Respuesta automática (sin llamar al endpoint)
Si tu única necesidad de envío es responder a los mensajes entrantes, no necesitas llamar a este endpoint en absoluto. Cuando SocialHook te entrega un webhook, tu servidor puede responder con una de estas opciones:
// Single reply
{ "reply": "Thanks — got your message!" }
// Or multiple in order
{ "replies": ["Thanks!", "We'll get back to you within an hour."] }SocialHook envía cada respuesta en la plataforma correcta automáticamente y la registra en el hilo de la conversación. Los fallos en las respuestas no bloquean la confirmación de entrega: tu webhook sigue marcándose como DELIVERED.