Datos de referencia

Las rutas de catálogo devuelven los identificadores que el resto de la API solicita: conexiones (números de WhatsApp), departamentos, agentes, plantillas de mensaje de la API oficial, etiquetas y motivos de cierre, además de la información de la propia clave. Todas son de lectura y están habilitadas para cualquier clave activa.

Visión general

Antes de enviar un mensaje por un número específico, transferir a un departamento, asignar un agente o cerrar con un motivo, la integración necesita los ids de esos registros. Las siete rutas de esta página existen para eso:

RutaDevuelveSe usa en
chave/infoLa propia clave y el servidorPrueba de conexión, verificación de alcances y zona horaria
conexoes/listarNúmeros de WhatsAppconexao_id en envíos, apertura de atención, filtros y plantillas
departamentos/listarDepartamentosdepartamento_id en transferencia, apertura de atención, órdenes de servicio, agenda, filtros e indicadores
atendentes/listarAgentesatendente_id en transferencia y apertura; responsavel_id en órdenes de servicio y agenda
modelos/listarPlantillas de la API oficialmodelo_id en mensagens/enviar_modelo
etiquetas/listarEtiquetas de conversaciónconversas/etiquetas y el filtro etiqueta_id
motivos/listarMotivos de cierremotivo_id en conversas/encerrar
  • Alcance: ninguno. Cualquier clave activa puede llamarlas, incluso con todos los permisos desactivados.
  • Método: GET (también se acepta POST).
  • Paginación: no hay. Cada ruta devuelve la lista completa, que en un proveedor de internet suele tener desde unos pocos hasta algunas decenas de elementos.
  • Conteo: las llamadas de catálogo cuentan en el uso y en el límite por minuto de la clave, como cualquier otra.

Los ejemplos en PHP y Python de esta página usan la función chatisp() presentada en Dirección y autenticación: arma la URL, envía la clave en el encabezado y devuelve la respuesta decodificada.


Información de la clave

GET /api_publica.php?r=chave/info

Muestra la clave que hizo la llamada (nombre, alcances y límite por minuto) y datos del servidor (versión de la API, zona horaria, reloj y plan). Es la mejor ruta para probar la dirección y la clave, y para que la integración verifique al iniciar si tiene los alcances que necesita.

Parámetros: ninguno.

terminal
curl -s "https://atendimento.seuprovedor.com.br/api_publica.php?r=chave/info" \
  -H "Authorization: Bearer $CHATISP_CHAVE"
PHP
$info = chatisp('chave/info');
$faltando = array_diff(['mensagens_enviar', 'tickets_gerir'], $info['chave']['escopos']);
if ($faltando) {
    die('Active en la clave: ' . implode(', ', $faltando) . PHP_EOL);
}
Python
info = chatisp("chave/info")
faltando = {"mensagens_enviar", "tickets_gerir"} - set(info["chave"]["escopos"])
if faltando:
    raise SystemExit(f"Active en la clave: {', '.join(faltando)}")
respuesta (HTTP 200)
{
  "ok": true,
  "chave": {
    "id": 3,
    "nome": "ERP financeiro",
    "prefixo": "cisp_7f3a9…",
    "escopos": ["mensagens_enviar", "conversas_ler", "atendimentos_abrir"],
    "cota_minuto": 60
  },
  "servidor": {
    "api_versao": "1",
    "fuso_horario": "America/Sao_Paulo",
    "agora": "2026-10-01T09:30:12-03:00",
    "plano": "PREMIUM"
  }
}
CampoTipoDescripción
chave.identeroIdentificador de la clave en el panel.
chave.nomestringEl Nombre dado a la clave. Es el nombre que aparece en el historial de las acciones que realiza.
chave.prefixostringEl comienzo de la clave, igual al que se muestra en la lista del panel. La API nunca devuelve la clave completa.
chave.escoposlistaAlcances activados, en el orden de la pantalla. Vea la tabla en Permisos de la clave.
chave.cota_minutoenteroLímite por minuto. 0 = sin límite.
servidor.api_versaostringVersión de la API, la misma del encabezado X-ChatISP-Api-Versao.
servidor.fuso_horariostringZona horaria del servidor (nombre IANA). Las fechas sin zona horaria enviadas a la API se interpretan en ella.
servidor.agorastringReloj del servidor en ISO 8601. Útil para medir la diferencia con el reloj de su sistema.
servidor.planostringNombre del plan vigente (PREMIUM, GOLD, ENTERPRISE, CUSTOM, o TRIAL durante la prueba).

Errores: solo los de acceso, comunes a todas las rutas (autenticacao, chave_invalida, plano, cota_excedida).


