Desarrolladores

Todo lo que hace la app, también por API.

213 endpoints REST sobre HTTPS, autenticados con una llave que tú generas y revocas. Webhooks firmados para enterarte de lo que pasa sin estar preguntando. Esta página es la guía completa: sirve para integrar desde PHP, C#, TypeScript, Python o lo que uses, porque no hay nada que no sea una petición HTTP con una cabecera.

Antes de empezar

Necesitas dos cosas: una cuenta de Kontesta y una API key. La llave se crea desde la app, en Ajustes → API keys, y hace falta permiso de administrador. No se puede crear una llave usando otra llave — es a propósito: evita que una llave filtrada se multiplique sola.

Al crearla eliges qué permisos lleva (ver Permisos y scopes). El secreto completo se muestra una sola vez: en nuestra base solo queda su hash, así que si lo pierdes no hay forma de recuperarlo, solo de rotarlo.

ConceptoValor
URL basehttps://api.kontesta.app
Pruebashttps://staging.kontesta.mx
VersiónVa en la ruta: todas las rutas empiezan con /v1
FormatoJSON en petición y respuesta, UTF-8
Llavektk_ + 8 caracteres de prefijo + . + el secreto

Empieza por el entorno de pruebas

En https://staging.kontesta.mx la app y la API viven en el mismo origen, con datos de demo que puedes romper sin consecuencias. Nada de lo que envíes desde ahí sale a WhatsApp de verdad, así que es el lugar para equivocarte. Los ejemplos de esta guía funcionan igual en pruebas: cambia la URL base y ya.

Autenticación

Manda la llave en la cabecera X-Api-Key. Si tu cliente HTTP te complica las cabeceras personalizadas, también se acepta como Authorization: Bearer — el prefijo ktk_ nos deja distinguirla de un token de sesión.

X-Api-Key: ktk_a1b2c3d4.tu-secreto-aqui

# o bien
Authorization: Bearer ktk_a1b2c3d4.tu-secreto-aqui

Trata la llave como una contraseña

Una API key vale por todo el permiso que le diste, no caduca sola y no está atada a ningún usuario. Guárdala en variables de entorno o en tu bóveda de secretos — nunca en el código, en el repositorio, ni en el navegador: cualquier llamada desde el frontend expone la llave a quien abra las herramientas de desarrollo. Toda integración va servidor a servidor.

Para cambiar una llave sin cortar el servicio existe la rotación: te devuelve una llave nueva y deja la vieja funcionando durante una ventana de gracia (24 horas por omisión, hasta 7 días, o 0 para cortar de inmediato). Despliegas la nueva, verificas y la vieja muere sola.

Tu primera llamada

Lista las conversaciones abiertas. Si esto responde 200, ya estás integrado: todo lo demás es cambiar la ruta y el cuerpo.

curl -s "https://api.kontesta.app/v1/conversations?status=open&limit=30" \
  -H "X-Api-Key: $KONTESTA_API_KEY"

Un 401 significa que la llave no llegó o no es válida. Un 403 significa que llegó bien pero le falta el permiso — no es lo mismo, y la diferencia te ahorra media hora de depuración.

Permisos y scopes

Cada llave lleva una lista de permisos con la forma recurso:verboconversations:read, messages:send, leads:write. Cada endpoint exige el suyo, y la llave debe traerlo o la respuesta es 403.

Todo lo que no se concede, se niega

Un endpoint que no declara permiso explícitamente no es alcanzable con una API key, punto. No hay llave maestra ni permiso comodín. Por eso la referencia de endpoints de esta página es la superficie pública completa: lo que no aparece ahí, no se puede llamar con una llave, aunque exista en la app.

La consecuencia práctica: dale a cada llave el mínimo que necesita. Una integración que solo publica leads desde tu sitio no necesita conversations:read, y si algún día se filtra, no leerá las conversaciones de nadie. Es más trabajo el primer día y menos daño el peor día.

Paginación, errores y límites

Paginación

Todo listado responde con la misma forma: items (el arreglo) y nextCursor. Se pagina por cursor, no por número de página: pides limit (1 a 100, 30 por omisión) y devuelves el nextCursor en el parámetro cursor para la siguiente página; cuando viene nulo se acabó. Es un poco más incómodo que page=2, pero no se salta ni repite registros cuando entran datos nuevos mientras paginas — que en un inbox pasa todo el tiempo.

