Leads over time and by source, inbox, location, item, channel and owner
const url = 'https://api.threadkite.app/v1/reports/leads?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/leads?preset=today&granularity=day&inboxType=sales&sourceCategory=website&channel=email&trafficChannel=paid_search&touch=first' \ --header 'Authorization: Bearer <token>'Counted by the lead rule: one lead per contact, source and item within your lead period. Test leads are left out. Only the inboxes you can see. 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
Leads by the lead rule (test leads left out)
object
The day, or the Monday of the week
The same point in the previous period (null past its end)
Most leads first
object
Null for leads with no source
Logo address; null shows an initial badge
object
object
object
object
“No location” when there is none
The ten items with most leads
object
object
Where the item came from: manual, csv, api or an integration key
The item’s id in its source
From the attributes
The availability: in_stock, out_of_stock, preorder or backorder for products; an industry pack’s item types have their own
object
Amount in minor units (pence, cents)
ISO 4217
How the price is charged: one_off (once), monthly (every month) or annual (every year)
Image links, main image first
When it was removed from the catalogue (no longer in stock). Removed items stay on the leads and threads that mention them
Advert or product page
Usually sold as an add-on to something else (a warranty, delivery, an onboarding package). Suggestions only
The item types it is usually added to; empty means anything
object
Google/Meta title
Google/Meta description
Product page. Google/Meta link
Main image first. Google/Meta image_link and additional_image_link
Google/Meta price
object
Amount in minor units (pence, cents)
ISO 4217
Google/Meta sale_price
object
Amount in minor units (pence, cents)
ISO 4217
Google/Meta availability
Google/Meta condition
Google/Meta brand
GTIN-8, 12, 13 or 14. Google/Meta gtin
Google/Meta mpn
Your own stock code
Google/Meta google_product_category
Google/Meta product_type
Shared by variants. Google/Meta item_group_id
Google/Meta size
Google/Meta color
Google/Meta material
Google/Meta pattern
Google/Meta custom_label_0
Google/Meta custom_label_1
Google/Meta custom_label_2
Google/Meta custom_label_3
Google/Meta custom_label_4
object
Where the item came from: manual, csv, api or an integration key
The item’s id in its source
From the attributes
The availability: in_stock, out_of_stock, preorder or backorder for products; an industry pack’s item types have their own
object
Amount in minor units (pence, cents)
ISO 4217
How the price is charged: one_off (once), monthly (every month) or annual (every year)
Image links, main image first
When it was removed from the catalogue (no longer in stock). Removed items stay on the leads and threads that mention them
Advert or product page
Usually sold as an add-on to something else (a warranty, delivery, an onboarding package). Suggestions only
The item types it is usually added to; empty means anything
object
Advert title; made from make, model and derivative when left out. Google/Meta title
Google/Meta description
Number plate. Meta vehicle_registration_plate
Google/Meta vin
Google brand, Meta make
Google/Meta model
Full version name
Google/Meta trim
Google/Meta year
First registration date, YYYY-MM-DD
Google mileage, Meta mileage.value and .unit
object
Google condition and certified_pre_owned, Meta state_of_vehicle
Google engine, Meta fuel_type
Meta transmission
Meta drivetrain
Exterior colour. Google color, Meta exterior_color
Meta interior_color
Google/Meta body_style
Google/Meta price
object
Amount in minor units (pence, cents)
ISO 4217
Google/Meta sale_price
object
Amount in minor units (pence, cents)
ISO 4217
object
object
Amount in minor units (pence, cents)
ISO 4217
object
Amount in minor units (pence, cents)
ISO 4217
Main image first. Google image_link/additional_image_link, Meta image[n].url
Advert page. Google link, Meta url
Google/Meta availability
object
By the thread’s owner
object
Null for threads nobody owns
Most leads first; the twenty with most leads
object
Null for leads with no campaign
“No campaign” when null
object
Null for leads with no tracking (marketplaces, calls)
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
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 } }, "bySource": [ { "name": "Google Ads", "category": "website" } ], "byCategory": [ { "category": "website" } ], "byInbox": [ { "name": "Leeds Sales", "type": "sales" } ], "byInboxType": [ { "type": "sales" } ], "byLocation": [ { "name": "Leeds" } ], "byItem": [ { "item": { "source": "my-dms", "externalId": "SKU-1042", "title": "Oak dining table", "status": "in_stock", "price": { "amountMinor": 1299500, "currency": "GBP" }, "billing": "one_off", "addOnFor": [ "product" ], "attributes": { "title": "Merino jumper", "price": { "amountMinor": 1299500, "currency": "GBP" }, "salePrice": { "amountMinor": 1299500, "currency": "GBP" }, "availability": "in_stock", "condition": "new" }, "type": "product" } } ], "byChannel": [ { "channel": "email" } ], "byOwner": [ { "name": "James Patel" } ], "byCampaign": [ { "name": "Spring sale", "platform": "google" } ], "byTrafficChannel": [ { "channel": "paid_search", "label": "Paid search" } ], "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}