Implementation guide
Everything needed to get ReplyTime watching your client conversations: create a key, send two event types, and set your response targets. Most teams finish in under ten minutes.
Quick start
In Settings → API Keys, name a key after wherever you will paste it ("Zapier — production"). Copy the secret immediately; it is shown only once.
Add one HTTP step to the automation that already fires when a client message arrives. POST to /api/v1/events/inbound — the countdown starts on arrival.
Do the same in the flow that runs when your team replies, POSTing to /api/v1/events/outbound. This is what stops the clock and records the response time.
Define a general default (say, 4 hours), then override it per channel type, per client, or per client-and-channel for your VIP accounts.
Authentication
Every request carries an API key as a bearer token. Keys are created in Settings → API Keys and shown exactly once — store it in your automation tool's credential vault, not in a plain step field.
Authorization: Bearer rt_9fXk2Qm7Tb4wPz8LrN0eYh3Vc Content-Type: application/json
Send an inbound event
/api/v1/events/inboundCall this the moment a client writes to you. Unknown clients and channels are created on first sight — you never pre-register anything, and the countdown starts (or resets) on receipt.
client.external_refstringyesYour stable identifier for the client (CRM id, email, anything you already use). Reused across channels to group one account.client.namestringyesDisplay name shown in the dashboard. Upserted on every event.channel.typestringyesFree text — whatsapp, email, instagram_dm, slack, or anything you use.channel.identifierstringyesThe channel-specific address: phone number, inbox, handle.conversation.thread_idstringnoPass it if your source has a stable thread id — otherwise the most recent open conversation on this client/channel is reused.message.occurred_atISO 8601yesWhen the message actually happened, not when the webhook fired.message.senderstringnoSender identifier, if useful to record.message.previewstringnoShort preview text of the message.message.source_toolstringnoWhich automation sent this ("zapier", "make") — handy for debugging.idempotency_keystringrecommendedThe source event's native id (Gmail message id, Slack ts). A repeat call with the same key is a safe no-op.curl -X POST https://replytime.net/api/v1/events/inbound \
-H "Authorization: Bearer rt_9fXk…" \
-H "Content-Type: application/json" \
-d '{
"client": {"external_ref": "atlas-legal", "name": "Atlas Legal"},
"channel": {"type": "whatsapp", "identifier": "+90 532 118 44 07"},
"message": {"occurred_at": "2026-09-11T14:02:11Z", "source_tool": "zapier"},
"idempotency_key": "wamid.HBgL9f…"
}'{
"conversation_id": "2f6a1c9e-...",
"sla_deadline_at": "2026-09-11T14:32:11Z"
}Send an outbound event
/api/v1/events/outboundSame body shape as above, sent when you reply. It closes the open conversation on that client.external_ref + channel pair and records the response time. Extra outbound events on an already-closed conversation return 202 and change nothing, so a chatty thread won't distort your numbers.
{
"client": {"external_ref": "atlas-legal", "name": "Atlas Legal"},
"channel": {"type": "whatsapp", "identifier": "+90 532 118 44 07"},
"message": {"occurred_at": "2026-09-11T14:19:40Z"}
}Automation recipes
The same two calls, wired up in whatever you already run.
How targets are chosen
When several SLA rules could apply to one conversation, the most specific one wins. Nothing else is consulted once a match is found.
Errors & retries
201CreatedInbound event accepted. The response body includes conversation_id and sla_deadline_at.200OKOutbound event accepted (clock stopped), or a duplicate idempotency_key returned the existing conversation as a safe no-op.202Accepted, nothing to doOutbound event with no open conversation on record for this client/channel — nothing to stop a clock on.400Bad requestA required field is missing or occurred_at is not valid ISO 8601. Do not retry unchanged.401UnauthorizedKey missing, malformed, or revoked. Check the Authorization header in your automation.429Rate limited120 events per minute per key. Back off and retry after a short delay.Events are deduplicated on idempotency_key per tenant with no expiry — safe to let your automation tool retry indefinitely.