Documentación para desarrolladores
Documentación para desarrolladores

Integra Chat33
con tu stack.

Píxel de seguimiento, eventos de webhook, postbacks de instalación de MMP y seguimiento de ingresos. Todo lo que necesitas para conectar Chat33 a tu sitio web o tu app.

Primeros pasos

Para usar las integraciones para desarrolladores de Chat33 necesitas un token de MMP. Lo encuentras en tu panel, en Configuración → Integraciones.

1. Obtén tu token

Ve a Configuración → Integraciones → Token de MMP. Haz clic en "Generar token" si aún no tienes uno.

2. Elige tu integración

Sitio web / app web

Usa el píxel de seguimiento para medir vistas de página, registros y compras.

App móvil

Usa los postbacks de MMP (AppsFlyer, Adjust, Branch, Tenjin, Singular) para medir instalaciones.

Píxel de seguimiento

Registra eventos del sitio web y atribúyelos a conversaciones de DM

Instalación

Agrega esta etiqueta script a tu sitio web dentro de <head> o antes de </body>. Reemplaza YOUR_PIXEL_KEY con la clave del píxel de Configuración, Integraciones. Nunca uses aquí tu token de MMP: es secreto.

html
<script src="https://chat33.io/pixel.js" data-token="YOUR_PIXEL_KEY"></script>

Registrar eventos

El píxel registra las vistas de página automáticamente. Para registrar eventos personalizados (compras, registros, etc.), usa el método chat33.track():

javascript
// Track a purchase with value
chat33.track("purchase", {
  value: 49.99,
  currency: "USD",
  product: "Pro Plan"
});

// Track a signup
chat33.track("signup");

// Track a lead
chat33.track("lead", { source: "landing_page" });

// Track any custom event
chat33.track("tutorial_complete", { step: 5 });

Cómo funciona

Enlaces inteligentes

Chat33 agrega ?cid=xxx a los enlaces con seguimiento en los DMs

Atribución automática

El píxel lee el ID del contacto en la URL y lo conserva entre páginas

Etiquetado automático

Eventos como 'purchase' etiquetan automáticamente al contacto en tu CRM

Referencia de la API

MétodoParámetrosDescripción
chat33.track(event, metadata?)event: string, metadata: objectEnviar un evento personalizado
chat33.identify(contactId)contactId: stringDefinir manualmente el ID del contacto
chat33.getContactId()—Devuelve el ID del contacto actual

API de eventos de webhook

Envía eventos personalizados desde tu servidor a Chat33

Endpoint

http
POST https://chat33.io/api/webhooks/events?token=YOUR_TOKEN

Content-Type: application/json

{
  "event": "purchase",
  "contactId": "cm1abc123...",
  "value": 49.99,
  "currency": "USD",
  "metadata": {
    "product": "Pro Plan",
    "source": "checkout"
  }
}

Cuerpo de la solicitud

CampoTipoObligatorioDescripción
eventstringSíNombre del evento (purchase, signup, lead, etc.)
contactIdstringNoID de contacto de Chat33 para la atribución
valuenumberNoValor monetario del evento
currencystringNoCódigo de moneda (USD, EUR, etc.)
metadataobjectNoCualquier dato adicional

Ejemplos

bash
# cURL
curl -X POST "https://chat33.io/api/webhooks/events?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"event":"purchase","value":29.99,"currency":"USD"}'
javascript
// Node.js / fetch
await fetch("https://chat33.io/api/webhooks/events?token=YOUR_TOKEN", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    event: "purchase",
    contactId: "cm1abc123...",
    value: 29.99,
    currency: "USD",
  }),
});

Límite de frecuencia: 100 eventos por minuto por token. Los eventos se guardan como eventos de estadísticas y los contactos se etiquetan automáticamente según el nombre del evento (por ejemplo, "purchase" → etiqueta "Purchased").

API de publicación en redes

Programa y publica contenido en Instagram, Facebook, TikTok, YouTube, X (Twitter), LinkedIn, Bluesky y Threads

Autenticación

Genera una clave de API en Configuración → Claves de API. Inclúyela como encabezado x-api-key en todas las solicitudes.

bash
# All API requests require this header:
x-api-key: sk_live_your_api_key_here

Plataformas compatibles

Instagram

Fotos, reels, carruseles (mediante la IG Graph API)

Facebook

Texto, fotos y videos con programación nativa

TikTok

Videos y publicaciones de fotos con la Content Posting API

YouTube

Subida de videos con publicación programada nativa

X (Twitter)

