Bearer auth. Cursor pagination. Idempotency keys. Signed webhooks. The API your team would have built if it had the weekend.
Pick a runtime
import InstantReply from '@instantreply/node'
const ir = new InstantReply({ apiKey: process.env.IR_API_KEY })
// Paginate every active conversation, no manual cursor math
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'] })
}
}v1 surface
/v1/conversationsList conversations, cursor pagination/v1/conversations/:idFetch one conversation/v1/conversations/:idUpdate status, assignee, tags/v1/conversations/:id/messagesList messages in a conversation/v1/conversations/:id/messagesSend an outbound reply/v1/contactsList contacts/v1/contacts/:idFetch one contact/v1/contacts/:idUpdate name, email, lead stage/v1/channelsConnected platforms, status/v1/analytics/summaryDashboard analytics by date range/v1/usageTier, rate-limit headroom, request count/v1/webhooksList registered webhook endpoints/v1/webhooksRegister a webhook, returns signing secret/v1/webhooks/:idRevoke a webhook endpointDesign
Every list endpoint returns has_more and next_cursor. No skipped records under load, no off-by-one.
Pass a UUID and retry safely for 24 hours. Side effects fire exactly once.
Paste the ID in support and we trace the exact request, exact response, exact downstream call.
Same JSON envelope on every failure. code, message, doc_url, request_id. No surprise nulls.
Errors
No nested success flags. No mixed casing. No silent 200s on failure. If the call broke, the body tells you exactly which call, what it expected, and where the docs live.
// 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"
}
}