Skip to content

Spend per source and month (the Sources report’s grid)

GET
/v1/source-spend
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.

from

First month, YYYY-MM. Defaults to five months before to

string
/^\d{4}-(0[1-9]|1[0-2])$/

Example

2026-04

First month, YYYY-MM. Defaults to five months before to

to

Last month, YYYY-MM. Defaults to this month (at most 24 months shown)

string
/^\d{4}-(0[1-9]|1[0-2])$/

Example

2026-09

Last month, YYYY-MM. Defaults to this month (at most 24 months shown)

Media typeapplication/json
object
currency
required
string
months
required
Array<string>
sources
required

A to Z

Array<object>
object
sourceId
required
string format: uuid
name
required
string
key
required

Its key (CSV files can use it too)

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

Logo address; null shows an initial badge

string
nullable
archived
required

Archived or hidden: shown only when it has spend

boolean
locations
required
Array<object>
object
locationId
required
string format: uuid
name
required
string
entries
required
Array<object>
object
sourceId
required
string format: uuid
month
required

YYYY-MM

string
locationId
required

Null: the whole organisation

string format: uuid
nullable
amountMinor
required

Minor units of the currency (pence for GBP)

number

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
}
]
}
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
}