Spend Report API
API to retrieve detailed spend reporting data for your Pushnami Ads advertiser account.
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
| Parameter | Type | Required | Description |
|---|---|---|---|
| start_date | string | Yes | Start date in YYYY-MM-DD format |
| end_date | string | Yes | End date in YYYY-MM-DD format |
| columns | string | No | Comma-separated columns. Omit for all default columns. |
| campaign_id | string | No | Filter by campaign ID (e.g., C0001234) |
| creative_id | string | No | Filter by creative ID (e.g., C0001234-001) |
| source_id | string | No | Filter by source ID (e.g., S0001234) |
| page | integer | No | Page number (default: 1) |
| page_size | integer | No | Rows per page (default: 1,000, max: 10,000) |
| include_creatives | boolean | No | Set to true for per-creative breakdowns. See Creative-Level Performance Data. |
Date Constraints
start_datemust be ≤end_datestart_datecannot be more than 32 days in the past- Dates use America/Chicago timezone
Available Columns
| Column | Description | Default |
|---|---|---|
| date | Report date | Yes |
| campaign_id | Campaign identifier | Yes |
| campaign_name | Campaign name | Yes |
| creative_id | Creative identifier | Yes |
| source_id | Traffic source identifier | Yes |
| total_spend | Spend amount (USD) | Yes |
| clicks | Click event count | No |
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.
| Field | Description |
|---|---|
| page | Current page number |
| page_size | Number of rows per page |
| total_rows | Total number of matching rows |
| total_pages | Total 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
| Column | Description | Default |
|---|---|---|
| creative_title | Creative title | Yes |
| creative_message | Creative message text | Yes |
| creative_image_url | Creative image URL | Yes |
| creative_icon_url | Creative icon URL | Yes |
| creative_status | Creative status | Yes |
| impressions | Impression count | Yes |
| conversions | Conversion count | Yes |
| ctr | Click-through rate | Yes |
| cpc | Cost per click | Yes |
| cpa | Cost per acquisition | Yes |
Default columns above are returned when include_creatives=true and columns is omitted.
Aggregation
- Default: One row per campaign + creative combination
- With
dateorsource_id: Adding these columns preserves per-row granularity (one row per campaign + creative + date/source)
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
| Status | Error | Cause |
|---|---|---|
| 400 | Missing required parameters: start_date, end_date | Missing dates |
| 400 | Invalid date format (expected YYYY-MM-DD) | Bad date format |
| 400 | start_date must be ≤ end_date | Invalid date range |
| 400 | start_date cannot be more than 32 days before today | Date too far in past |
| 401 | Authentication required. Use Basic Auth or Bearer token. | No credentials provided |
| 401 | Incorrect username or password | Wrong credentials |
| 403 | User account not confirmed. Please check your email. | Account not verified |
| 403 | User does not have an advertiser_id assigned. Contact support. | No advertiser linked |
| 500 | Internal 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