Conexiones (números de WhatsApp)

GET /api_publica.php?r=conexoes/listar

Lista todas las conexiones registradas, conectadas o no, ordenadas por nombre. Cada conexión es un número de WhatsApp vinculado a ChatISP por código QR o por la API oficial de Meta (vea Conexiones de WhatsApp).

Parámetros: ninguno.

terminal
curl -s "https://atendimento.seuprovedor.com.br/api_publica.php?r=conexoes/listar" \
  -H "Authorization: Bearer $CHATISP_CHAVE"
PHP
// Un número = una línea: descarta el lado no principal de las gemelas
$numeros = array_filter(chatisp('conexoes/listar')['conexoes'], fn($c) => $c['principal']);
foreach ($numeros as $c) {
    echo "{$c['id']}  {$c['nome']}  {$c['telefone']}  {$c['estado']}\n";
}
Python
# Un número = una línea: descarta el lado no principal de las gemelas
for c in chatisp("conexoes/listar")["conexoes"]:
    if c["principal"]:
        print(c["id"], c["nome"], c["telefone"], c["estado"])
respuesta (HTTP 200)
{
  "ok": true,
  "conexoes": [
    {
      "id": 1,
      "nome": "Atendimento",
      "tipo": "qr",
      "estado": "conectada",
      "telefone": "5544999990000",
      "nome_conta": "Fibra Exemplo",
      "gemea_id": 2,
      "principal": true
    },
    {
      "id": 2,
      "nome": "Atendimento (API oficial)",
      "tipo": "api_oficial",
      "estado": "conectada",
      "telefone": "5544999990000",
      "nome_conta": "Fibra Exemplo",
      "gemea_id": 1,
      "principal": false
    },
    {
      "id": 4,
      "nome": "Comercial",
      "tipo": "qr",
      "estado": "desconectada",
      "telefone": "5544999991111",
      "nome_conta": "Fibra Exemplo Vendas",
      "gemea_id": null,
      "principal": true
    }
  ]
}
CampoTipoDescripción
identeroEl conexao_id usado en las demás rutas.
nomestringNombre dado a la conexión en el panel.
tipostringqr (conectada por el código QR de la aplicación) o api_oficial (API oficial de Meta).
estadostringconectada, conectando, desconectada o erro. Solo las conexiones conectada envían mensajes.
telefonestringEl número de WhatsApp, solo dígitos. Puede venir vacío en una conexión que aún no fue vinculada.
nome_contastringNombre del perfil de WhatsApp (lo que ve el cliente).
gemea_identero o nullEn la conexión gemela, el id del otro lado del mismo número. null en las conexiones simples.
principalbooleanoSi es el lado donde nacen las conversaciones nuevas del número. Siempre true en las conexiones simples.

Errores: solo los de acceso.

Número gemelo: QR y API oficial en el mismo número

Un mismo número de WhatsApp puede estar vinculado a ChatISP por los dos caminos al mismo tiempo: por código QR (la aplicación del celular) y por la API oficial de Meta (en el modo de coexistencia). En el panel, ese par aparece como un único canal; en la API, aparece como dos conexiones que apuntan una a la otra mediante gemea_id. Reglas que valen para la integración:

  • Los dos lados son el mismo número. Para listar números, considere solo las conexiones con principal: true, como en el ejemplo anterior.
  • Las conversaciones nuevas nacen en el lado principal, que es el del QR cuando existe. El conexao_id que aparece en las conversaciones y en los webhooks es, en general, el del lado principal.
  • Envío: ChatISP elige el lado que entregará cada mensaje, como lo hace en el panel. Si uno de los lados cae, el otro sigue enviando: la llamada solo responde conexao_desconectada cuando ambos están fuera de servicio.
  • Plantillas: solo el lado de la API oficial envía plantillas. En mensagens/enviar_modelo y en modelos/listar, puede informar el id de cualquiera de los lados: ChatISP usa el lado oficial del mismo número.
  • Filtros: en conversas/listar, filtrar por el conexao_id de cualquier lado trae las conversaciones del número completo.

Cuándo informar conexao_id

SituaciónSin conexao_id
Un único número conectado (el par gemelo cuenta como un número)La API usa ese número. Puede omitirlo.
Más de un número conectadoLa API usa el Número de origen de la clave de API (Integraciones, Claves de API). Clave sin Número de origen: HTTP 400 conexao_id_obrigatorio, indique qué número usar.
Ningún número conectadoHTTP 400 sem_conexao.
mensagens/enviar_modeloLa regla anterior vale solo para las conexiones de la API oficial: con un único número oficial conectado, puede omitirlo.
Envío a una conversación existente (conversa_id o protocolo)No es necesario: el mensaje sale por el número de la conversación.