paginar.php
<?php
$cursor = null;

do {
    $params = ['status' => 'open', 'limit' => 100];
    if ($cursor !== null) {
        $params['cursor'] = $cursor;
    }

    $url = 'https://api.kontesta.app/v1/conversations?' . http_build_query($params);
    $pagina = json_decode(pedir($url), true);

    foreach ($pagina['items'] as $conversacion) {
        procesar($conversacion);
    }

    $cursor = $pagina['nextCursor'] ?? null;
} while ($cursor !== null);

Errores

Todos los errores traen la misma forma. El campo requestId es el que nos sirve para rastrear qué pasó: si nos escribes por un error, mándalo.

respuesta 403
{
  "statusCode": 403,
  "error": "Forbidden",
  "message": "Scope insuficiente: la llave no concede [messages:send]",
  "requestId": "a4898ca6-b9ba-496b-a0bf-814ee17ad7f1",
  "timestamp": "2026-08-05T19:56:10.378Z",
  "path": "/v1/conversations/cmrh3l84d001yxqdd992h7uwa/messages"
}
CódigoQué pasóQué hacer
400El cuerpo o los parámetros no pasaron validaciónLee message: dice el campo
401Falta la llave o no es válidaRevisa la cabecera y que la llave no esté revocada
403La llave es válida pero le falta el permisoAgrega el scope y rota la llave
404El recurso no existe o no es de tu cuentaVerifica el id
409Choca con el estado actualRelee el recurso antes de reintentar
422Válido en forma, imposible en negocioLee message: explica la regla
429Pasaste el límite de peticionesEspera y reintenta con espera creciente
5xxFalla nuestraReintenta con espera creciente; si insiste, escríbenos con el requestId

Límites de peticiones

Ventana de un minuto, contada por cuenta, y con cubetas separadas para lectura (GET) y escritura (el resto). Al pasarte recibes 429.

PlanLecturas / minEscrituras / min
Prueba6030
Emprende / Esencial12060
Crece / Pro240120
Escala / Max480240
Enterprise600300

Enviar un mensaje

El caso más común. Se envía dentro de una conversación existente: el número de destino y la línea de salida se derivan de ella, así que no los mandas tú y no hay forma de equivocar el mapeo.

curl -s -X POST \
  "https://api.kontesta.app/v1/conversations/cvs_abc123/messages" \
  -H "X-Api-Key: $KONTESTA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"text","text":"Tu pedido va en camino."}'

La ventana de 24 horas es de Meta, no nuestra

WhatsApp solo permite texto libre dentro de las 24 horas siguientes al último mensaje del cliente. Fuera de esa ventana hay que usar una plantilla aprobada (kind: "template"). No es una restricción que podamos levantar: la pone Meta y la aplica su API.

Webhooks

En vez de preguntar cada minuto si hay algo nuevo, das de alta una URL tuya y te avisamos. Cada entrega es un POST con el evento en el cuerpo.

curl -s -X POST "https://api.kontesta.app/v1/webhooks" \
  -H "X-Api-Key: $KONTESTA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://tu-sistema.com/hooks/kontesta",
    "events": ["message.received", "lead.created"]
  }'

# La respuesta trae el secreto de firma. Se muestra una sola vez:
# { "id": "whk_...", "secret": "whsec_...", ... }

Al crear la suscripción te devolvemos un secreto que empieza con whsec_. Con él firmamos cada entrega, y ese es el único modo de saber que la petición viene de nosotros: la URL es pública, cualquiera puede llamarla.

Cabeceras de cada entrega

CabeceraContenido
X-Kontesta-Signaturet=<unix>,v1=<hex>
X-Kontesta-Event-IdIdentificador del evento — úsalo para no procesar dos veces
X-Kontesta-Event-TypeEl tipo, por ejemplo message.received
X-Kontesta-Delivery-IdIdentificador de este intento de entrega

Verificar la firma

La firma es HMAC-SHA256 del texto {timestamp}.{cuerpo crudo} con tu secreto. Tres reglas que importan: usa el cuerpo tal como llegó (si lo parseas a objeto y lo vuelves a serializar, la firma ya no coincide), compara en tiempo constante, y rechaza lo que tenga más de 5 minutos para que nadie pueda reenviar una petición vieja.

