First response times in opening hours, overdue threads, by person and inbox
const url = 'https://api.threadkite.app/v1/reports/response?preset=today&granularity=day&inboxType=sales&sourceCategory=website&channel=email&trafficChannel=paid_search&touch=first';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://api.threadkite.app/v1/reports/response?preset=today&granularity=day&inboxType=sales&sourceCategory=website&channel=email&trafficChannel=paid_search&touch=first' \ --header 'Authorization: Bearer <token>'Each lead’s first reply from the team (automated and out-of-office messages left out), timed in the opening hours of the inbox’s location, else the thread’s. On Free, the basic reports (leads by source and first response times) cover the last 30 days; anything else returns 402.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Date range in your organisation’s time zone. Defaults to 30d (the last 30 days, today included); custom needs from and to. Dates without a preset are custom.
Date range in your organisation’s time zone. Defaults to 30d (the last 30 days, today included); custom needs from and to. Dates without a preset are custom.
First day (custom ranges), YYYY-MM-DD
First day (custom ranges), YYYY-MM-DD
Last day, included (custom ranges)
Last day, included (custom ranges)
Group charts over time by day or week. Defaults to days up to 62 days, else weeks
Group charts over time by day or week. Defaults to days up to 62 days, else weeks
Only this inbox (one you can see)
Only this inbox (one you can see)
Only inboxes of this type
Only inboxes of this type
Only leads at this location
Only leads at this location
Only leads from this source
Only leads from this source
Only sources of this kind
Only sources of this kind
Only threads this person owns, or unassigned for threads nobody owns
Only threads this person owns, or unassigned for threads nobody owns
Only leads on this channel
Only leads on this channel
Only leads from this campaign
Only leads from this campaign
Only leads whose visit came this way (paid search, email…)
Only leads whose visit came this way (paid search, email…)
Sales, funnel and campaigns reports: credit each sale to the first lead in the look-back (first) or the latest before the sale (last, the default). Source, source type, channel, campaign and traffic channel filters then apply to that lead.
Sales, funnel and campaigns reports: credit each sale to the first lead in the look-back (first) or the latest before the sale (last, the default). Source, source type, channel, campaign and traffic channel filters then apply to that lead.
Responses
Section titled “Responses”object
object
Your organisation’s time zone
The period compared against
object
The Free plan’s basic reports: only leads by source and first response times are filled in; other breakdowns are empty
Each lead’s first reply from the team (not automated or out-of-office messages), timed in the opening hours of the inbox’s location, else the thread’s
object
Leads with a reply from the team
Answered within the inbox’s response target
Not answered and already past the target
Not answered, still inside the target
Typical (median) first response, in seconds of opening hours
90th percentile: nine in ten answered leads had a reply at least this fast
Answered within target out of leads answered or missed (0 to 1); leads still inside their target are left out
object
Threads waiting on the team past their reply time now, whatever the dates (inbox, inbox type, owner and location filters apply)
object
Median first response of that day’s leads
By who replied first
object
Leads with a reply from the team
Answered within the inbox’s response target
Not answered and already past the target
Not answered, still inside the target
Typical (median) first response, in seconds of opening hours
90th percentile: nine in ten answered leads had a reply at least this fast
Answered within target out of leads answered or missed (0 to 1); leads still inside their target are left out
Who replied first; null for integrations
object
Leads with a reply from the team
Answered within the inbox’s response target
Not answered and already past the target
Not answered, still inside the target
Typical (median) first response, in seconds of opening hours
90th percentile: nine in ten answered leads had a reply at least this fast
Answered within target out of leads answered or missed (0 to 1); leads still inside their target are left out
The inbox’s first-response target, in minutes of opening hours
Threads in the inbox waiting past their reply time now
First replies to leads by the contact’s primary company when the report is worked out (so a contact’s history moves with them), the 20 companies with most first, then “No company”
object
Leads with a reply from the team
Answered within the inbox’s response target
Not answered and already past the target
Not answered, still inside the target
Typical (median) first response, in seconds of opening hours
90th percentile: nine in ten answered leads had a reply at least this fast
Answered within target out of leads answered or missed (0 to 1); leads still inside their target are left out
Null for contacts with no company
“No company” when null
Example
{ "range": { "from": "2026-09-06", "to": "2026-10-05", "days": 30, "preset": "today", "timeZone": "Europe/London", "granularity": "day", "previous": { "from": "2026-09-06", "to": "2026-10-05", "days": 30 } }, "byInbox": [ { "type": "sales" } ], "byCompany": [ { "name": "Acme Fleet Services" } ]}Unusable dates or filters
object
Stable machine-readable reason
With code invalid: every problem with the request, by field (message is the first)
object
Dotted path inside the item, e.g. attributes.price.amountMinor
Example
{ "statusCode": 403, "code": "forbidden", "message": "You do not have permission to do that.", "errors": [ { "message": "Enter the make" } ]}Missing or invalid API key
object
Stable machine-readable reason
With code invalid: every problem with the request, by field (message is the first)
object
Dotted path inside the item, e.g. attributes.price.amountMinor
Example
{ "statusCode": 403, "code": "forbidden", "message": "You do not have permission to do that.", "errors": [ { "message": "Enter the make" } ]}The organisation is on the Free plan (code upgrade_required)
object
Stable machine-readable reason
The feature that needs Pro
Where to upgrade or pay, in the web app
Example
{ "statusCode": 402, "code": "upgrade_required", "message": "Connections are part of Pro. Upgrade to connect texts, calls and more.", "feature": "extraSeats", "upgradePath": "/settings/billing"}The key does not have the scope (or the person the permission)
object
Stable machine-readable reason
With code invalid: every problem with the request, by field (message is the first)
object
Dotted path inside the item, e.g. attributes.price.amountMinor
Example
{ "statusCode": 403, "code": "forbidden", "message": "You do not have permission to do that.", "errors": [ { "message": "Enter the make" } ]}Rate limit reached
object
Stable machine-readable reason
Seconds until another request will be accepted
Example
{ "statusCode": 429, "code": "rate_limited", "message": "Too many requests. Each key can make 120 requests a minute; try again in 12 seconds.", "retryAfter": 12}