Aunque hoy tenga un único número, guarde el conexao_id en la configuración de la integración y envíelo siempre. Así, cuando el proveedor conecte un segundo número (comercial, cobranza), la integración sigue funcionando sin cambiar nada.


Departamentos

GET /api_publica.php?r=departamentos/listar

Lista todos los departamentos, activos e inactivos, en el orden definido en el panel (vea Departamentos y cola).

Parámetros: ninguno.

terminal
curl -s "https://atendimento.seuprovedor.com.br/api_publica.php?r=departamentos/listar" \
  -H "Authorization: Bearer $CHATISP_CHAVE"
PHP
// Mapa nombre => id de los departamentos activos
$deps = [];
foreach (chatisp('departamentos/listar')['departamentos'] as $d) {
    if ($d['ativo']) $deps[$d['nome']] = $d['id'];
}
$suporte = $deps['Suporte técnico'] ?? null;
Python
deps = {d["nome"]: d["id"] for d in chatisp("departamentos/listar")["departamentos"] if d["ativo"]}
suporte = deps.get("Suporte técnico")
respuesta (HTTP 200)
{
  "ok": true,
  "departamentos": [
    { "id": 1, "nome": "Suporte técnico", "ativo": true,  "padrao": true },
    { "id": 2, "nome": "Financeiro",      "ativo": true,  "padrao": false },
    { "id": 3, "nome": "Comercial",       "ativo": true,  "padrao": false },
    { "id": 5, "nome": "Retenção",        "ativo": false, "padrao": false }
  ]
}
CampoTipoDescripción
identeroEl departamento_id usado en las demás rutas.
nomestringNombre del departamento.
ativobooleanoUn departamento inactivo no recibe transferencias ni atenciones: usarlo responde departamento_invalido. Aparece en la lista porque conversaciones antiguas pueden estar vinculadas a él.
padraobooleanotrue en el departamento que recibe las conversaciones nuevas (opción Departamento de las conversaciones nuevas, en Configuración). Ninguno viene marcado cuando la opción está vacía o apunta a un departamento inactivo.

Errores: solo los de acceso.


Agentes

GET /api_publica.php?r=atendentes/listar

Lista los usuarios del panel en orden alfabético, con perfil de acceso, departamentos, presencia y pausa. Los usuarios eliminados no aparecen; los usuarios inactivos aparecen con ativo: false.

Parámetros: ninguno.

terminal
curl -s "https://atendimento.seuprovedor.com.br/api_publica.php?r=atendentes/listar" \
  -H "Authorization: Bearer $CHATISP_CHAVE"
PHP
// Quién del departamento 1 está en línea y fuera de pausa ahora
$livres = array_filter(chatisp('atendentes/listar')['atendentes'], fn($a) =>
    $a['ativo'] && $a['online'] && !$a['em_pausa'] && in_array(1, $a['departamentos'], true));
Python
# Quién del departamento 1 está en línea y fuera de pausa ahora
livres = [a for a in chatisp("atendentes/listar")["atendentes"]
          if a["ativo"] and a["online"] and not a["em_pausa"] and 1 in a["departamentos"]]
respuesta (HTTP 200)
{
  "ok": true,
  "atendentes": [
    {
      "id": 7,
      "nome": "Ana Ribeiro",
      "perfil": "Atendente",
      "ativo": true,
      "departamentos": [1, 2],
      "online": true,
      "em_pausa": false
    },
    {
      "id": 4,
      "nome": "Carlos Mendes",
      "perfil": "Supervisor",
      "ativo": true,
      "departamentos": [1],
      "online": true,
      "em_pausa": true
    }
  ]
}
CampoTipoDescripción
identeroEl atendente_id (transferencia, apertura de atención, filtros) y el responsavel_id (órdenes de servicio y agenda).
nomestringNombre del usuario.
perfilstringNombre del perfil de acceso (vea Agentes, perfiles y permisos). Vacío si el usuario no tiene perfil.
ativobooleanoUn usuario inactivo no puede recibir conversaciones, órdenes de servicio ni compromisos: usarlo responde atendente_invalido.
departamentoslista de enterosIds de los departamentos en los que el usuario atiende.
onlinebooleanoSi el usuario tuvo el panel abierto en los últimos 2 minutos.
em_pausabooleanoSi está en línea y con una pausa abierta (almuerzo, descanso). Siempre false para quien está desconectado.