Texto, fotos, video e hilos con la X API v2 (usa créditos)

LinkedIn

Texto, tarjetas de enlace, hasta 9 imágenes o un video, publicados en el perfil del propio miembro

Bluesky

Texto, tarjetas de enlace, hasta 4 imágenes o un video, mediante el AT Protocol

Threads

Texto, imágenes, video, carruseles de hasta 20, encuestas y etiquetas de tema

Crear una publicación

bash
curl -X POST "https://chat33.io/api/v1/posts" \
  -H "x-api-key: sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "accountIds": ["channel_id_here"],
    "text": "Check out our new product! #launch",
    "mediaUrls": ["https://your-blob-url.com/image.jpg"],
    "mediaType": "image"
  }'

Opciones por plataforma (platformConfig)

Los ajustes de cada plataforma van bajo una clave con el nombre de la plataforma. Solo se leen las claves de las plataformas incluidas en accountIds, así que una misma solicitud puede llevar opciones para varias a la vez. Todas las plataformas aceptan un reemplazo de text, de modo que una misma publicación puede leerse distinto en cada red.

Dos comportamientos que conviene conocer antes de tu primera llamada: youtube.madeForKids se rechaza si falta, en lugar de usar un valor por defecto, porque YouTube exige la declaración en cada subida. Y una publicación de TikTok sin objeto consent queda en los borradores de la cuenta en lugar de publicarse.

json
{
  "instagram": {
    "text": "...",                     // caption for this platform only
    "firstComment": "#tags #here"      // posted right after publish
  },
  "facebook": {
    "text": "..."
  },
  "linkedin": {
    "text": "...",
    "visibility": "PUBLIC",            // or "CONNECTIONS" (1st-degree only)
    "articleUrl": "https://...",       // link card, ignored when the post has media
    "mediaTitle": "...",
    "mediaDescription": "..."
  },
  "youtube": {
    "madeForKids": false,              // REQUIRED for any YouTube channel
    "privacyStatus": "public",         // or "unlisted" / "private"
    "title": "...",
    "description": "...",
    "tags": ["one", "two"],            // up to 30
    "categoryId": "22",                // default: People & Blogs
    "notifySubscribers": true
  },
  "x": {
    "text": "...",
    "thread": true,                    // split text into a thread
    "splitOn": "---",
    "replyControl": "everyone"         // or "following" / "mentionedUsers"
  },
  "tiktok": {
    "text": "...",
    "consent": {
      "publishMode": "DIRECT_POST",    // or "MEDIA_UPLOAD" (drafts)
      "privacyLevel": "SELF_ONLY",     // required for DIRECT_POST
      "disableComment": false,
      "disableDuet": false,
      "disableStitch": false,
      "aiGenerated": false
    }
  }
}

Detalles de LinkedIn

  • Las publicaciones se hacen en el perfil propio del miembro autenticado. Las páginas de empresa requieren la Community Management API de LinkedIn, que es una revisión aparte y aún no es compatible.
  • Una publicación lleva hasta 9 imágenes o 1 video, nunca ambos. Si se excede el límite se rechaza, no se recorta en silencio.
  • El texto tiene un tope de 3,000 caracteres. Video de 200 MB, imágenes de 10 MB cada una.
  • articleUrl solo aplica a publicaciones de texto. Si hay multimedia, esta tiene prioridad y el enlace se ignora.
  • El acceso vence a los 60 días y LinkedIn no emite token de actualización, así que la cuenta debe reconectarse manualmente. Al vencer, publicar devuelve un error claro de reconexión.
  • LinkedIn limita a 150 solicitudes de API por miembro al día, y cada imagen cuesta dos llamadas extra, así que el tope es de solicitudes, no de publicaciones.

Programar una publicación

bash
curl -X POST "https://chat33.io/api/v1/posts" \
  -H "x-api-key: sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "accountIds": ["ig_channel_id", "fb_channel_id"],
    "text": "Coming soon!",
    "mediaUrls": ["https://your-blob-url.com/video.mp4"],
    "mediaType": "video",
    "scheduledAt": "2026-04-15T14:00:00Z",
    "callbackUrl": "https://your-server.com/webhook"
  }'

Subir archivos multimedia

La subida multipart tiene un tope estricto de 4.5 MB. Los cuerpos más grandes se rechazan con 413 FUNCTION_PAYLOAD_TOO_LARGE antes de llegar a la API. Para algo más grande, importa desde una URL pública u obtén una URL prefirmada y sube directo al almacenamiento.

