Skip to main content

Spend Report API

API to retrieve detailed spend reporting data for your Pushnami Ads advertiser account.

Breaking Change — April 2026

All responses now include a pagination object. If your code strictly validates response keys, update it to accept this new field. No action needed if you access data via response["columns"] and response["data"] only.

Quick Start

Get your spend report in one request:

curl -u 'username:password' \
'https://adnetpn.com/ads/spend-report?start_date=2025-12-01&end_date=2025-12-03'

Use your Pushnami Ads login credentials.

Endpoint

GET https://adnetpn.com/ads/spend-report

Parameters

ParameterTypeRequiredDescription
start_datestringYesStart date in YYYY-MM-DD format
end_datestringYesEnd date in YYYY-MM-DD format
columnsstringNoComma-separated columns. Omit for all default columns.
campaign_idstringNoFilter by campaign ID (e.g., C0001234)
creative_idstringNoFilter by creative ID (e.g., C0001234-001)
source_idstringNoFilter by source ID (e.g., S0001234)
pageintegerNoPage number (default: 1)
page_sizeintegerNoRows per page (default: 1,000, max: 10,000)
include_creativesbooleanNoSet to true for per-creative breakdowns. See Creative-Level Performance Data.

Date Constraints

  • start_date must be ≤ end_date
  • start_date cannot be more than 32 days in the past
  • Dates use America/Chicago timezone

Available Columns

ColumnDescriptionDefault
dateReport dateYes
campaign_idCampaign identifierYes
campaign_nameCampaign nameYes
creative_idCreative identifierYes
source_idTraffic source identifierYes
total_spendSpend amount (USD)Yes
clicksClick event countNo

Default: If columns is omitted, all default columns are returned. Columns marked "No" must be explicitly requested via the columns parameter.

Pagination

All responses include a pagination object. Use the page and page_size parameters to control pagination.

FieldDescription
pageCurrent page number
page_sizeNumber of rows per page
total_rowsTotal number of matching rows
total_pagesTotal number of pages

Paginated Request

curl -u 'username:password' \
'https://adnetpn.com/ads/spend-report?start_date=2025-12-01&end_date=2025-12-03&page=2&page_size=100'

Response:

{
"columns": ["date", "campaign_id", "campaign_name", "creative_id", "source_id", "total_spend"],
"data": [
{
"date": "2025-12-02",
"campaign_id": "C0001234",
"campaign_name": "Campaign Name",
"creative_id": "C0001234-002",
"source_id": "S0001234",
"total_spend": 87.50
}
],
"pagination": {
"page": 2,
"page_size": 100,
"total_rows": 250,
"total_pages": 3
}
}

Creative-Level Performance Data

Set include_creatives=true to get per-creative performance breakdowns. When enabled, the response includes additional creative-specific columns and the default column set changes.

Creative Columns

ColumnDescriptionDefault
creative_titleCreative titleYes
creative_messageCreative message textYes
creative_image_urlCreative image URLYes
creative_icon_urlCreative icon URLYes
creative_statusCreative statusYes
impressionsImpression countYes
conversionsConversion countYes
ctrClick-through rateYes
cpcCost per clickYes
cpaCost per acquisitionYes

Default columns above are returned when include_creatives=true and columns is omitted.

Aggregation

  • Default: One row per campaign + creative combination
  • With date or source_id: Adding these columns preserves per-row granularity (one row per campaign + creative + date/source)
note

Zero-spend creatives are included in the response. This is useful for identifying creatives that have been set up but have not yet received traffic.

Creative Request

curl -u 'username:password' \
'https://adnetpn.com/ads/spend-report?start_date=2025-12-01&end_date=2025-12-03&include_creatives=true'

Response:

