---
title: "Create and launch a Meta campaign (async; spend-policy gated)"
method: POST
path: "/ads/publish"
tags: ["Ads"]
---

# Create and launch a Meta campaign (async; spend-policy gated)

`POST /ads/publish`

## Request

- Base URL: `https://api.madethis.com/v1`
- URL: `https://api.madethis.com/v1/ads/publish`
- Auth: HTTP bearer

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `creativeStorageId` string, required
  - `headline` string, required
  - `primaryText` string, required
  - `ctaType` 'LEARN_MORE' | 'SHOP_NOW' | 'SIGN_UP' | 'WATCH_MORE' | 'GET_OFFER', required
  - `audienceDescription` string, required
  - `dailyBudgetCents` integer, required
  - `targeting` object, required
    - `geo_locations` object, required
    - `excluded_geo_locations` object
    - `age_min` integer
    - `age_max` integer
    - `genders` union[]
      - union
        - 1
        - 2
    - `locales` integer[]
    - `interests` object[]
      - `id` string
      - `name` string, required

## Response `202`

Success envelope. Or, when the business's spend policy parks the call: Parked by the business's spend policy (kind: ad_publish). NOTHING has been spent, published or sent. Confirm with POST /v1/confirmations/{id}/confirm — or reject it — before the expiry; the original call is replayed exactly once.

- union
  - object
    - `data` object, required
      - `status` 'publishing' | 'queued', required
      - `dispatchBlockedReason` string, nullable, required
      - `proposalId` string, required
      - `taskId` string, required
      - `dailyBudgetCents` integer, required
      - `metaDailyBudgetCents` integer, required
      - `committedCents` integer, required
      - `commitmentDays` integer, required
      - `destinationUrl` string, required
    - `hint` string: One-sentence orientation for agents.
    - `next_action` string: The literal next call an agent would chain.
  - object
    - `data` object, required
      - `status` 'pending_confirmation', required
      - `confirmation_id` string, required
      - `summary` string: One line an owner can decide from.
      - `amountCents` integer, nullable: Cents this call would spend; null when not knowable up front, which always confirms.
      - `reason` string
      - `expires_at` number, required
    - `hint` string
    - `next_action` string

## Other responses

- `default`: Error envelope — machine-readable `code` plus a docs link.

---

[API](https://skmtc.dev/madethis/apis/madethis-api.md) - [All operations](https://skmtc.dev/madethis/apis/madethis-api/llms.txt) - [OpenAPI document](https://skmtc.dev/madethis/apis/madethis-api/revisions/b0696ebcb55b?raw)
