---
title: "Create a content draft"
method: POST
path: "/api/v1/content"
tags: ["content"]
---

# Create a content draft

`POST /api/v1/content`

## Request

- Base URL: `https://api.growomat.com`
- URL: `https://api.growomat.com/api/v1/content`
- Auth: HTTP bearer

Starts a new piece of social content from a `goal` for a business. The response arrives immediately with the queued draft; the writing continues in the background.

Poll *Get a content draft* and watch `phase`: `queued`, `gathering`, `synthesizing` and `drafting` mean it is still working; `interviewing` and `review` mean it is waiting on you (answer questions, or confirm); `ready` and `failed` are final.

Creating a draft counts against the plan's monthly draft allowance.

**Errors**

- `402 LIMIT_REACHED`: social content is not in the plan, or this month's allowance is spent. The body is a `LimitReachedBody`; read `reason` to tell `NOT_IN_PLAN` from `QUOTA_SPENT`, because only the second one comes back on a date (`resetAt`).
- `400 VALIDATION_ERROR`: the body failed validation; `details.issues[]` names each field.

## Headers

- `X-Space-Id` string

## Request body

- ContentDraftCreate: A new piece of social content to draft.
  - `goal` string, required: What the piece should say: the idea that is researched and drafted.
  - `businessId` string, required: The business the piece is written for. Its brand voice applies.
  - `researchEnabled` boolean: Ground the piece in web research. When off, no sources are attached and no source sign-off is needed.
  - `recencyDays` integer: Only use sources newer than this many days.
  - `overrides` object: Settings pinned from the start: `platform`, `blueprint`, `audience`, `voice`. Pinned fields are never changed during drafting. Unknown keys and invalid values are dropped.
    - `platform` string: Where the piece will be published, for example a social network or a blog.
    - `blueprint` string: The piece blueprint id.
    - `audience` string: Who the piece is for.
    - `voice` string: Tone notes for this piece, on top of the brand voice.

## Response `200`

OK. The result is in `data`. List responses also carry `meta` with `nextCursor` and `total`.

- SuccessEnvelope: The shape of every successful response.
  - `data` unknown, required
  - `meta` object: Present on list responses.
    - `nextCursor` union: Pass as `cursor` to get the next page. `null` on the last page.
      - string
      - number
    - `total` integer: Number of items in this page.

## Other responses

- `201`: Created. The new resource is in `data`.
- `400`: The request is malformed or fails validation. `error.code` is `VALIDATION_ERROR` (with `details.issues[]` naming each field), `INVALID_REQUEST` (the body is not valid JSON or has the wrong shape), or one of the specific codes listed in this operation's description.
- `401`: The bearer token is missing, invalid, expired or revoked (`INVALID_TOKEN`).
- `402`: Social content is not in the plan, or the monthly draft allowance is spent. Read `reason` to tell the two apart.
- `403`: The token lacks the scope this operation needs (`INSUFFICIENT_SCOPE`), the plan is read-only (`READ_ONLY_MODE`), or the caller is not a member of the Space named in `X-Space-Id` (`NOT_A_MEMBER`).
- `404`: No such resource in the active Space (`NOT_FOUND`), or `X-Space-Id` names a Space that does not exist (`SPACE_NOT_FOUND`).
- `409`: The request conflicts with the current state, for example a delete blocked by dependents or a sync already running. This operation's description names the `error.code` values it can return.
- `429`: Too many requests (`RATE_LIMITED`). Wait for the number of seconds in the `Retry-After` header, then retry.

---

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