webhook.php
<?php
function verificarFirma(
    string $cuerpoCrudo,
    ?string $cabecera,
    string $secreto,
    int $toleranciaSeg = 300
): bool {
    if ($cabecera === null) {
        return false;
    }

    // La cabecera viene como "t=1754413462,v1=9f86d0..."
    $t = null;
    $v1 = null;
    foreach (explode(',', $cabecera) as $parte) {
        $pos = strpos($parte, '=');
        if ($pos === false) {
            continue;
        }
        $clave = trim(substr($parte, 0, $pos));
        $valor = trim(substr($parte, $pos + 1));
        if ($clave === 't') {
            $t = $valor;
        } elseif ($clave === 'v1') {
            $v1 = $valor;
        }
    }

    if ($t === null || $v1 === null) {
        return false;
    }

    // Anti-reenvio: nada mas viejo que la tolerancia.
    if (abs(time() - (int) $t) > $toleranciaSeg) {
        return false;
    }

    $esperado = hash_hmac('sha256', $t . '.' . $cuerpoCrudo, $secreto);

    // hash_equals compara en tiempo constante. NUNCA usar ===.
    return hash_equals($esperado, $v1);
}

// El cuerpo CRUDO, sin parsear: si lo decodificas y lo vuelves a
// codificar, cambia un espacio y la firma ya no coincide.
$cuerpoCrudo = file_get_contents('php://input');
$cabecera    = $_SERVER['HTTP_X_KONTESTA_SIGNATURE'] ?? null;

if (!verificarFirma($cuerpoCrudo, $cabecera, getenv('KONTESTA_WEBHOOK_SECRET'))) {
    http_response_code(401);
    exit;
}

$evento = json_decode($cuerpoCrudo, true);

// Responde 2xx rapido; el trabajo pesado va en cola.
http_response_code(200);

encolar($evento['id'], $evento['type'], $evento['data']);

Responde rápido y sé idempotente

Contesta 2xx en cuanto recibas y haz el trabajo pesado aparte. Si tardas o fallas, reintentamos — y eso significa que el mismo evento puede llegarte dos veces. Guarda los X-Kontesta-Event-Id que ya procesaste y descarta los repetidos.

Catálogo de eventos

Al suscribirte eliges cuáles te interesan. Todos llegan con el mismo sobre: id, type, apiVersion, tenantId, occurredAt y data.

EventoCuándo se dispara
message.receivedEntra un mensaje de un cliente
message.status_changedUn mensaje que enviaste cambia a entregado, leído o fallido
conversation.assignedLa conversación se asigna a un agente
conversation.closedSe cierra la conversación
handoff.requestedEl bot pide pasar la conversación a una persona
lead.createdSe crea una oportunidad
lead.stage_changedUna oportunidad cambia de etapa en el embudo
appointment.createdSe agenda una cita
appointment.updatedSe reprograma o cancela una cita
payment.updatedCambia el estado de una liga de pago
review.obtainedSe obtiene una reseña

Referencia de endpoints

Los 213 endpoints que puedes llamar con una API key, con el permiso que exige cada uno. Esta lista se genera del código, no se escribe a mano.

Conversaciones y mensajes

El inbox: listar hilos, leer y enviar mensajes, asignar.

GET/v1/conversationsconversations:read
GET/v1/conversations/:idconversations:read
PATCH/v1/conversations/:idconversations:write
GET/v1/conversations/:id/messagesmessages:read
POST/v1/conversations/:id/messagesmessages:send
POST/v1/conversations/:id/readconversations:write
POST/v1/conversations/:id/thread/passconversations:write
POST/v1/conversations/:id/thread/takeconversations:write
GET/v1/metrics/speed-to-leadmetrics:read

Ficha de cliente

Datos del contacto, notas, datos fiscales y fotos.

GET/v1/contacts/:id/photoscontacts:read
GET/v1/conversations/:id/customercontacts:read
GET/v1/conversations/:id/customer/appointmentscontacts:read
POST/v1/conversations/:id/customer/erasure-requestcontacts:write
GET/v1/conversations/:id/customer/fiscalcontacts:read
PUT/v1/conversations/:id/customer/fiscalcontacts:write
GET/v1/conversations/:id/customer/notescontacts:read
POST/v1/conversations/:id/customer/notescontacts:write
DELETE/v1/conversations/:id/customer/notes/:noteIdcontacts:write

Leads y embudos

Tablero de oportunidades, etapas y pipelines.