bash
# Small files (< 4.5MB): multipart upload
curl -X POST "https://chat33.io/api/v1/media/upload" \
  -H "x-api-key: sk_live_your_key" \
  -F "file=@photo.jpg"

# Large files, already on a public URL: URL ingestion (up to 4GB)
curl -X POST "https://chat33.io/api/v1/media/upload" \
  -H "x-api-key: sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/large-video.mp4", "filename": "video.mp4"}'

# Large LOCAL file: presigned direct upload (up to 500MB per PUT)
# 1. ask for an upload URL
curl -X POST "https://chat33.io/api/v1/media/upload-url" \
  -H "x-api-key: sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"filename": "video.mp4", "contentType": "video/mp4", "size": 16352652}'
# -> {"uploadUrl": "https://...", "headers": {"content-type": "video/mp4"}, ...}

# 2. PUT the bytes straight to storage (never touches the API)
curl -X PUT "<uploadUrl>" \
  -H "Content-Type: video/mp4" \
  --data-binary @video.mp4
# -> {"url": "https://....public.blob.vercel-storage.com/...", ...}
#    pass that url in mediaUrls when creating the post

Referencia de la API

MétodoEndpointDescripción
POST
/api/v1/postsCrear y poner en cola publicaciones
GET
/api/v1/postsListar publicaciones (paginadas, filtrables)
GET
/api/v1/posts/:idObtener los detalles de una publicación
PATCH
/api/v1/posts/:idEditar una publicación en borrador o en cola, o cancelarla
DELETE
/api/v1/posts/:idEliminar un borrador o cancelar una publicación
POST
/api/v1/posts/:id/duplicateClonar una publicación
POST
/api/v1/media/uploadSubir multimedia (archivo de menos de 4.5 MB o URL pública)
POST
/api/v1/media/upload-urlURL prefirmada para subir directamente un archivo local grande

Cuerpo de la solicitud: crear publicación

CampoTipoObligatorioDescripción
accountIdsstring[]SíIDs de los canales donde publicar (máximo 10)
textstringNoTexto o descripción de la publicación
mediaUrlsstring[]NoURL de los archivos multimedia (subidos con /media/upload)
mediaTypestringNoimage, video, reel o carousel
scheduledAtstringNoFecha y hora ISO 8601 para programar
callbackUrlstringNoURL de webhook para las notificaciones de publicación
platformConfigobjectNoOpciones específicas de cada plataforma (título de YouTube, privacidad, etc.)
coverImageUrlstringNoImagen de portada o miniatura de los videos

Límites de frecuencia: 50 publicaciones por minuto por organización. Límites diarios por canal: Instagram (25), Facebook (50), TikTok (20), YouTube (100), X (300).

Callbacks: Cuando una publicación se publica o falla, se envía una solicitud POST a tu callbackUrl con el ID de la publicación, el estado y la URL de la publicación externa.

Especificación OpenAPI 3.1

Explorador interactivo de endpoints y JSON legible por máquinas para generación de código, n8n y MCP.

Documentación para IA · llms.txt

Documentación en Markdown para Claude, ChatGPT y Cursor. Cópiala y pégala para que la IA genere llamadas correctas a la API.

Nodo de n8n · nodo de la comunidad

Nodo oficial de la comunidad de n8n. Lista cuentas, crea y programa publicaciones y sube multimedia desde cualquier flujo de n8n. Instala n8n-nodes-chat33 desde Settings → Community Nodes.

Servidor MCP

Conecta Claude, Cursor o cualquier cliente MCP a Chat33. Publica, consulta estadísticas y crea automatizaciones de DM con lenguaje natural.

Conectar las cuentas de tus usuarios

Deja que tus propios usuarios conecten sus cuentas de Instagram, Facebook, TikTok, YouTube, X, LinkedIn, Bluesky o Threads a través de Chat33 y publica por ellos mediante la API

La API de conexión para desarrolladores emite un enlace de un solo uso que lleva a uno de tus usuarios a la pantalla de consentimiento OAuth de la propia plataforma, en tu nombre, sin tocar nunca su contraseña. Cuando aprueba, la cuenta conectada se comporta como cualquier otra en la API de publicación en redes de arriba: publicas en ella, lees sus estadísticas donde la plataforma las ofrece y la desconectas, siempre limitada al usuario final ("perfil") al que pertenece.

