---
title: "Create a subscriber list"
method: POST
path: "/v1/projectId/{projectId}/subscriber-lists"
tags: ["Subscriber Lists"]
---

# Create a subscriber list

`POST /v1/projectId/{projectId}/subscriber-lists`

## Request

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

doubleOptIn.emailId (if given) must be a transactional email belonging to this same project - a valid ID from a different project 404s. When doubleOptIn.active is true, that email's content must also include {{verifyLink}}.

## Path parameters

- `projectId` string, required

## Request body

- SubscriberListInput
  - `name` string, required
  - `description` string, required
  - `private` boolean
  - `doubleOptIn` object: emailId is required when active is true. When active is true, the referenced transactional email's content must include {{verifyLink}} - the API rejects the request with a 400 otherwise, since that's the only way a contact can confirm their subscription. Replaces the whole object when given - to change just one field, GET the current value first and send all five back together. Do not include the GET response's doubleOptIn._id - it is Mongoose's own subdocument id, not a real field, and PATCH rejects it as unexpected.
    - `active` boolean
    - `redirectLink` string
    - `emailId` string: A transactional email _id used to send the confirmation email - NOT a template ID, even though a template may look interchangeable. Its content must include {{verifyLink}} if active is true. If the user wants double opt-in but hasn't said which email to use, call GET /v1/projectId/{projectId}/transactional-emails first and ask them to choose from the real names.
    - `confirmationTitle` string
    - `confirmationMessage` string
  - `signupForm` object: Replaces the whole object when given, not a per-field merge - GET the current value first and send back every field you want to keep alongside your changes. Do not include the GET response's signupForm._id - it is Mongoose's own subdocument id, not a real field, and PATCH rejects it as unexpected.

## Response `201`

Created

- object
  - `status` integer
  - `result` SubscriberList
    - `_id` string
    - `name` string
    - `description` string
    - `private` boolean
    - `doubleOptIn` object
      - `active` boolean
      - `redirectLink` string
      - `emailId` string: A transactional email _id used to send the confirmation email.
      - `confirmationTitle` string
      - `confirmationMessage` string
    - `signupForm` object
      - `formLayout` string
      - `showCaptcha` boolean
      - `emailPlaceholder` string
      - `captchaPlaceholder` string
      - `formFontStyle` string
      - `formFontColor` string
      - `formFontSize` string
      - `btnLabel` string
      - `btnFont` string
      - `btnFontColor` string
      - `btnColor` string
      - `btnFontSize` string
      - `successMessage` string
      - `successFont` string
      - `successFontColor` string
      - `successFontSize` string
      - `propertiesStyle` object
    - `createdAt` string, date-time
    - `updatedAt` string, date-time

## Other responses

- `400`: Invalid request body or query - every violation found (missing/invalid/unexpected fields) is reported in one response, semicolon-separated, not just the first one hit.
- `403`: Missing or invalid API key

---

[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)