GET/v1/leadsleads:read
POST/v1/leadsleads:write
PATCH/v1/leads/:idleads:write
GET/v1/leads/boardleads:read
GET/v1/pipelinespipelines:read
POST/v1/pipelines/:id/stagespipelines:write
DELETE/v1/stages/:idpipelines:write
PATCH/v1/stages/:idpipelines:write

Tareas de seguimiento

Pendientes por contacto y “mis pendientes”.

GET/v1/conversations/:id/taskstasks:read
POST/v1/conversations/:id/taskstasks:write
GET/v1/taskstasks:read
PATCH/v1/tasks/:idtasks:write

Plantillas de WhatsApp

Plantillas aprobadas por Meta para iniciar conversación.

GET/v1/templatestemplates:read
POST/v1/templatestemplates:manage
DELETE/v1/templates/:idtemplates:manage
GET/v1/templates/:idtemplates:read

Automatizaciones

Reglas, horario de atención y corridas.

GET/v1/automationsautomations:read
POST/v1/automationsautomations:write
DELETE/v1/automations/:idautomations:write
GET/v1/automations/:idautomations:read
PATCH/v1/automations/:idautomations:write
GET/v1/automations/:id/runsautomations:read
POST/v1/automations/:id/testautomations:write
GET/v1/automations/business-hoursautomations:read
PUT/v1/automations/business-hoursautomations:write
POST/v1/conversations/:id/tagstags:write
DELETE/v1/conversations/:id/tags/:tagIdtags:write
GET/v1/tagstags:read
POST/v1/tagstags:write
DELETE/v1/tags/:idtags:write

Respuestas guardadas

Macros del equipo para el compositor.

GET/v1/macrosmacros:read
POST/v1/macrosmacros:write
DELETE/v1/macros/:idmacros:write
GET/v1/macros/:idmacros:read
PATCH/v1/macros/:idmacros:write
GET/v1/macros/variablesmacros:read

Citas y agenda

Tipos de servicio, disponibilidad, agendar y reprogramar.

GET/v1/appointmentsappointments:read
POST/v1/appointmentsappointments:write
DELETE/v1/appointments/:idappointments:write
GET/v1/appointments/:idappointments:read
PATCH/v1/appointments/:idappointments:write
POST/v1/appointments/:id/chargeappointments:write
POST/v1/appointments/:id/completeappointments:write
POST/v1/appointments/:id/confirmappointments:write
POST/v1/appointments/:id/no-showappointments:write
DELETE/v1/appointments/:id/use-packageappointments:write
POST/v1/appointments/:id/use-packageappointments:write
GET/v1/appointments/availabilityappointments:read
GET/v1/appointments/calendarappointments:read
GET/v1/appointments/typesappointments:read
GET/v1/commission-rulescommissions:read
POST/v1/commission-rulescommissions:write
DELETE/v1/commission-rules/:idcommissions:write
GET/v1/commission-rules/:idcommissions:read
PATCH/v1/commission-rules/:idcommissions:write
GET/v1/commissions/overviewcommissions:read
POST/v1/conversations/:id/appointmentsappointments:write
GET/v1/reports/appointmentsappointments:read
GET/v1/reports/commissionscommissions:read

Cobros

Ligas de pago dentro de la conversación.

GET/v1/conversations/:id/payment-linkspayments:read
POST/v1/conversations/:id/payment-linkspayments:write
GET/v1/payment-accountspayments:read
POST/v1/payment-accountspayments:write
DELETE/v1/payment-accounts/:idpayments:write
PATCH/v1/payment-accounts/:idpayments:write
POST/v1/payment-accounts/:id/testpayments:write
GET/v1/payment-accounts/:id/webhook-urlpayments:write
GET/v1/payment-linkspayments:read
GET/v1/payment-links/:idpayments:read
POST/v1/payment-links/:id/cancelpayments:write
GET/v1/payments/overviewpayments:read
GET/v1/payments/settingspayments:read
PATCH/v1/payments/settingspayments:write

Facturación CFDI

Conexión con el PAC, series, timbrado y cancelación.

