Skip to content

First response times in opening hours, overdue threads, by person and inbox

GET
/v1/reports/response
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.

preset

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.

string
Allowed values: today 7d 30d this_month last_month 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.

from

First day (custom ranges), YYYY-MM-DD

string format: date

First day (custom ranges), YYYY-MM-DD

to

Last day, included (custom ranges)

string format: date

Last day, included (custom ranges)

granularity

Group charts over time by day or week. Defaults to days up to 62 days, else weeks

string
Allowed values: day week

Group charts over time by day or week. Defaults to days up to 62 days, else weeks

inboxId

Only this inbox (one you can see)

string format: uuid

Only this inbox (one you can see)

inboxType

Only inboxes of this type

string
Allowed values: sales service parts bodyshop general

Only inboxes of this type

locationId

Only leads at this location

string format: uuid

Only leads at this location

sourceId

Only leads from this source

string format: uuid

Only leads from this source

sourceCategory

Only sources of this kind

string
Allowed values: website marketplace website_provider dms social phone email other

Only sources of this kind

ownerUserId

Only threads this person owns, or unassigned for threads nobody owns

string
>= 1 characters <= 100 characters

Only threads this person owns, or unassigned for threads nobody owns

channel

Only leads on this channel

string
Allowed values: email sms whatsapp chat phone form api marketplace visit messenger instagram internal

Only leads on this channel

campaignId

Only leads from this campaign

string format: uuid

Only leads from this campaign

trafficChannel

Only leads whose visit came this way (paid search, email…)

string
Allowed values: paid_search paid_social display email sms affiliate organic_search organic_social referral direct other

Only leads whose visit came this way (paid search, email…)

touch

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.

string
Allowed values: first last

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.

Media typeapplication/json
object
range
required
object
from
required
string format: date
to
required
string format: date
days
required
number
preset
required
string
Allowed values: today 7d 30d this_month last_month custom
timeZone
required

Your organisation’s time zone

string
granularity
required
string
Allowed values: day week
previous
required

The period compared against

object
from
required
string format: date
to
required
string format: date
days
required
number
limited
required

The Free plan’s basic reports: only leads by source and first response times are filled in; other breakdowns are empty

boolean
overall
required

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
required
number
answered
required

Leads with a reply from the team

number
withinTarget
required

Answered within the inbox’s response target

number
missed
required

Not answered and already past the target

number
waiting
required

Not answered, still inside the target

number
medianSeconds
required

Typical (median) first response, in seconds of opening hours

number
nullable
p90Seconds
required

90th percentile: nine in ten answered leads had a reply at least this fast

number
nullable
withinTargetShare
required

Answered within target out of leads answered or missed (0 to 1); leads still inside their target are left out

number
nullable
previous
required
object
leads
required
number
medianSeconds
required
number
nullable
withinTargetShare
required
number
nullable
overdueNow
required

Threads waiting on the team past their reply time now, whatever the dates (inbox, inbox type, owner and location filters apply)

number
series
required
Array<object>
object
date
required
string format: date
answered
required
number
medianSeconds
required

Median first response of that day’s leads

number
nullable
byPerson
required

By who replied first

Array<object>
object
leads
required
number
answered
required

Leads with a reply from the team

number
withinTarget
required

Answered within the inbox’s response target

number
missed
required

Not answered and already past the target

number
waiting
required

Not answered, still inside the target

number
medianSeconds
required

Typical (median) first response, in seconds of opening hours

number
nullable
p90Seconds
required

90th percentile: nine in ten answered leads had a reply at least this fast

number
nullable
withinTargetShare
required

Answered within target out of leads answered or missed (0 to 1); leads still inside their target are left out

number
nullable
userId
required

Who replied first; null for integrations

string
nullable
name
required
string
byInbox
required
Array<object>
object
leads
required
number
answered
required

Leads with a reply from the team

number
withinTarget
required

Answered within the inbox’s response target

number
missed
required

Not answered and already past the target

number
waiting
required

Not answered, still inside the target

number
medianSeconds
required

Typical (median) first response, in seconds of opening hours

number
nullable
p90Seconds
required

90th percentile: nine in ten answered leads had a reply at least this fast

number
nullable
withinTargetShare
required

Answered within target out of leads answered or missed (0 to 1); leads still inside their target are left out

number
nullable
inboxId
required
string format: uuid
name
required
string
type
required
string
Allowed values: sales service parts bodyshop general
targetMinutes
required

The inbox’s first-response target, in minutes of opening hours

number
overdueNow
required

Threads in the inbox waiting past their reply time now

number
byCompany
required

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”

Array<object>
object
leads
required
number
answered
required

Leads with a reply from the team

number
withinTarget
required

Answered within the inbox’s response target

number
missed
required

Not answered and already past the target

number
waiting
required

Not answered, still inside the target

number
medianSeconds
required

Typical (median) first response, in seconds of opening hours

number
nullable
p90Seconds
required

90th percentile: nine in ten answered leads had a reply at least this fast

number
nullable
withinTargetShare
required

Answered within target out of leads answered or missed (0 to 1); leads still inside their target are left out

number
nullable
companyId
required

Null for contacts with no company

string format: uuid
nullable
name
required

“No company” when null

string

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

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
errors

With code invalid: every problem with the request, by field (message is the first)

Array<object>
object
path
required

Dotted path inside the item, e.g. attributes.price.amountMinor

string
message
required
string

Example

{
"statusCode": 403,
"code": "forbidden",
"message": "You do not have permission to do that.",
"errors": [
{
"message": "Enter the make"
}
]
}

Missing or invalid API key

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
errors

With code invalid: every problem with the request, by field (message is the first)

Array<object>
object
path
required

Dotted path inside the item, e.g. attributes.price.amountMinor

string
message
required
string

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)

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
feature
required

The feature that needs Pro

string
nullable
Allowed values: extraSeats connections aiAssistant aiReplies rules fullReports api inboxes bulkMessages videoMessages
upgradePath
required

Where to upgrade or pay, in the web app

string

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)

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
errors

With code invalid: every problem with the request, by field (message is the first)

Array<object>
object
path
required

Dotted path inside the item, e.g. attributes.price.amountMinor

string
message
required
string

Example

{
"statusCode": 403,
"code": "forbidden",
"message": "You do not have permission to do that.",
"errors": [
{
"message": "Enter the make"
}
]
}

Rate limit reached

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
retryAfter
required

Seconds until another request will be accepted

number

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
}