{
"columns": ["date", "campaign_id", "campaign_name", "creative_id", "creative_title", "creative_message", "creative_image_url", "creative_icon_url", "creative_status", "source_id", "total_spend", "impressions", "conversions", "ctr", "cpc", "cpa"],
"data": [
{
"date": "2025-12-01",
"campaign_id": "C0001234",
"campaign_name": "Campaign Name",
"creative_id": "C0001234-001",
"creative_title": "Holiday Sale Alert",
"creative_message": "Don't miss our biggest sale of the year!",
"creative_image_url": "https://example.com/image.png",
"creative_icon_url": "https://example.com/icon.png",
"creative_status": "active",
"source_id": "S0001234",
"total_spend": 123.45,
"impressions": 15000,
"conversions": 45,
"ctr": 0.0312,
"cpc": 0.25,
"cpa": 2.74
}
],
"pagination": {
"page": 1,
"page_size": 1000,
"total_rows": 1,
"total_pages": 1
}
}

Examples

Get All Data

curl -u 'username:password' \
'https://adnetpn.com/ads/spend-report?start_date=2025-12-01&end_date=2025-12-03'

Response:

{
"columns": ["date", "campaign_id", "campaign_name", "creative_id", "source_id", "total_spend"],
"data": [
{
"date": "2025-12-01",
"campaign_id": "C0001234",
"campaign_name": "Campaign Name",
"creative_id": "C0001234-001",
"source_id": "S0001234",
"total_spend": 123.45
}
],
"pagination": {
"page": 1,
"page_size": 1000,
"total_rows": 1,
"total_pages": 1
}
}

Get Specific Columns

curl -u 'username:password' \
'https://adnetpn.com/ads/spend-report?start_date=2025-12-01&end_date=2025-12-03&columns=date,total_spend'

Response:

{
"columns": ["date", "total_spend"],
"data": [
{"date": "2025-12-01", "total_spend": 221.00},
{"date": "2025-12-02", "total_spend": 50.00},
{"date": "2025-12-03", "total_spend": 75.21}
],
"pagination": {
"page": 1,
"page_size": 1000,
"total_rows": 3,
"total_pages": 1
}
}

Get Clicks

curl -u 'username:password' \
'https://adnetpn.com/ads/spend-report?start_date=2025-12-01&end_date=2025-12-03&columns=date,total_spend,clicks'

Response:

{
"columns": ["date", "total_spend", "clicks"],
"data": [
{"date": "2025-12-01", "total_spend": 221.00, "clicks": 1523},
{"date": "2025-12-02", "total_spend": 50.00, "clicks": 342},
{"date": "2025-12-03", "total_spend": 75.21, "clicks": 587}
],
"pagination": {
"page": 1,
"page_size": 1000,
"total_rows": 3,
"total_pages": 1
}
}

Filter by Campaign

curl -u 'username:password' \
'https://adnetpn.com/ads/spend-report?start_date=2025-12-01&end_date=2025-12-03&campaign_id=C0001234'

Filter by Source

curl -u 'username:password' \
'https://adnetpn.com/ads/spend-report?start_date=2025-12-01&end_date=2025-12-03&source_id=S0004483'

Code Examples

Python

import requests

response = requests.get(
'https://adnetpn.com/ads/spend-report',
auth=('username', 'password'),
params={'start_date': '2025-12-01', 'end_date': '2025-12-03'}
)

print(response.json())

JavaScript

const credentials = btoa('username:password');

const response = await fetch(
'https://adnetpn.com/ads/spend-report?start_date=2025-12-01&end_date=2025-12-03',
{ headers: { 'Authorization': `Basic ${credentials}` } }
);

console.log(await response.json());

cURL

curl -u 'username:password' \
'https://adnetpn.com/ads/spend-report?start_date=2025-12-01&end_date=2025-12-03'

Error Responses

StatusErrorCause
400Missing required parameters: start_date, end_dateMissing dates
400Invalid date format (expected YYYY-MM-DD)Bad date format
400start_date must be ≤ end_dateInvalid date range
400start_date cannot be more than 32 days before todayDate too far in past
401Authentication required. Use Basic Auth or Bearer token.No credentials provided
401Incorrect username or passwordWrong credentials
403User account not confirmed. Please check your email.Account not verified
403User does not have an advertiser_id assigned. Contact support.No advertiser linked
500Internal server error. Request ID: ...Server error – include Request ID when contacting support

Support

For API access or issues, contact your Pushnami account representative or email us: support@pushnami.com