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

ParameterTypeDescription
limitnumberNumber of records per page
pagenumberPage number
sort_bystringField to sort by
order_bystringSort direction (asc or desc)

Filters

FilterTypeDescription
searchstringSearch 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

FieldTypeRequiredDescription
namestringYesCampaign name
descriptionstring | nullYesCampaign description (send null if not available)
profile_idstringYesUUID of the profile
objectivesstringYesCampaign objectives
keywordsstring | nullYesTarget keywords (send null if not available)
target_audiencestring | nullYesTarget audience description (send null if not available)
tonestring | nullYesDesired tone (send null if not available)
writing_samplesstring | nullYesWriting sample references (send null if not available)
file_idstring | nullYesUploaded 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

ParameterTypeDescription
campaign_idstringUUID 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

ParameterTypeDescription
campaign_idstringUUID of the campaign

Body

FieldTypeRequiredDescription
namestringNoCampaign name
descriptionstring | nullNoCampaign description
keywordsstring | nullNoTarget keywords
objectivesstringNoCampaign objectives
target_audiencestring | nullNoTarget audience
tonestring | nullNoDesired tone
writing_samplesstring | nullNoWriting sample references
file_idstring | nullNoUploaded 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

ParameterTypeDescription
campaign_idstringUUID of the campaign

Parameters

ParameterTypeDescription
limitnumberNumber of records per page
pagenumberPage number
sort_bystringField to sort by
order_bystringSort 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

ParameterTypeDescription
campaign_idstringUUID 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

ParameterTypeDescription
campaign_idstringUUID of the campaign

Body

FieldTypeRequiredDescription
order_item_idsstring[]YesArray 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"
    }
  ]
}

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

ParameterTypeDescription
campaign_idstringUUID of the campaign

Body

FieldTypeRequiredDescription
file_idstringYesThe uploaded file key
file_urlstringYesPublic URL of the uploaded file
file_namestringYesOriginal file name
file_sizenumberYesFile 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
}

On this page