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

# Create a draft

`POST /v1/content`

Save a finished piece of short-form content — an X post or thread, a LinkedIn post, a one-off email, or an X Article — to your publication's library.

**What this does:**
- The piece is saved as a draft and shows up in the Paragraph app under Content, where you can edit it and send it.
- Nothing is posted, emailed, or scheduled. Sending happens in the app, so a draft you upload can't go out without you.
- Long-form Paragraph posts are a different resource — use `POST /v1/posts` for those.

**The body:**
- `body` carries the artifact itself, in the shape its kind uses (see the field descriptions below).
- It's validated the same way the Paragraph app validates it, so an X thread over 280 characters an entry, or an Article missing its headline, comes back with the same explanation you'd see in the app.
- Drafts created here are text-only. Media has to be uploaded to X or LinkedIn first, which the API can't do yet.

## Request body

- object
  - `kind` 'tweet' | 'linkedin' | 'newsletter' | 'x_article', required — What kind of piece this is
  - `title` string, required — What this piece is called in your library. Sentence case, no trailing period. Not published anywhere — for an X Article headline, use `body.title`.
  - `body` object, required — The artifact itself, in the shape this kind uses
    - `text` string — The post's text. `tweet`: a single tweet, at most 280 characters — use `tweets` for a thread and never send both. `linkedin`: the post body.
    - `tweets` string[] — `tweet` only. One entry per tweet, in posting order, each at most 280 characters. Never concatenate a thread into one entry.
    - `subject` string — `newsletter` only. Subject line.
    - `preheader` string — `newsletter` only. Optional preview line shown after the subject.
    - `body` string — `newsletter`: the email body. `x_article`: the article's full CommonMark markdown.
    - `title` string — `x_article` only. The headline as published on X. Separate from the piece's `title`, which only names it in your library.
    - `canonicalUrl` string — `x_article` only. The original post this Article is a version of. It must also appear as a markdown link inside `body`.
    - `media` unknown

## Response `200`

Draft created successfully

- object
  - `id` string, required — Unique identifier for this piece of content
  - `kind` string, required — What this piece is: `tweet`, `linkedin`, `newsletter`, or `x_article`
  - `title` string, required — What this piece is called in your library
  - `excerpt` string, required — First readable line of the body, for listing views
  - `status` 'draft' | 'published' | 'archived', required — Whether this piece has been delivered, is still a draft, or was archived
  - `scheduled` boolean, required — Whether a scheduled send is queued against this piece
  - `lockedReason` string, nullable, required — Why this piece can't be edited right now, or null when it can. A queued or in-flight send locks the words, because they go out exactly as written.
  - `publishedAt` string, nullable, required — ISO 8601 timestamp of the first delivery, or null
  - `url` string, nullable, required — Where this piece went live, from the same delivery `publishedAt` came from. Null when it hasn't been delivered, and null by design for a channel that publishes no page: a custom email renders into the message itself, so there is no address to link to. Never guessed — a delivery whose id isn't shaped like its channel reports null rather than a link that would 404.
  - `archivedAt` string, nullable, required — ISO 8601 timestamp of when this piece was archived, or null
  - `createdAt` string, required — ISO 8601 timestamp of creation
  - `updatedAt` string, required — ISO 8601 timestamp of the last change
  - `body` object, required — The artifact itself, in the shape its kind uses

## Other responses

- `400` — The draft is missing content or doesn't match its kind
- `401` — Invalid or missing API key
- `404` — Publication not found
- `500` — Internal server error

---

[API](https://skmtc.net/paragraph-xyz/apis/paragraph-api.md) · [All operations](https://skmtc.net/paragraph-xyz/apis/paragraph-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/paragraph-xyz/paragraph-api/revisions/d7ee6288035e/schema)
