---
title: "Get a single campaign"
method: GET
path: "/v1/projectId/{projectId}/campaigns/{id}"
tags: ["Campaigns"]
---

# Get a single campaign

`GET /v1/projectId/{projectId}/campaigns/{id}`

## Request

- Base URL: `https://api.bluefox.email`
- URL: `https://api.bluefox.email/v1/projectId/{projectId}/campaigns/{id}`
- Auth: HTTP bearer

## Path parameters

- `projectId` string, required
- `id` string, required

## Response `200`

OK

- object
  - `status` integer
  - `result` Campaign
    - `_id` string
    - `name` string
    - `status` 'draft' | 'archive' | 'sent' | 'scheduled' | 'being-sent' | 'error'
    - `subject` string
    - `previewText` string
    - `timeZone` string
    - `subscriberListId` string
    - `segmentId` string, nullable
    - `scheduledTo` string, date-time
    - `senderIdentity` string
    - `replyTo` string
    - `type` 'chamaileon' | 'html' | 'text'
    - `excludeUnengaged` boolean
    - `webVersionEnabled` boolean
    - `feeds` object[]
      - `url` string, required
      - `feedType` 'rss-xml' | 'json', required: "rss-xml" covers both RSS and Atom XML feeds - which one it actually is gets auto-detected from the feed content itself, which changes the array key inside the template (see variableName below).
      - `variableName` string, required: No spaces allowed. This becomes a top-level Handlebars variable in the document (see the `document` field on the parent email for the templating syntax). The feed's parsed items are NOT directly at `{{variableName}}` - they're nested under a feed-shape-dependent array key you loop over with the custom `each` helper: - feedType "rss-xml" that turns out to be RSS: `{{#each <variableName>.item}}...{{/each}}` (array key is the literal word "item", singular) - feedType "rss-xml" that turns out to be Atom: `{{#each <variableName>.entry}}...{{/each}}` (array key is "entry") - feedType "json": the array key is whatever field the source JSON actually uses for its list (e.g. "items", "articles") - inspect the feed's JSON to find it, it is not fixed. Inside the loop, each item's own fields are whatever the feed provides (e.g. RSS gives `{{this.title}}`, `{{this.link}}`, `{{this.pubDate}}`) - there is no fixed schema, it mirrors the feed's actual content one-to-one.
      - `maxItems` integer: Informational only - NOT enforced when the email is sent. To actually limit how many items render, pass limit (and optionally skip) as hash arguments on the each tag itself, e.g. `{{#each news.item limit=5 skip=0}}`.
      - `required` boolean
      - `availableFields` string[]: Informational only, for the app UI - not enforced or used when rendering.
    - `errorMessage` string
    - `createdAt` string, date-time
    - `updatedAt` string, date-time

## Other responses

- `403`: Missing or invalid API key
- `404`: Campaigns not found

---

[API](https://skmtc.dev/bluefox/apis/bluefox-email-public-api.md) · [All operations](https://skmtc.dev/bluefox/apis/bluefox-email-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/bluefox/apis/bluefox-email-public-api/revisions/fa1a0a835c7f?raw)
