Campaigns
Endpoints for creating, managing, and tracking campaigns including articles, order items, and questionnaire files.
List campaigns
GET /campaigns
List campaigns for your team.
Scope: campaigns.lists
Description: API tokens only see campaigns for their own team.
Parameters
| Parameter | Type | Description |
|---|---|---|
limit | number | Number of records per page |
page | number | Page number |
sort_by | string | Field to sort by |
order_by | string | Sort direction (asc or desc) |
Filters
| Filter | Type | Description |
|---|---|---|
search | string | Search by campaign name |
Request
curl "https://api.presscart.com/campaigns?limit=10" \
-H "Authorization: Bearer $PRESSCART_API_TOKEN"Response
{
"records": [
{
"id": "66666666-6666-6666-6666-666666666666",
"name": "Q2 Product Launch",
"reference": "CAMP-Q2-2026",
"profile_id": "22222222-2222-2222-2222-222222222222",
"created_at": "2026-02-01T10:00:00.000Z",
"updated_at": "2026-02-15T08:00:00.000Z",
"deleted_at": null,
"articles": [
{
"id": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee",
"name": "Premium Tech Feature",
"campaign_id": "66666666-6666-6666-6666-666666666666",
"live_url": "https://techdaily.com/articles/premium-tech-feature",
"order_item": {
"name": "Premium Tech Feature",
"outlet": {
"name": "TechDaily",
"logo": "https://cdn.presscart.com/logos/techdaily.png"
},
"addons": []
}
}
],
"questionnaire": null,
"total_articles": 1
}
],
"total_records": 3,
"total_pages": 1,
"current_page": 1,
"next_page": null,
"previous_page": null
}Create campaign
POST /campaigns
Create a new campaign.
Scope: campaigns.create
Description: Creates a campaign for a profile owned by the token's team. The request body is a merged campaign and questionnaire payload. Fields description, keywords, target_audience, tone, writing_samples, and file_id are nullable but must be present in the request. Send null when you do not have a value.
Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Campaign name |
description | string | null | Yes | Campaign description (send null if not available) |
profile_id | string | Yes | UUID of the profile |
objectives | string | Yes | Campaign objectives |
keywords | string | null | Yes | Target keywords (send null if not available) |
target_audience | string | null | Yes | Target audience description (send null if not available) |
tone | string | null | Yes | Desired tone (send null if not available) |
writing_samples | string | null | Yes | Writing sample references (send null if not available) |
file_id | string | null | Yes | Uploaded file key (send null if not available) |
Request
curl -X POST "https://api.presscart.com/campaigns" \
-H "Authorization: Bearer $PRESSCART_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Q2 product launch",
"description": null,
"profile_id": "22222222-2222-2222-2222-222222222222",
"objectives": "Announce the launch and drive branded search demand.",
"keywords": null,
"target_audience": null,
"tone": null,
"writing_samples": null,
"file_id": null
}'Response
{
"id": "66666666-6666-6666-6666-666666666666",
"name": "Q2 product launch",
"description": null,
"reference": null,
"profile_id": "22222222-2222-2222-2222-222222222222",
"v1_campaign_id": null,
"status": null,
"goals": null,
"target_date": null,
"budget": null,
"created_at": "2026-03-24T10:00:00.000Z",
"updated_at": "2026-03-24T10:00:00.000Z",
"deleted_at": null,
"questionnaire_id": "qqqqqqqq-qqqq-qqqq-qqqq-qqqqqqqqqqqq",
"keywords": null,
"objectives": "Announce the launch and drive branded search demand.",
"target_audience": null,
"tone": null,
"writing_samples": null,
"file_id": null,
"total_articles": 0
}Get campaign
GET /campaigns/{campaign_id}
Retrieve a single campaign by ID.
Scope: campaigns.read
Description: Returns campaign details, profile summary, questionnaire, and total articles count.
Path parameters
| Parameter | Type | Description |
|---|---|---|
campaign_id | string | UUID of the campaign |
Request
curl "https://api.presscart.com/campaigns/66666666-6666-6666-6666-666666666666" \
-H "Authorization: Bearer $PRESSCART_API_TOKEN"Response
{
"id": "66666666-6666-6666-6666-666666666666",
"name": "Q2 Product Launch",
"description": "Campaign for Q2 product announcements",
"reference": "CAMP-Q2-2026",
"profile_id": "22222222-2222-2222-2222-222222222222",
"v1_campaign_id": null,
"status": null,
"goals": null,
"target_date": null,
"budget": null,
"created_at": "2026-02-01T10:00:00.000Z",
"updated_at": "2026-02-15T08:00:00.000Z",
"deleted_at": null,
"profile": {
"id": "22222222-2222-2222-2222-222222222222",
"name": "Acme Corp",
"logo": null
},
"questionnaire": {
"id": "qqqqqqqq-qqqq-qqqq-qqqq-qqqqqqqqqqqq",
"campaign_id": "66666666-6666-6666-6666-666666666666",
"objectives": "Announce the launch and drive branded search demand.",
"keywords": "product launch, Q2, tech",
"target_audience": "Tech decision-makers, CTOs, engineering leads",
"tone": "Professional and authoritative",
"writing_samples": null,
"file_id": null,
"file_name": null,
"file_size": null,
"file_url": null,
"created_at": "2026-02-01T10:00:00.000Z",
"updated_at": "2026-02-15T08:00:00.000Z",
"deleted_at": null
},
"total_articles": 3
}Update campaign
PUT /campaigns/{campaign_id}
Update a campaign.
Scope: campaigns.update
Description: Updates campaign and questionnaire fields. All body fields are optional.
Path parameters
| Parameter | Type | Description |
|---|---|---|
campaign_id | string | UUID of the campaign |
Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | Campaign name |
description | string | null | No | Campaign description |
keywords | string | null | No | Target keywords |
objectives | string | No | Campaign objectives |
target_audience | string | null | No | Target audience |
tone | string | null | No | Desired tone |
writing_samples | string | null | No | Writing sample references |
file_id | string | null | No | Uploaded file key |
Request
curl -X PUT "https://api.presscart.com/campaigns/66666666-6666-6666-6666-666666666666" \
-H "Authorization: Bearer $PRESSCART_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Q2 product launch - updated",
"objectives": "Updated objectives for Q2."
}'Response
Returns the updated campaign object (same shape as Create campaign response).
List campaign articles
GET /campaigns/{campaign_id}/articles
List articles for a campaign.
Scope: campaigns.read
Description: Returns a paginated list of articles associated with the campaign, including status history and outlet details.
Path parameters
| Parameter | Type | Description |
|---|---|---|
campaign_id | string | UUID of the campaign |
Parameters
| Parameter | Type | Description |
|---|---|---|
limit | number | Number of records per page |
page | number | Page number |
sort_by | string | Field to sort by |
order_by | string | Sort direction (asc or desc) |
Request
curl "https://api.presscart.com/campaigns/66666666-6666-6666-6666-666666666666/articles" \
-H "Authorization: Bearer $PRESSCART_API_TOKEN"Response
{
"records": [
{
"id": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee",
"name": "Premium Tech Feature",
"live_url": "https://techdaily.com/articles/premium-tech-feature",
"brief_google_doc_url": null,
"draft_google_doc_url": null,
"campaign_id": "66666666-6666-6666-6666-666666666666",
"order_item_id": "55555555-5555-5555-5555-555555555555",
"created_at": "2026-02-05T10:00:00.000Z",
"updated_at": "2026-03-10T14:00:00.000Z",
"deleted_at": null,
"total_images": 2,
"writer": {
"id": "wwwwwwww-wwww-wwww-wwww-wwwwwwwwwwww",
"first_name": "Jane",
"last_name": "Smith"
},
"status": [
{
"effective_at": "2026-03-10T14:00:00.000Z",
"notes": null,
"name": "Published",
"prefix": "published",
"color": "green"
}
],
"order_item": {
"name": "Premium Tech Feature",
"outlet": {
"name": "TechDaily",
"logo": "https://cdn.presscart.com/logos/techdaily.png",
"website_url": "https://techdaily.com"
},
"addons": [],
"includes": [
{
"channel_type": "NEWSLETTER",
"placement_type": "MENTION"
}
]
}
}
],
"total_records": 3
}Get article status counts
GET /campaigns/{campaign_id}/articles/status-count
Get article counts grouped by status.
Scope: campaigns.read
Description: Returns the number of articles in each status for the given campaign.
Path parameters
| Parameter | Type | Description |
|---|---|---|
campaign_id | string | UUID of the campaign |
Request
curl "https://api.presscart.com/campaigns/66666666-6666-6666-6666-666666666666/articles/status-count" \
-H "Authorization: Bearer $PRESSCART_API_TOKEN"Response
{
"records": [
{
"name": "Published",
"prefix": "published",
"id": "s1s1s1s1-s1s1-s1s1-s1s1-s1s1s1s1s1s1",
"count": 2
},
{
"name": "In Progress",
"prefix": "in_progress",
"id": "s2s2s2s2-s2s2-s2s2-s2s2-s2s2s2s2s2s2",
"count": 1
},
{
"name": "Draft",
"prefix": "draft",
"id": "s3s3s3s3-s3s3-s3s3-s3s3-s3s3s3s3s3s3",
"count": 0
}
]
}Assign order items to campaign
POST /campaigns/{campaign_id}/order-items
Assign order items to a campaign.
Scope: campaigns.update
Description: Assigns existing order items to the specified campaign.
Path parameters
| Parameter | Type | Description |
|---|---|---|
campaign_id | string | UUID of the campaign |
Body
| Field | Type | Required | Description |
|---|---|---|---|
order_item_ids | string[] | Yes | Array of order item UUIDs to assign |
Request
curl -X POST "https://api.presscart.com/campaigns/66666666-6666-6666-6666-666666666666/order-items" \
-H "Authorization: Bearer $PRESSCART_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"order_item_ids": [
"55555555-5555-5555-5555-555555555555"
]
}'Response
{
"records": [
{
"id": "55555555-5555-5555-5555-555555555555",
"campaign_id": "66666666-6666-6666-6666-666666666666"
}
]
}Link questionnaire file
POST /questionnaires/{campaign_id}/link
Link a file to a campaign questionnaire.
Scope: campaigns.update
Description: Links a previously uploaded file to the campaign questionnaire.
Important: The upload route (
POST /assets/presign) currently requires a Supabase user session and is not API-token enabled. API-token integrations can link an already-uploaded file, but cannot complete the presign/upload/link flow without a user-authenticated upload step.
Path parameters
| Parameter | Type | Description |
|---|---|---|
campaign_id | string | UUID of the campaign |
Body
| Field | Type | Required | Description |
|---|---|---|---|
file_id | string | Yes | The uploaded file key |
file_url | string | Yes | Public URL of the uploaded file |
file_name | string | Yes | Original file name |
file_size | number | Yes | File size in bytes |
Request
curl -X POST "https://api.presscart.com/questionnaires/66666666-6666-6666-6666-666666666666/link" \
-H "Authorization: Bearer $PRESSCART_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"file_id": "uploaded-file-key.pdf",
"file_url": "https://storage.example.com/uploaded-file-key.pdf",
"file_name": "brief.pdf",
"file_size": 123456
}'Response
{
"id": "qqqqqqqq-qqqq-qqqq-qqqq-qqqqqqqqqqqq",
"campaign_id": "66666666-6666-6666-6666-666666666666",
"objectives": "Announce the launch and drive branded search demand.",
"keywords": null,
"target_audience": null,
"tone": null,
"writing_samples": null,
"file_id": "uploaded-file-key.pdf",
"file_name": "brief.pdf",
"file_size": 123456,
"file_url": "https://storage.example.com/uploaded-file-key.pdf",
"created_at": "2026-02-01T10:00:00.000Z",
"updated_at": "2026-03-24T10:00:00.000Z",
"deleted_at": null
}