Bearer auth. Cursor pagination. Idempotency keys. Signed webhooks. The API your team would have built if it had the weekend.
Pick a runtime
const API_BASE = process.env.IR_API_URL ?? 'https://api.instantreply.co';
const headers = { 'Authorization': `Bearer ${process.env.IR_API_KEY}` };
// List active conversations
const res = await fetch(`${API_BASE}/v1/conversations?status=active`, { headers });
const { data, pagination } = await res.json();
for (const c of data) {
if (c.last_message_preview?.includes('refund')) {
await fetch(`${API_BASE}/v1/conversations/${c.id}`, {
method: 'PATCH', headers: { ...headers, 'Content-Type': 'application/json' },
body: JSON.stringify({ 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 endpoint/v1/templatesList WhatsApp message templates/v1/templates/:idFetch one template/v1/templates/:id/validateValidate category fit + UTILITY coaching (flagged phrases, cost gap)/v1/templates/:id/submitSubmit template to Meta for approval/v1/trigger/status/:idExplain a delivery outcome — what happened, fault (ours vs Meta), next step/v1/developer/capabilitiesScopes and features available to the current key/v1/developer/onboardingIntegration checklist — which steps are done/v1/developer/limitsRate limits and quotas for the current plan tier/v1/developer/troubleshooting/errors/:codePlain-English explanation of a Meta or platform error codeDesign
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"
}
}