Spend per source and month (the Sources report’s grid)
const url = 'https://api.threadkite.app/v1/source-spend?from=2026-04&to=2026-09';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/source-spend?from=2026-04&to=2026-09' \ --header 'Authorization: Bearer <token>'Your sources (hidden and archived ones only when they have spend), locations and the spend entered for each month in the range. Part of Pro.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”First month, YYYY-MM. Defaults to five months before to
Example
2026-04First month, YYYY-MM. Defaults to five months before to
Last month, YYYY-MM. Defaults to this month (at most 24 months shown)
Example
2026-09Last month, YYYY-MM. Defaults to this month (at most 24 months shown)
Responses
Section titled “Responses”object
A to Z
object
Its key (CSV files can use it too)
Logo address; null shows an initial badge
Archived or hidden: shown only when it has spend
object
object
YYYY-MM
Null: the whole organisation
Minor units of the currency (pence for GBP)
Example
{ "currency": "GBP", "months": [ "2026-08", "2026-09" ], "sources": [ { "name": "Google Ads", "key": "google-ads", "category": "website" } ], "locations": [ { "name": "Leeds" } ], "entries": [ { "month": "2026-09", "amountMinor": 125000 } ]}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}