Errores: solo los de acceso.

Transferir por la API directamente a un agente funciona aunque esté desconectado o en pausa: la conversación queda con él. Si la intención es que alguien disponible la tome enseguida, transfiera al departamento y deje que la distribución de ChatISP elija.


Plantillas de mensaje (API oficial)

GET /api_publica.php?r=modelos/listar

Lista las plantillas de mensaje (templates) de las conexiones de la API oficial de Meta, ordenadas por nombre e idioma. Una plantilla aprobada es la única forma de hablar con el cliente fuera de la ventana de 24 horas. La lista refleja la última sincronización con Meta, hecha con el botón Sincronizar con Meta en la tarjeta Plantillas de la conexión (vea Conexiones de WhatsApp): una plantilla creada o aprobada en Meta solo aparece aquí después de sincronizar.

ParámetroTipoObligatorioDescripción
conexao_identeronoSolo las plantillas de esa conexión. Puede ser el id de cualquier lado de un número gemelo: el lado QR responde con las plantillas del lado oficial. Sin el parámetro, vienen las plantillas de todas las conexiones.
terminal
curl -s "https://atendimento.seuprovedor.com.br/api_publica.php?r=modelos/listar&conexao_id=2" \
  -H "Authorization: Bearer $CHATISP_CHAVE"
PHP
// Solo las que la API puede enviar
$enviaveis = array_filter(chatisp('modelos/listar', ['conexao_id' => 2])['modelos'], fn($m) => $m['enviavel']);
foreach ($enviaveis as $m) {
    echo "{$m['id']}  {$m['nome']} ({$m['idioma']}): {$m['variaveis']} variable(s)\n";
}
Python
modelos = chatisp("modelos/listar", {"conexao_id": 2})["modelos"]
for m in (m for m in modelos if m["enviavel"]):
    print(m["id"], m["nome"], m["idioma"], m["variaveis"])
respuesta (HTTP 200)
{
  "ok": true,
  "modelos": [
    {
      "id": 12,
      "conexao_id": 2,
      "nome": "aviso_manutencao",
      "idioma": "pt_BR",
      "categoria": "UTILITY",
      "status": "APPROVED",
      "corpo": "Olá, {{1}}! Haverá manutenção programada na sua região em {{2}}, das {{3}}. Pedimos desculpas pelo transtorno.",
      "variaveis": 3,
      "cabecalho": null,
      "enviavel": true,
      "atualizado_em": "2026-09-28T14:02:11-03:00"
    },
    {
      "id": 15,
      "conexao_id": 2,
      "nome": "fatura_disponivel",
      "idioma": "pt_BR",
      "categoria": "UTILITY",
      "status": "APPROVED",
      "corpo": "Olá, {{1}}. Sua fatura de {{2}} está disponível. Vencimento: {{3}}.",
      "variaveis": 3,
      "cabecalho": "DOCUMENT",
      "enviavel": false,
      "atualizado_em": "2026-09-28T14:02:11-03:00"
    }
  ]
}
CampoTipoDescripción
identeroEl modelo_id de mensagens/enviar_modelo.
conexao_identeroLa conexión de la API oficial a la que pertenece la plantilla.
nomestringNombre de la plantilla en Meta. También se acepta en enviar_modelo mediante el parámetro modelo, junto con idioma.
idiomastringCódigo de idioma en Meta, por ejemplo pt_BR. El mismo nombre puede existir en varios idiomas.
categoriastringCategoría en Meta: UTILITY, MARKETING o AUTHENTICATION. Define el precio de la conversación que cobra Meta.
statusstringSituación en Meta, tal como ella la devuelve (por ejemplo APPROVED, PENDING, REJECTED). Solo APPROVED puede enviarse.
corpostringTexto del cuerpo, con las variables en el formato {{1}}, {{2}}...
variaveisenteroCuántas variables tiene el cuerpo. En enviar_modelo, la lista variaveis debe tener esa cantidad de valores, en orden.
cabecalhostring o nullTipo de encabezado de la plantilla: null (sin encabezado), TEXT, o de medios (IMAGE, VIDEO, DOCUMENT...).
enviavelbooleanotrue cuando la API puede enviar la plantilla: aprobada y sin encabezado de medios. Las plantillas con encabezado de medios responden modelo_com_midia en el envío.
atualizado_emstringFecha de la última sincronización de esta plantilla.

Errores:

errorHTTPCuándo
conexao_invalida400El conexao_id informado no existe.
parametro_invalido400conexao_id no es un número entero.

Una conexión QR sin lado oficial devuelve la lista vacía, sin error: los números conectados solo por QR no usan plantillas.


