---
title: "Scaffold a campaign in one call: create a list, add contacts, create the campaign, enroll them (policy-checked, e.g. ski"
method: POST
path: "/api/v1/campaigns/build"
tags: ["campaigns"]
---

# Scaffold a campaign in one call: create a list, add contacts, create the campaign, enroll them (policy-checked, e.g. ski

`POST /api/v1/campaigns/build`

## Request

- Base URL: `https://crispy.sh`
- URL: `https://crispy.sh/api/v1/campaigns/build`
- Auth: HTTP bearer

## Request body

- object
  - `name` string, required: Name for the new list + campaign (slug auto-derived).
  - `contacts` object[], required: People to enroll. Each item: an identifier (provider_id/slug/URL) or a lookup object.
    - `identifier` string: provider_id ('ACoAA...'), slug, or URL.
    - `email` string: Optional email identifier.
  - `kind` 'acquisition' | 'relationship': Campaign kind (default acquisition).
  - `description` string: Optional campaign/list description.

## Response `200`

Success

## Other responses

- `401`: Missing or expired API key
- `403`: Insufficient key scope or permission denied
- `429`: Rate limit exceeded

---

[API](https://skmtc.dev/crispy/apis/crispy-rest-api.md) · [All operations](https://skmtc.dev/crispy/apis/crispy-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/crispy/apis/crispy-rest-api/revisions/6bed0974d9ce?raw)
