Bearer auth. Cursor pagination. Idempotency keys. Webhooks firmados. La API que tu equipo habría construido si tuviera el fin de semana.
Elige el runtime
import InstantReply from '@instantreply/node'
const ir = new InstantReply({ apiKey: process.env.IR_API_KEY })
for await (const c of ir.conversations.list.autoPaginate({ status: 'active' })) {
if (c.last_message_preview?.includes('refund')) {
await ir.conversations.update(c.id, { tags: ['priority:refund'] })
}
}Superficie v1
/v1/conversations/v1/conversations/:id/v1/conversations/:id/v1/conversations/:id/messages/v1/conversations/:id/messages/v1/contacts/v1/contacts/:id/v1/contacts/:id/v1/channels/v1/analytics/summary/v1/usage/v1/webhooks/v1/webhooks/v1/webhooks/:idDiseño
Cada endpoint de lista devuelve has_more y next_cursor. Sin records perdidos bajo carga, sin off-by-one.
Pasa un UUID y reintenta seguro por 24 horas. Los side effects disparan exactamente una vez.
Pega el ID en soporte y trazamos exactamente la llamada, la respuesta y la llamada downstream.
Mismo envelope JSON en cada falla. code, message, doc_url, request_id. Sin nulls sorpresa.
Errores
Sin flags de éxito anidados. Sin mezclas de casing. Sin 200s silenciosos en falla. Si la llamada se rompió, el body te dice exactamente qué llamada, qué esperaba y dónde están los docs.
// 422 Unprocessable Entity
{
"error": {
"code": "INVALID_PLATFORM",
"message": "Channel 'tiktok' is not yet supported on v1.",
"doc_url": "https://www.instantreply.co/api-docs#errors",
"request_id": "req_8f2a0b1c"
}
}Sin tarjeta en la prueba