Etiquetas

GET /api_publica.php?r=etiquetas/listar

Lista las etiquetas de conversación registradas en el panel (vea Catálogos), en el orden definido allí.

Parámetros: ninguno.

terminal
curl -s "https://atendimento.seuprovedor.com.br/api_publica.php?r=etiquetas/listar" \
  -H "Authorization: Bearer $CHATISP_CHAVE"
PHP
$etiquetas = array_column(chatisp('etiquetas/listar')['etiquetas'], 'id', 'nome');
// marca la conversación como "Visita técnica" sin quitar las demás etiquetas
chatisp('conversas/etiquetas', ['conversa_id' => 18342, 'adicionar' => [$etiquetas['Visita técnica']]], 'POST');
Python
etiquetas = {e["nome"]: e["id"] for e in chatisp("etiquetas/listar")["etiquetas"]}
# marca la conversación como "Visita técnica" sin quitar las demás etiquetas
chatisp("conversas/etiquetas", {"conversa_id": 18342, "adicionar": [etiquetas["Visita técnica"]]}, "POST")
respuesta (HTTP 200)
{
  "ok": true,
  "etiquetas": [
    { "id": 3, "nome": "Visita técnica", "cor": "#f59e0b" },
    { "id": 1, "nome": "Cliente novo",   "cor": "#10b981" },
    { "id": 6, "nome": "Cancelamento",   "cor": "#ef4444" }
  ]
}
CampoTipoDescripción
identeroId usado en conversas/etiquetas y en el filtro etiqueta_id de conversas/listar.
nomestringNombre de la etiqueta.
corstringColor en hexadecimal (#rrggbb), el mismo del panel.

Errores: solo los de acceso.


Motivos de cierre

GET /api_publica.php?r=motivos/listar

Lista los motivos de cierre registrados en el panel (vea Catálogos), activos e inactivos, en el orden definido allí.

Parámetros: ninguno.

terminal
curl -s "https://atendimento.seuprovedor.com.br/api_publica.php?r=motivos/listar" \
  -H "Authorization: Bearer $CHATISP_CHAVE"
PHP
$motivos = array_column(array_filter(chatisp('motivos/listar')['motivos'], fn($m) => $m['ativo']), 'id', 'nome');
chatisp('conversas/encerrar', ['conversa_id' => 18342, 'motivo_id' => $motivos['Problema resolvido']], 'POST');
Python
motivos = {m["nome"]: m["id"] for m in chatisp("motivos/listar")["motivos"] if m["ativo"]}
chatisp("conversas/encerrar", {"conversa_id": 18342, "motivo_id": motivos["Problema resolvido"]}, "POST")
respuesta (HTTP 200)
{
  "ok": true,
  "motivos": [
    { "id": 1, "nome": "Problema resolvido",  "ativo": true },
    { "id": 2, "nome": "Dúvida esclarecida",  "ativo": true },
    { "id": 4, "nome": "Cliente não respondeu", "ativo": true },
    { "id": 7, "nome": "Engano",              "ativo": false }
  ]
}
CampoTipoDescripción
identeroEl motivo_id de conversas/encerrar.
nomestringNombre del motivo. Es el texto que aparece en motivo_encerramento en las conversaciones y en el campo motivo del webhook conversa_encerrada.
ativobooleanoUn motivo inactivo no puede usarse para cerrar (motivo_invalido), pero sigue apareciendo en las conversaciones antiguas.

Errores: solo los de acceso.


Guardar y actualizar los catálogos

Los catálogos cambian poco: departamentos, etiquetas y motivos solo cambian cuando alguien edita los registros en el panel. Buenas prácticas:

  • Guárdelos en caché en su sistema y actualícelos a intervalos (por ejemplo, cada hora) o al iniciar la integración. Consultar el catálogo en cada envío gasta el límite por minuto sin necesidad.
  • Prefiera ids a nombres. Los nombres pueden editarse en el panel en cualquier momento; el id sigue siendo el mismo. Si su configuración usa nombres (como en los ejemplos anteriores), resuelva el id al iniciar y avise cuando no se encuentre un nombre.
  • Trate los errores de registro (departamento_invalido, atendente_invalido, motivo_invalido, etiqueta_invalida) como señal para recargar el catálogo: algo fue desactivado o eliminado en el panel.
  • La presencia cambia todo el tiempo. Los campos online y em_pausa de atendentes/listar valen para el momento de la consulta; no los guarde en caché.
  • El estado de la conexión también. Antes de un envío masivo, verifique en conexoes/listar si el número está conectada.