---
title: "Create a draft campaign"
method: POST
path: "/api/reach/v1/profiles/{profileUuid}/campaigns"
tags: ["Reach: Campaigns"]
---

# Create a draft campaign

`POST /api/reach/v1/profiles/{profileUuid}/campaigns`

Create a campaign in a profile.

The campaign is created as a draft, so nothing is sent and no contact is touched. It has no
audience yet either - targeting and scheduling are not part of this request, the draft is
finished and sent from the Reach interface.

## Path parameters

- `profileUuid` string, required

## Request body

- ReachV1CampaignsStoreRequest — Create a campaign in draft status
  - `sender_name` string, required — From name shown to the recipients.
  - `sender_email` string, required — From address of the campaign. Its domain has to be verified on the profile before the campaign can be sent.
  - `title` string — Name the campaign is listed under. Not shown to the recipients.
  - `subject` string — Subject line of the email.
  - `template_uuid` string — Template to send, as returned by the template endpoints. Can be left out and attached later, but the campaign cannot be sent without one.
  - `metadata` object, nullable — Extra campaign fields. Any key outside the listed ones is rejected.
    - `preheader` string — Preview text shown after the subject line in the inbox.
    - `source` string — Where the campaign was created from.

## Response `200`

Success response

- ReachV1CampaignsCreatedCampaignResource — The campaign as it was stored, without targeting or delivery progress
  - `uuid` string
  - `title` string
  - `subject` string
  - `sender_name` string
  - `sender_email` string
  - `template_uuid` string, nullable
  - `status` 'draft' | 'scheduled' | 'sending' | 'publish' | 'failed' — Always `draft` for a campaign that was just created.
  - `type` 'campaign' | 'automation' | 'double_opt_in'
  - `is_all_contacts` boolean — Whether the campaign targets every contact instead of selected segments.
  - `metadata` object — The stored extra fields, including the ones Reach sets itself.
  - `created_at` string, date-time, nullable
  - `updated_at` string, date-time, nullable

## Other responses

- `401` — Unauthenticated response
- `422` — Validation error response
- `500` — Error response

## Changes

- **2026-09-03** `cac6a729a4ce` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/hostinger/apis/hostinger-api/changes/api/reach/v1/profiles/:profileUuid/campaigns/post.md)

---

[API](https://skmtc.dev/hostinger/apis/hostinger-api.md) · [All operations](https://skmtc.dev/hostinger/apis/hostinger-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/hostinger/hostinger-api/revisions/75f6fb63f779/schema)