Cómo funciona

  1. Crea un perfil para el usuario (POST /v1/profiles) o reutiliza uno, identificado por tu propio externalId.
  2. Solicita un enlace de conexión para ese perfil y una plataforma (POST /v1/connect). Es válido una sola vez, durante 15 minutos.
  3. Envía al usuario a la url devuelta. Aprueba en la pantalla de la propia plataforma, que nombra a Chat33 como la app que pide acceso: es lo esperado y nadie ve su contraseña.
  4. Vuelve a tu redirectUrl con status, profileId y accountIds (o status=error&code=… si canceló o algo salió mal; un consentimiento cancelado no gasta el enlace).

Crear un perfil

bash
curl -X POST "https://chat33.io/api/v1/profiles" \
  -H "x-api-key: sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Acme Fitness",
    "externalId": "user_482"
  }'

Crear un enlace de conexión

bash
curl -X POST "https://chat33.io/api/v1/connect" \
  -H "x-api-key: sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "profileId": "prof_abc123",
    "platform": "instagram",
    "redirectUrl": "https://yourapp.com/oauth/done",
    "skipIntro": false
  }'
# -> {"url": "https://chat33.io/connect/...", "expiresAt": "...", "platform": "instagram", "profileId": "prof_abc123"}
# send your user to that url
# skipIntro: true returns a url that goes straight to the platform's consent screen

Lo que ve tu usuario

Una página alojada por Chat33 que nombra tu app, seguida de la pantalla de inicio de sesión y consentimiento de la propia plataforma, que nombra a Chat33 como la app que pide acceso, no a la tuya. Así funciona OAuth por debajo y es lo esperado. Puede revocar el acceso desde la propia plataforma en cualquier momento.

Para omitir la página de introducción y enviar a tu usuario directo a la pantalla de consentimiento de la plataforma, pasa "skipIntro": true al crear el enlace. El enlace pasa a ser una redirección inmediata: el mismo token, los mismos 15 minutos de vigencia, el mismo regreso a tu redirectUrl. Si la omites, avísale a tu usuario en tu propia pantalla que la página de consentimiento nombrará a Chat33, y prefiere enviarlo con un clic en un botón en lugar de un enlace en un correo: los clientes de correo y las apps de chat precargan los enlaces, y la precarga de un enlace con skipIntro abre el diálogo de la plataforma en el escáner (no gasta el token).

$1 por cupo de conexión cada 30 días. Un cupo se compra con tus créditos prepagados en el momento en que se conecta una cuenta (o por adelantado con Comprar cupos) y se renueva cada 30 días mientras la cuenta siga conectada. Sin prorrateo ni reembolsos, pero el cupo que se libera al desconectar sigue siendo tuyo hasta que vence y la siguiente cuenta que conectes lo toma. Si tu saldo no cubre una renovación, la cuenta sigue funcionando 7 días mientras el monto figura como pendiente; después se pausa hasta que recargues. Las cuentas en pausa no se cobran.

Reglas

  • Una cuenta real existe una sola vez en todo Chat33: no se puede conectar una segunda vez, ni por ti ni por nadie más, ya sea mediante la API o desde el panel de Chat33.
  • Las cuentas conectadas por la API nunca cuentan para el límite de canales del plan de tu organización.
  • Chat33 no guarda ni automatiza los mensajes y comentarios entrantes de estas cuentas (la v1 es solo de publicación).
  • Facebook conecta todas las páginas a las que el usuario da acceso; cada página es su propia cuenta y su propio cupo.
  • Instagram se conecta mediante Instagram Login, para cuentas de empresa o de creador.
  • Las publicaciones en X desde cuentas conectadas también descuentan de tu saldo de créditos, igual que las de las cuentas de tu propio panel.

Cuentas en pausa

Una cuenta cuyo cupo estuvo sin pagar durante 7 días se pausa: publicar devuelve 402 account_paused con los accountIds afectados; se reanuda automáticamente cuando recargas. POST /v1/posts, POST /v1/posts/validate y POST /v1/posts/:id/duplicate lo verifican de entrada, antes de poner nada en cola.

json
// 402
{
  "error": "ACCOUNT_PAUSED",
  "code": "account_paused",
  "message": "These accounts are paused until outstanding connection charges are paid. Top up credits.",
  "accountIds": ["chan_abc123"]
}

Referencia de la API