GET/v1/conversations/:id/invoicesinvoices:read
POST/v1/conversations/:id/invoicesinvoices:write
GET/v1/invoicesinvoices:read
GET/v1/invoices/:idinvoices:read
POST/v1/invoices/:id/cancelinvoices:write
GET/v1/invoices/:id/pdfinvoices:read
GET/v1/invoices/:id/xmlinvoices:read
GET/v1/invoicing/connectionsinvoices:read
POST/v1/invoicing/connectionsinvoices:write
DELETE/v1/invoicing/connections/:idinvoices:write
GET/v1/invoicing/connections/:idinvoices:read
PATCH/v1/invoicing/connections/:idinvoices:write
POST/v1/invoicing/connections/:id/testinvoices:write
GET/v1/invoicing/emisorinvoices:read
POST/v1/invoicing/emisor/csdinvoices:write
PUT/v1/invoicing/emisor/fiscalinvoices:write
POST/v1/invoicing/emisor/logoinvoices:write
GET/v1/invoicing/seriesinvoices:read
POST/v1/invoicing/seriesinvoices:write

Catálogo y productos

Productos, inventario y envío de producto al chat.

GET/v1/catalog/productscatalog:read
POST/v1/catalog/productscatalog:write
DELETE/v1/catalog/products/:idcatalog:write
GET/v1/catalog/products/:idcatalog:read
PATCH/v1/catalog/products/:idcatalog:write
POST/v1/catalog/products/:id/imagescatalog:write
GET/v1/catalog/products/:id/inventorycatalog:read
POST/v1/catalog/products/:id/inventory/adjustcatalog:write
POST/v1/conversations/:id/catalog/send-productcatalog:write

Lealtad

Programas de puntos y sellos, saldo y canjes.

GET/v1/conversations/:id/loyaltyloyalty:read
POST/v1/conversations/:id/loyalty/adjustloyalty:write
POST/v1/conversations/:id/loyalty/earnloyalty:write
POST/v1/conversations/:id/loyalty/enrollloyalty:write
POST/v1/conversations/:id/loyalty/packagesloyalty:write
POST/v1/conversations/:id/loyalty/packages/sellloyalty:write
POST/v1/conversations/:id/loyalty/redeemloyalty:write
POST/v1/conversations/:id/loyalty/send-balanceloyalty:write
POST/v1/conversations/:id/loyalty/send-wallet-passloyalty:write
GET/v1/loyalty/membersloyalty:read
GET/v1/loyalty/members/:idloyalty:read
GET/v1/loyalty/overviewloyalty:read
GET/v1/loyalty/package-typesloyalty:read
POST/v1/loyalty/package-typesloyalty:write
PATCH/v1/loyalty/package-types/:idloyalty:write
GET/v1/loyalty/programsloyalty:read
POST/v1/loyalty/programsloyalty:write
GET/v1/loyalty/programs/:idloyalty:read
PATCH/v1/loyalty/programs/:idloyalty:write
POST/v1/loyalty/wallet-passesloyalty:write
GET/v1/loyalty/wallet-passes/:idloyalty:read
GET/v1/packages/overviewloyalty:read

Reputación

Reseñas, conexiones y solicitudes de reseña.

POST/v1/conversations/:id/review-requestmessages:send + reputation:write
POST/v1/reputation/callback/:kindreputation:write
GET/v1/reputation/connect/:kindreputation:write
GET/v1/reputation/connectionsreputation:read
DELETE/v1/reputation/connections/:idreputation:write
GET/v1/reputation/overviewreputation:read
GET/v1/reputation/reviewsreputation:read
PATCH/v1/reputation/reviews/:idreputation:write
POST/v1/reputation/reviews/:id/replyreputation:write
POST/v1/reputation/syncreputation:write

Puntos de entrada

WALINK, QR y widget con su llave pública.

GET/v1/entry-pointsentrypoints:read
POST/v1/entry-pointsentrypoints:write
DELETE/v1/entry-points/:identrypoints:write
GET/v1/entry-points/:identrypoints:read
PATCH/v1/entry-points/:identrypoints:write
GET/v1/entry-points/channelsentrypoints:read

WhatsApp Flows

Formularios de captura y reserva dentro del chat.

POST/v1/conversations/:id/flowsflows:write

Integraciones

Conectores salientes configurados por el tenant.

GET/v1/integrationsintegrations:read
POST/v1/integrationsintegrations:write
DELETE/v1/integrations/:idintegrations:write
GET/v1/integrations/:idintegrations:read
PATCH/v1/integrations/:idintegrations:write
POST/v1/integrations/:id/testintegrations:write

Webhooks

Suscripciones, entregas, reintentos y rotación del secreto.

