Set or clear months of spend
const url = 'https://api.threadkite.app/v1/source-spend';const options = { method: 'PUT', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"entries":[{"sourceId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","month":"2026-09","locationId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","amountMinor":125000}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PUT \ --url https://api.threadkite.app/v1/source-spend \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "entries": [ { "sourceId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "month": "2026-09", "locationId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "amountMinor": 125000 } ] }'Each entry sets a source’s spend for a month (for the whole organisation, or one location); a null amount clears it. Managers and above. Returns the grid for the months changed.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
object
Example
2026-09Null or left out: the whole organisation
Minor units; null clears the month (no spend entered)
Example
125000Responses
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}