Presiona Enter.
Obtén tus datos.
API REST /api/v1, 53 ámbitos, 239 puntos finales, 11 eventos de webhook y una API JS para el widget. Chats, contactos, inteligencia artificial, base de conocimientos, tickets y facturación: cualquier cosa que haga el panel, su código también puede hacerlo.
# presione Enter o la marca a la derecha $ curl -H "Authorization: Bearer sb_••••" \ https://smartbtn.me/api/v1/chats?limit=1
Inicio rápido
Tres pasos desde cero hasta la primera respuesta. Cada solicitud está vinculada a un widget y se autentica con un token de portador.
- Emitir una fichaPanel → Tokens de API: un nombre, una caducidad opcional y los alcances que necesita. Un token pertenece exactamente a un widget. El token de texto plano se muestra una vez; Smartbtn almacena sólo un hash unidireccional, por lo que un token perdido no se puede recuperar, sólo se puede revocar y volver a emitir.
- Activar la API del widgetEn la configuración del widget, active «Permitir API de widget (JS y REST)». Emitir un token no activa este interruptor por usted.
- Enviar la primera solicitudEl token solo va al encabezado
Autorización, nunca a la URL.
# listar los chats del widget curl -H "Authorization: Bearer $SMARTBTN_TOKEN" \ https://smartbtn.me/api/v1/chats
// 200 OK · paginación del cursor { "data": [ { "id": 48211, "status": "open", "last_message_at": "2026-10-17T09:41:12+03:00" }, … ], "next_cursor": "eyJpZCI6NDgyMTB9" // null — en la última página }
https://smartbtn.me/api/v1 es el punto final API principal para todos los datos del proyecto. Envíe siempre solicitudes a través de HTTPS y nunca reenvíe el token en redirecciones.401 o 403 con un cuerpo RFC‑7807 application/problem+json; consulta Errores.Autenticación
Tres caminos, según quién llame a quién. El acceso es denegado de forma predeterminada: sin alcance, sin llamada.
Cada solicitud lleva Autorización: Portador . En el servidor, el token se resuelve en un widget y sus alcances.
Las solicitudes salientes se firman con un secreto por inquilino: X‑Smartbtn‑Signature. Se puede agregar una credencial de portador adicional si su lado la necesita.
POST /v1/ai/replies utiliza su propio marco firmado, anclado a su operador de IA y widget y codificado por un causation_id duradero.
El cambio que la gente olvida
«Permitir API de widget (JS y REST)» en la configuración del widget abre tanto la API REST como la API JS del widget. La emisión de un token no lo habilita. Los alcances de una clave existente se pueden editar en el panel (tokens de API → clave → Editar alcances) sin volver a emitirla: las integraciones siguen funcionando.
Preajustes
| Preestablecido | Alcances | cuando |
|---|---|---|
| configuración de IA 9 | widget:read · widget:write · ai:read · ai:write · ai:apply · kb:read · kb:write · files:write · stats:read | Tu aplicación de IA configura el widget: asistente, base de conocimientos, textos. Reemplaza toda la selección de alcance. |
| Sólo lectura (conjunto de ejemplo) | chats:read · messages:read · contacts:read · stats:read | Dashboards, BI, exportaciones. |
| Puente de soporte técnico (conjunto de ejemplos) | chats:read · messages:read · messages:write · webhooks:write · support:read | Refleje diálogos y tickets en su CRM. |
ai:credentials:write solo cuando el propietario autorice la configuración de la clave del proveedor. No se necesitan derechos de cuenta, facturación ni de socio para configurar la IA. La clave se muestra una vez; revocarla cuando finalice la configuración.Alcances
53 alcances de ruta, más uno condicional y otro reservado. Una solicitud tiene éxito solo si el token contiene el alcance de la ruta (o una alternativa enumerada).
| Alcance | Subvenciones |
|---|---|
| chats · 2 | |
| chats:read | Leer chats y sus metadatos |
| chats:write | Cerrar un chat, solicitar una calificación, transferir, reclamar, adjuntar o desasociar un agente |
| messages · 2 | |
| messages:read | Leer el historial de mensajes de un chat |
| messages:write | Envía mensajes, escribe indicadores y lee recibos como agente. |
| contacts · 2 | |
| contacts:read | Leer contactos |
| contacts:write | Actualizar campos y atributos de contacto |
| agents · 3 | |
| agents:read | Leer agentes y su presencia. |
| agents:writesensible | Invitar, actualizar, suspender, restaurar o eliminar agentes; un invitado ve todos los chats del widget |
| agents:events:read | Leer el registro de eventos de un agente y las métricas por agente |
| tags · 2 | |
| tags:read | Leer etiquetas |
| tags:write | Adjuntar etiquetas a un contacto |
| files · 2 | |
| files:read | Descargar un archivo cargado |
| files:write | Sube un nuevo archivo |
| stats · 1 | |
| stats:read | Leer estadísticas agregadas de chat, mensajes y calificaciones |
| channels · 3 | |
| channels:read | Leer el estado en línea de un canal personalizado |
| channels:write | Entregar un mensaje entrante en un canal personalizado |
| channels:register | Registrar un nuevo canal personalizado (solo aplicaciones instaladas) |
| webhooks · 2 | |
| webhooks:read | Listar suscripciones a webhooks |
| webhooks:write | Crear, eliminar o volver a enviar una suscripción |
| quick_phrases · 2 | |
| quick_phrases:read | Leer las frases breves de un agente |
| quick_phrases:write | Crear, editar o eliminar frases rápidas |
| ratings · 1 | |
| ratings:read | Lea las valoraciones de los visitantes y qué agente puntúa cada uno. |
| responder · 2 | |
| responder:injectsensible | Inyecte una respuesta en un chat en vivo como un operador o bot externo de IA |
| responder:escalatecondicional | Para POST /v1/ai/respuestas: transferencia dirigida a la persona que llama mediante escalate=true |
| widget · 2 | |
| widget:read | Leer la apariencia, el comportamiento y la configuración de inserción del widget |
| widget:write | Actualice la configuración del widget y borre el caché del widget |
| departments · 2 | |
| departments:read | Leer departamentos, sus agentes y horarios. |
| departments:write | Crear, actualizar o eliminar departamentos y horarios. |
| messengers · 2 | |
| messengers:read | Leer qué mensajeros están conectados (nunca credenciales) |
| messengers:writesensible | Conectar o desconectar un mensajero; escribe las credenciales del proveedor |
| ai · 4 | |
| ai:read | Lea los asistentes de IA, su configuración y alertas |
| ai:write | Cree y actualice asistentes, configuraciones de IA y operadores de IA, persona y aviso incluidos |
| ai:credentials:writesensible | Almacenar credenciales de proveedores de LLM de terceros (BYOK) |
| ai:apply | Aprobar una mejora que reescribe la personalidad de un asistente en vivo |
| kb · 2 | |
| kb:read | Leer reglas de la base de conocimientos y fuentes ingeridas |
| kb:write | Crear, actualizar o eliminar reglas y fuentes de KB |
| transcripts · 1 | |
| transcripts:read | Exportar una transcripción de chat |
| account · 2 | |
| account:read | Lea el perfil de la cuenta y todas sus entidades legales. |
| account:write | Actualiza solo el nombre, apellido y teléfono de la cuenta. |
| billing · 2 | |
| billing:read | Leer los registros de facturación y las entidades legales del widget. |
| billing:write | Crear, actualizar, eliminar personas jurídicas; no emite facturas, no mueve dinero |
| partners · 2 | |
| partners:read | Leer datos de socios y referencias |
| partners:withdrawreservado | Reservado: ninguna operación de pago lo utiliza hoy |
| support · 4 | |
| support:read | Leer tickets, chats activos, sus mensajes y acciones propias auditadas. |
| support:replysensible | Responder a un cliente como operador de soporte |
| support:write | Reclamar o liberar un chat, cerrar sin respuesta, volver a abrir |
| support:tickets:close | Sólo cerrar un ticket, nada más |
| marketing · 2 | |
| marketing:read | Leer campañas de marketing: banners, ventanas emergentes, correo electrónico. |
| marketing:write | Cree y edite campañas, cambie el estado, inicie un envío de correo electrónico |
| broadcasts · 2 | |
| broadcasts:read | Leer transmisiones de mensajería (WhatsApp, Telegram, Messenger, Viber, VK, MAX) |
| broadcasts:write | Crear, editar e iniciar una transmisión |
| problems · 2 | |
| problems:read | Leer grupos y configuraciones de problemas de clientes |
| problems:write | Cambiar la configuración y el estado del clúster: nuevo, en curso, resuelto, recurrente |
| invitations · 2 | |
| invitations:read | Leer reglas de invitación, variantes A/B, plantillas y embudo |
| invitations:write | Crear, editar, habilitar o eliminar reglas y plantillas |
Puntos finales
Toda la superficie pública en una sola lista. Filtre por recurso, busque por ruta, haga clic en una fila para copiar un rizo listo.
ai Asistentes, operadores, llaves, aprendizaje, mercado.54
chats Diálogos, mensajes, transferencias, valoraciones.18
kb Base de conocimientos: reglas, rastreador, archivos, búsqueda16
agents Agentes, invitaciones, métricas.14
messengers Mensajeros, redes sociales y canales de mercado13
billing Saldo, suscripciones, facturas, entidades.12
support Agente de soporte: tickets y chats12
widget Configuración, idioma, traducciones, máscaras, caché12
channels Canales personalizados8
external‑operators Tu bot como operador8
webhook‑subscriptions Suscripciones a webhooks8
broadcasts Transmisiones de mensajería7
departments Departamentos y horario7
invitations invitaciones inteligentes7
marketing Campañas de marketing7
partner Programa de socios7
wishes Deseos para la IA7
contacts Contactos y etiquetas5
problems Análisis de problemas del cliente4
quick‑phrases frases rapidas4
compat Compatibilidad de migración3
stats Estadísticas3
account cuenta2
files Archivos2
ratings Calificaciones1
tags Etiquetas1
v1 1
webhook‑events Catálogo de eventos1
Las rutas son relativas a https://smartbtn.me/api. Las escrituras necesitan Content‑Type: application/json y X‑Smartbtn‑Idempotency‑Key. El grupo compat es una capa de compatibilidad para equipos que se mudan desde otra plataforma de chat.
Ganchos web
Un POST JSON firmado en su URL cada vez que ocurre un evento de suscripción. Administre las suscripciones a través de /v1/webhook‑subscriptions o en el panel de control.
{
"id": "evt_01JAB3K9Q7",
"type": "ticket.created",
"data": {
"button_guid": "b_3f9c2e",
"ticket_number": 10482,
"chat_id": 48211,
"client_id": 9134,
"reason": "human_request",
"priority": "high",
"sla_hours": 4,
"source": "chat",
"created_at": "2026-10-17T10:15:00+03:00"
}
}motivo: solicitud_humana | facturación | ai_unresolved | solicitud_acción | …; prioridad: alta | normal; fuente: chat | aplicación | sitio. Lea el ticket y su cuadro de diálogo con GET /v1/support/tickets/{number}.
encabezados de entrega
| X‑Smartbtn‑Event | Tipo de evento, p. |
| X‑Smartbtn‑Signature | sha256=v1: del cuerpo sin formato. |
| X‑Smartbtn‑Idempotency‑Key | Un valor por evento, estable entre reintentos. Deduplicarlo. |
| X‑Smartbtn‑Delivery | Un valor por intento de entrega, para sus registros. |
| X‑Smartbtn‑Timestamp | Hora de envío Unix. Informativo, no firmado. |
Verificación de firma
HMAC‑SHA256 del cuerpo sin formato (bytes tal como se recibieron, antes del análisis JSON) con su secreto de punto final; comparar en tiempo constante. El secreto se muestra una vez, cuando se crea la suscripción; gírelo con POST /v1/webhook‑subscriptions/{id}/rotate‑secret.
// Node.js · Por ejemplo, el secreto es un marcador de posición. import crypto from 'node:crypto'; function verify(rawBody, header, secret) { const expected = 'sha256=v1:' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex'); const a = Buffer.from(expected), b = Buffer.from(header || ''); return a.length === b.length && crypto.timingSafeEqual(a, b); }
// PHP $expected = 'sha256=v1:' . hash_hmac('sha256', file_get_contents('php://input'), $secret); if (!hash_equals($expected, $_SERVER['HTTP_X_SMARTBTN_SIGNATURE'] ?? '')) { http_response_code(401); exit; }
Reintentos y orden
- Hasta 4 intentos (el primer envío más 3 reintentos), retroceso
min(60, 2^attempt × 5)s: aproximadamente 10, 20, 40 s. - No 2xx o un tiempo de espera cuentan como un intento fallido. Las entregas fallidas se pueden reenviar con
POST /v1/webhook‑subscriptions/{id}/redeliver: la misma clave de idempotencia, nueva identificación de entrega. - La entrega se realiza al menos una vez y no se realiza pedido. Las cargas útiles son mínimas: identificaciones, no registros completos; obtener detalles a través de la API REST.
JS API
Pase lo que ya sabe sobre el visitante directamente al agente. Solo se aceptan llamadas desde el dominio establecido en la configuración del widget.
smartbtn_widget_api.setContactInfo(info)
Establece los datos de contacto del visitante. El agente lo ve como si el visitante hubiera completado el formulario de introducción. El nombre, el teléfono y el correo electrónico juegan un papel especial en Smartbtn, por lo que se utiliza un método independiente.
| Nombre | Tipo | Descripción |
|---|---|---|
| name | string | Nombre del visitante |
| string | Correo electrónico del visitante | |
| phone | string | Teléfono de visitante |
| description | string | Cualquier información extra sobre el cliente. |
Smartbtn_api.setClientInfo({ name: "Alex Morgan", email: "email@example.com", phone: "+17584987855", description: "Description text" });
smartbtn_widget_api.setCustomData(fields)
Cualquier dato adicional para el panel de información a la derecha de la aplicación del agente. Llámalo tantas veces como quieras: en un cuadro de diálogo abierto, el panel se actualiza en tiempo real. Los campos se muestran en orden de matriz.
| Nombre | Tipo | Descripción |
|---|---|---|
| fields | array | Lista de campos de datos |
| field.title | string | Dirigiéndose por encima del campo |
| field.content | string | Contenido del campo; las etiquetas se escaparon |
| field.link | string | URL abierta al hacer clic |
Smartbtn_api.setClientCustomData([ { title: "Order", content: "#10482 · 3 items", link: "https://shop.example/orders/10482" }, { title: "Actions", content: "Open customer profile", link: "https://crm.example/c/9134" } ]);
smartbtn_widget_api.setSkin(skin, opts) · open() · close()
Cambie el tema del widget sobre la marcha sin recargar la página (classic, minimal, capsule, liquid) o controle la ventana de chat mediante programación. Para una personalización permanente por proyecto, pase los mismos campos a PATCH /v1/widget/settings.
// JS API · cambiar la máscara en la página en tiempo real smartbtn_widget_api.setSkin("minimal"); smartbtn_widget_api.setSkin("capsule", { capsuleTitle: "Smartbtn AI", capsuleSubtitle: "Respuestas en ~1 s" }); // REST API · PATCH /v1/widget/settings (alcance widget:write) { "skin": "minimal", "widget_header_align": "center", "widget_show_operator_avatars": false, "widget_show_tabs_bar": false, "chat_bg": "#FAF8F5", "capsule_title": "Smartbtn AI", "capsule_subtitle": "En línea 24 horas al día, 7 días a la semana" }
widget_api_contact_sync activado, estas llamadas también activan el webhook contact.updated.Support‑agent API
Un agente de soporte automatizado trabaja en la cola de tickets y en los chats con los clientes: toma una conversación, responde como su operador de soporte humano y cierra el ticket. Apagado hasta que el propietario del widget lo active.
- El propietario lo habilita.Enumera los tokens autorizados para actuar como agentes de soporte y las IP desde las que pueden llamar.
- leer la cola
GET /v1/support/tickets·GET /v1/support/chats - Arrendar un chat
POST …/chats/{id}/claim·…/release - ResponderTexto sin formato, enlaces solo a los hosts permitidos del widget.
201solo una vez que se almacena el mensaje. - Cerrar o volver a abrir
POST …/tickets/{number}/close·…/reopen
| Alcance | Permite |
|---|---|
| support:read | Tickets, chats activos, mensajes etiquetados cliente/ai/soporte/sistema, acciones propias auditadas |
| support:write | Reclamar/liberar un chat, cerrar sin respuesta, volver a abrir |
| support:reply | Responder al cliente como operador de soporte (sensible) |
| support:tickets:close | Cierra solo un ticket: para obtener un botón de «pregunta resuelta» en tu backend |
curl -X POST https://smartbtn.me/api/v1/support/chats/48211/reply \ -H "Authorization: Bearer $AGENT_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Smartbtn-Idempotency-Key: $(uuidgen)" \ -d '{"text":"Listo, el acceso ha sido restaurado."}'
API de IA
Todo lo que hace la sección de IA del tablero: asistentes, tus propias claves de proveedor, base de conocimientos, autoaprendizaje con reversión, deseos, problemas, señales de demanda y un asistente dentro de tu aplicación.
Varios asistentes con rol e idioma propios, una prueba antes de entrar en funcionamiento, operadores nombrados por idioma.
- GET/v1/ai/assistants
- POST/v1/ai/assistants/{id}/test
- PATCH/v1/ai/operators/{id}
- POST/v1/ai/handoff
Claude, ChatGPT, DeepSeek, Gemini, Mistral, LLM regionales o cualquier compatible con OpenAI. Los modelos se enumeran por clave.
- GET/v1/ai/credentials
- POST/v1/ai/credentials
- GET/v1/ai/credentials/{id}/models
Un rastreador para su sitio, cargas de PDF y DOCX, reglas, estado de búsqueda e indexación.
- PUT/v1/kb/crawler
- POST/v1/kb/uploads
- POST/v1/kb/rules
- GET/v1/kb/search
Ejecuciones de ajuste, ciclos, historial, versiones de personajes con reversión y interruptor de apagado.
- POST/v1/ai/learning/tune
- GET/v1/ai/learning/cycles
- POST/v1/ai/learning/persona‑versions/{version}/revert
- GET/v1/ai/learning/kill‑switch
Un deseo en palabras sencillas → una vista previa sin efectos secundarios → aprobar, rechazar o revertir.
- POST/v1/wishes
- GET/v1/wishes/{id}/preview
- POST/v1/wishes/{id}/approve
- POST/v1/wishes/{id}/revert
Grupos de problemas con estados y un límite de gasto mensual; Lo que los clientes pidieron y tú no ofreces.
- GET/v1/problems
- PATCH/v1/problems/settings
- POST/v1/problems/{id}/status
- GET/v1/ai/demand‑signals
Su backend envía el estado del cliente (registrado, pagado, cliente desde, estado del servicio) en una solicitud firmada por HMAC; la IA lo sopesa al responder y escalar.
- POST/v1/ai/customer‑status
- POST/v1/ai/tickets
- GET/v1/ai/alerts
Turnos de diálogo, vinculación de cuentas, voz a texto y texto a voz, tickets de aplicaciones, a través de una integración firmada.
- POST/v1/ai/assistant/turn
- POST/v1/ai/assistant/account‑link
- POST/v1/ai/assistant/speech‑to‑text
- POST/v1/ai/assistant/text‑to‑speech
Asistentes preparados por nicho: cafetería, clínica, tienda, servicio de coche. Aplicar en una sola solicitud.
- GET/v1/ai/marketplace/templates
- POST/v1/ai/marketplace/templates/{slug}/apply
Tu propio bot responde a los chats: respuestas asíncronas, transferencia, pruebas y ciclo de vida.
- POST/v1/ai/replies
- POST/v1/external‑operators/{public_id}/tests
- POST/v1/external‑operators/{public_id}/lifecycle
Límites de tarifas
Por token, dos contadores: las lecturas y las escrituras se cuentan por separado, por lo que el sondeo nunca consume el presupuesto de escritura.
| X‑RateLimit‑Limit | Tamaño del contador en el que se contó esta solicitud (600 o 120) |
| X‑RateLimit‑Remaining | Solicitudes dejadas en la ventana actual |
| X‑RateLimit‑Reset | Cuando la ventana se reinicia |
| Retry‑After | En 429: segundos de espera |
HTTP/1.1 429 Too Many Requests Content-Type: application/problem+json Retry-After: 12 X-RateLimit-Limit: 120 X-RateLimit-Remaining: 0 { "status": 429, "title": "Too Many Requests", "reason": "rate_limited" }
/v1/ai/assistant/tickets/status y /v1/ai/assistant/account‑link tienen sus propios contadores; la API del agente de soporte puede tener una anulación por widget.
Errores
Cada error es RFC‑7807 application/problem+json: un estado y motivo legibles por máquina, un detalle legible por humanos.
HTTP/1.1 403 · Content-Type: application/problem+json { "type": "https://smartbtn.me/problems/forbidden", "title": "Forbidden", "status": 403, "detail": "Token lacks scope chats:write.", "required_scopes": [ "chats:write" ], "hint": "Dashboard → API tokens → key → Edit scopes" }
El cuerpo nombra los ámbitos requeridos y dónde otorgarlos. No es necesario volver a emitir la clave.
| Estado | Significado |
|---|---|
| 400 | Solicitud mal formada o falta una clave de idempotencia requerida |
| 401 | Sin token, token inválido o revocado |
| 403 | El token carece de alcance; el cuerpo agrega required_scopes y dónde otorgarlo |
| 404 | No encontrado en este widget |
| 405 | Método no permitido: detenerse e informar; no busques escrituras alternativas |
| 409 | Clave de idempotencia reutilizada en 24 h, o conflicto de estado |
| 422 | La validación falló (por ejemplo, se envió un campo de solo lectura) |
| 429 | Límite de tarifa; respetar el reintento después |
Idempotencia
Las redes fallan. Una clave hace que un reintento de escritura sea seguro: la misma operación nunca se aplica dos veces.
- Envíe
X‑Smartbtn‑Idempotency‑Keyen cada POST / PATCH / PUT / DELETE: un nuevo UUID para una nueva operación, la misma clave para un reintento de la misma. - Operaciones marcadas
x‑idempotencia: requeridaen OpenAPI: sin clave → 400, la clave se reutiliza dentro de las 24 horas → 409 (no es un éxito en caché). - ¿No estás seguro de que haya pasado? Lea el estado primero. Nunca cambie la clave automáticamente; Respete el reintento después.
- Un
502de un proveedor ascendente libera la clave; vuelva a intentarlo con la misma clave.
KEY=$(uuidgen) curl -X PATCH https://smartbtn.me/api/v1/widget/settings \ -H "Authorization: Bearer $SMARTBTN_TOKEN" \ -H "Content-Type: application/json" \ -H "X-Smartbtn-Idempotency-Key: $KEY" \ -d '{"language":"ru"}' # error de red? repetir con la misma $KEY
Changelog
Cambios en la API pública y los webhooks en 2026. Todo lo siguiente es aditivo y permanece en v1.
Nuevo boleto para evento en vivo creado. GET /v1/support/tickets responde cualquier clave con soporte: leer hasta que se configure un agente de soporte. Los ámbitos clave se pueden editar sin volver a publicarlos. 403 ganancias requeridas_alcances.
POST/PATCH /v1/ai/operators aceptan name_i18n; los nombres predeterminados se traducen al idioma del widget; elección de saludo predecible.
Lecturas: 600 por minuto, escrituras: 120. Las encuestas ya no consumen el presupuesto de escritura. X‑RateLimit-* describe el contador que se utilizó.
Chats con actividad desde un instante, por antiguos que sean. Cada chat ahora lleva last_message_at.
chat.account.email_requested — el chat espera la dirección; los agentes no deben iniciar otro flujo de código.
Cierra un ticket y nada más, para obtener un botón de "pregunta resuelta" en tu backend.
Filtros has_client_messages=1 y q (2–100 caracteres).
POST /v1/ai/assistant/account‑link y /revoke. Apagado hasta que el propietario lo habilite.
Las reglas están integradas con la tecla del widget o una tecla de asistente habilitada; un 502 libera la clave de idempotencia.
La cuenta es visible mientras el ticket está abierto y durante los 7 días posteriores.
Nuevo /v1/grupo de soporte: cola, chats, arrendamientos, respuestas, cierre y reapertura de tickets. Apagado hasta que el propietario lo habilite.
Campos code_pending, code_expires_at, last_code_result y last_code_at.
complemento de WordPress
El widget en un sitio de WordPress sin tocar el código del tema.
- Descargarel archivo del complemento a su computadora.
- InstalarColoque la carpeta descomprimida en
wp‑content/plugins/o cárguela en el administrador de WordPress. - ActivarAparece un elemento Smartbtn en el menú.
- Pega la fichaCopie el token de seguridad de la configuración del widget en su panel.
Cuando cambia su contraseña, el token de seguridad también cambia y el anterior deja de funcionar; pegue el nuevo en el complemento.
Ejemplos de código
Enumere todos los chats con actividad desde su última encuesta, siguiendo el cursor hasta el final.
# primera pagina curl -G https://smartbtn.me/api/v1/chats \ -H "Authorization: Bearer $SMARTBTN_TOKEN" \ --data-urlencode "updated_since=2026-10-17T09:00:00+03:00" # next — con next_cursor de la respuesta curl -G https://smartbtn.me/api/v1/chats \ -H "Authorization: Bearer $SMARTBTN_TOKEN" \ --data-urlencode "cursor=eyJpZCI6NDgyMDd9"