Skip to content

Spend per campaign and month (the Campaigns report’s grid)

GET
/v1/campaign-spend
curl --request GET \
--url 'https://api.threadkite.app/v1/campaign-spend?from=2026-04&to=2026-09' \
--header 'Authorization: Bearer <token>'

Your campaigns (archived ones only when they have spend), locations and the spend entered for each month in the range. Only for people who see every inbox. 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>
campaigns
required

A to Z

Array<object>
object
campaignId
required
string format: uuid
name
required
string
platform
required
string
Allowed values: google microsoft meta tiktok email other
archived
required

Archived: 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
campaignId
required
string format: uuid
month
required

YYYY-MM

string
locationId
required

Null: the whole organisation

string format: uuid
nullable
amountMinor
required
number

Example

{
"currency": "GBP",
"months": [
"2026-08",
"2026-09"
],
"campaigns": [
{
"name": "Spring sale",
"platform": "google"
}
],
"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
}