GET/v1/webhookswebhooks:read
POST/v1/webhookswebhooks:write
DELETE/v1/webhooks/:idwebhooks:write
GET/v1/webhooks/:idwebhooks:read
PATCH/v1/webhooks/:idwebhooks:write
GET/v1/webhooks/:id/deliverieswebhooks:read
POST/v1/webhooks/:id/pingwebhooks:write
POST/v1/webhooks/:id/rotate-secretwebhooks:write
POST/v1/webhooks/deliveries/:id/redeliverwebhooks:write

IA (BYOK)

Credenciales propias, ruteo, presupuesto y uso.

GET/v1/ai/bot-config/:channelAccountIdai:read
PUT/v1/ai/bot-config/:channelAccountIdai:write
GET/v1/ai/credentialsai:read
POST/v1/ai/credentialsai:write
DELETE/v1/ai/credentials/:idai:write
POST/v1/ai/credentials/:id/testai:write
POST/v1/ai/messages/:id/transcribeai:write
GET/v1/ai/settingsai:read
PUT/v1/ai/settingsai:write
GET/v1/ai/suggestai:read
GET/v1/ai/usageai:read
GET/v1/conversations/:id/insightai:read
POST/v1/conversations/:id/insight/reanalyzeai:write

Base de conocimiento

Fuentes del KB, ingesta y búsqueda.

POST/v1/rag/searchrag:read
GET/v1/rag/sourcesrag:read
POST/v1/rag/sourcesrag:write
DELETE/v1/rag/sources/:idrag:write
GET/v1/rag/sources/:idrag:read
POST/v1/rag/sources/:id/reingestrag:write

Configuración

Ajustes del tenant expuestos a la API.

GET/v1/appointment-resourcesappointments:read
POST/v1/appointment-resourcesappointments:write
DELETE/v1/appointment-resources/:idappointments:write
GET/v1/appointment-resources/:idappointments:read
PATCH/v1/appointment-resources/:idappointments:write
GET/v1/appointment-typesappointments:read
POST/v1/appointment-typesappointments:write
DELETE/v1/appointment-types/:idappointments:write
GET/v1/appointment-types/:idappointments:read
PATCH/v1/appointment-types/:idappointments:write
GET/v1/availability-exceptionsappointments:read
POST/v1/availability-exceptionsappointments:write
DELETE/v1/availability-exceptions/:idappointments:write
PATCH/v1/availability-exceptions/:idappointments:write
GET/v1/availability-rulesappointments:read
POST/v1/availability-rulesappointments:write
DELETE/v1/availability-rules/:idappointments:write
PATCH/v1/availability-rules/:idappointments:write

Archivos

Descarga de adjuntos.

GET/v1/media/:mediaBlobIdcontacts:read

Fotos de servicio

Evidencia antes/después.

POST/v1/conversations/:id/photoscontacts:write

Tiempo real

Flujo de eventos por Server-Sent Events.

GET/v1/inbox/streamconversations:read

SDK de TypeScript

Si trabajas en Node o TypeScript hay un cliente tipado que te ahorra armar las peticiones a mano y trae la verificación de webhooks ya resuelta. Cubre conversaciones, leads, pipelines, automatizaciones, etiquetas, plantillas, métricas, webhooks e integraciones.

Todavía no está en npm

El paquete existe y está probado, pero aún no lo publicamos: npm i @kontesta/sdk todavía no funciona. Mientras tanto, integra con peticiones HTTP directas como en los ejemplos de arriba — el contrato es el mismo y no vas a tener que reescribir nada cuando salga. Si lo quieres antes, escríbenos.
ejemplo.ts
import { Kontesta } from '@kontesta/sdk';

const k = new Kontesta({ apiKey: process.env.KONTESTA_API_KEY! });

// Una página
const { items, nextCursor } = await k.conversations.list({
  status: 'open',
  limit: 30,
});

// …o todas, sin escribir el bucle del cursor
for await (const c of k.conversations.iterate({ status: 'open' })) {
  console.log(c.id);
}

Para cualquier otro lenguaje no hace falta SDK: son peticiones HTTP con una cabecera, como los ejemplos de PHP, C# y Python de esta página. Si prefieres generar un cliente tipado en tu lenguaje, publicamos el archivo OpenAPI del que sale el nuestro — pídelo al abrir tu cuenta.

Conecta tu número