MétodoEndpointDescripción
GET
/api/v1/profilesListar a tus usuarios finales
POST
/api/v1/profilesCrear (o encontrar, por externalId) un usuario final
GET
/api/v1/profiles/:idObtener un perfil y sus cuentas
PATCH
/api/v1/profiles/:idActualizar el nombre o el externalId de un perfil
DELETE
/api/v1/profiles/:idDesconectar sus cuentas y eliminar el perfil
POST
/api/v1/connectCrear un enlace de conexión de un solo uso para un perfil
GET
/api/v1/accounts?source=apiListar todas las cuentas que conectaron tus usuarios, en todos los perfiles
GET
/api/v1/accounts?profileId=Listar las cuentas conectadas de un perfil
DELETE
/api/v1/accounts/:idDesconectar una cuenta
GET
/api/v1/posts?profileId=Listar las publicaciones de un perfil
GET
/api/v1/analytics/posts?profileId=Estadísticas agregadas de las publicaciones de un perfil
GET
/api/v1/billing/connectionsSaldo de créditos, pendiente e historial de cupos
POST
/api/v1/billing/slotsComprar cupos de conexión por adelantado

Eres responsable del contenido que publiques a través de las cuentas de tus usuarios y de contar con su consentimiento. Chat33 puede desactivar las claves de API que pongan en riesgo sus apps de plataforma.

Activa el permiso

Obtén el permiso connect:write: crea una clave en Configuración → Claves de API y marca Conectar las cuentas de tus usuarios. Viene desactivado por defecto en todas las claves.

Postbacks de instalación de MMP

Mide las instalaciones de la app desde AppsFlyer, Adjust, Branch, Tenjin o Singular

URL de postback

Configura esta URL en el panel de tu MMP como endpoint de postback. Reemplaza YOUR_SECRET con tu secreto de webhook de MMP de Configuración.

text
https://chat33.io/api/webhooks/mmp?secret=YOUR_SECRET

MMP compatibles

AppsFlyer

Lee event_type, app_id, appsflyer_id, af_sub1/af_sub2 para la atribución

Adjust

Lee activity_kind (install, rejected_install, event), label y adid del callback, por GET o POST. Para los ingresos de compras agrega el marcador revenue_float (no revenue, que está en centavos) y currency

Branch

Lee los eventos de webhook (INSTALL, PURCHASE), los IDs de dispositivo en user_data y el creador y la publicación que Chat33 agrega a los datos del enlace

Tenjin

Lee campaign_id, site_id para la atribución

Singular

Lee network, source para la atribución

Configuración del enlace inteligente

Usa el paso Enviar un enlace de descarga de la app en tus automatizaciones. Envía a los usuarios de iPhone al enlace de la App Store y a los de Android al de Google Play, y cuenta cada toque en tu panel, por automatización. Pega el enlace de seguimiento de tu MMP (OneLink, Adjust, Branch, Singular o Tenjin) con un nombre de campaña por publicación, y tu MMP reporta las instalaciones por publicación. En las campañas con creadores de Chat33, los IDs del contacto y del creador se agregan al enlace automáticamente.

1

Agrega el paso de descarga

En tu automatización, agrega Enviar un enlace de descarga de la app con los enlaces de seguimiento de tu MMP

2

Configura el MMP

Configura la URL de postback en AppsFlyer, Adjust, Branch (un webhook para el evento Install), Tenjin o Singular

3

Mide las instalaciones

Toques por automatización en Chat33, instalaciones por campaña en tu MMP y totales de instalaciones en tu panel

¿Sin MMP? Usa los enlaces de campaña de las tiendas

Apple y Google cuentan las instalaciones por campaña sin costo. Pon un nombre de campaña en cada enlace de tienda, uno por publicación, y pega los enlaces en el paso de descarga. Las instalaciones aparecen en App Store Connect (App Analytics, Sources, Campaigns) y en Play Console (informes de adquisición por campaña UTM), aproximadamente un día después y de forma agregada.

App Store: genéralo en App Store Connect o constrúyelo

text
https://apps.apple.com/app/apple-store/id<APP_ID>?pt=<PROVIDER_TOKEN>&ct=<campaign_name>&mt=8

Google Play: las etiquetas UTM van dentro de referrer, codificadas como URL

text
https://play.google.com/store/apps/details?id=<PACKAGE>&referrer=utm_source%3Dchat33%26utm_medium%3Ddm%26utm_campaign%3D<campaign_name>

Paso a paso: seguimiento gratuito de instalaciones sin MMP.

Generador de enlaces de campaña UTM

Genera URL con parámetros UTM para Google Analytics

Consejo: Usa enlaces UTM en los mensajes de tus automatizaciones de Chat33. Combinados con el píxel de seguimiento, verás el recorrido completo desde el DM hasta la conversión en Google Analytics.

¿Necesitas ayuda con la integración?

Nuestro equipo puede ayudarte a configurar el seguimiento y a sacarle el máximo partido a las herramientas para desarrolladores de Chat33.