# Create a new content post

Create a new content item and select what topics will include the content. The new content will be created in the **“draft”** state.  This endpoint only creates the post. If applicable, an image may be added later via the appropriate endpoint. If author.user_id is provided, it will be used to determine display_name and avatar_url, overriding any values provided for display_name and avatar_url.  Response body data will be the newly created record. **Resources**  Knowledge Base article on Campaigns An overview on Content & Publishing API Pagination Filtering Add an image Publish drafted content

Endpoint: POST /v2/content
Version: 2026-05-01
Security: oauth2_as_a_user, oauth2_as_a_server

## Security:

  - `oauth2_as_a_user` (unknown)
    oauth2 scopes: content.write

  - `oauth2_as_a_server` (unknown)
    oauth2 scopes: content.write

## Request body:

  - `application/json` (unknown)
    Attributes of the content to create.

## Request fields (application/json):

  - `content_type` (string)
    The type of content to create
    Enum: "article", "link", "video", "image"

  - `title` (any)
    A title for the post
    Example: Example Post Title

  - `body` (any)
    The body text for the post. HTML is permitted.
    Example: Example post body

  - `summary` (any)
    Post summary blurb
    Example: Example post summary

  - `author` (object)

  - `author.avatar_url` (string)
    Path to an image representing the author.
    Example: https://example.com/avatar.png

  - `author.display_name` (string)
    The name to display as the author.
    Example: Some User

  - `author.user_id` (integer)
    The Firstup user_id of the author.
    Example: 123

  - `featured` (boolean)
    Whether the post is featured.
    Example: true

  - `featured_label` (string)
    The featured label.
    Example: A Label

  - `visibility` (string)
    An indication of the native availability of the post within the Firstup platform. If 'public', the post has a public_link_url and shares of the post should use that url as the canonical url. If 'private', the post requires user authentication to view.
    Enum: "private", "public"

  - `targeted` (boolean)
    Works with groups: true limits visibility to listed audiences; false uses audiences for delivery only.
    Example: true

  - `groups` (array)
    A non-empty list of audiences this post targets. Required to enable targeting; if empty or omitted, targeting will not be applied.
    Example: ["group1","group2"]

  - `channels` (array)
    A list of topics the content will be published to.

  - `channels.id` (integer, required)
    Example: 789

  - `channels.hidden` (boolean)
    Example: false

  - `source` (object)

  - `source.post_id` (string)
    The unique identifier of the post on the source system, if it is republished from another platform or application.

  - `source.posted_at` (string)
    The timestamp at which the post was published on the source system, if it is republished from another platform or application.

  - `images` (array)
    An ordered list of images for this content.
Images are only validated for content of `"image"` type. There is a limit of ten images.
**Note:** The content returned immediately after content creation or modification contains will not contain the final image URIs due to additional post-processing

  - `images.image_url` (string, required)
    Example: https://image.site.com/an_image.png

  - `template` (object)

  - `template.id` (integer)

  - `link_url` (any)
    The url if the content_type is link

## Response 201:

  - `201` (unknown)
    Content Created

## Response 201 fields (application/json):

  - `data` (array, required)

  - `data.id` (integer)
    Unique identifier for this post.
    Example: 456

  - `data.version` (integer)
    The version of the content creation studio used to generate the content.
- `1` - Legacy Studio
- `2` - Creator Studio
    Enum: 1, 2

  - `data.uuid` (string)
    Example: 8b358e6b-11d4-4e89-bf7f-ec670e3398ed

  - `data.content_type` (string)
    The type of content. One of: article, image, link, note, or video. The content_type can determine how the post should be presented.
    Example: article

  - `data.cover_image_alt` (string)
    The url of the post on the Firstup platform. This property will only be returned for V2 content which can be viewed but not created via the Firstup API.
    Example: Image of an elephant

  - `data.permalink_url` (string)
    The url of the post on the Firstup platform.
    Example: https://onfirstup.com/acme/acmetimes/sc4#contents/456

  - `data.title` (string)
    The post title. Can also be considered the headline.
    Example: Example Article Title

  - `data.summary` (string)
    Short summary of the post.
    Example: Example article summary

  - `data.body` (string)
    The body of the post.
    Example: Example article body

  - `data.state` (string)
    The state of the post. One of: archived, draft, processing, processing_error, published, review or scheduled.
    Example: published

  - `data.accent_color` (string)
    The color of the post, currently only applicable to notes.
    Example: #ae2225

  - `data.featured_label` (string)
    The content's feature label
    Example: Save Pandora!

  - `data.featured` (boolean)
    Whether the post is featured.
    Example: false

  - `data.author` (object)

  - `data.author.avatar_url` (string)
    Path to an image representing the author.
    Example: https://example.com/avatar.png

  - `data.author.display_name` (string)
    The name to display as the author.
    Example: Some User

  - `data.author.user_id` (integer)
    The Firstup user_id of the author.
    Example: 123

  - `data.channels` (array)
    A list of the topics this post is published to.

  - `data.channels.id` (integer)
    Unique identifier for the topic.
    Example: 789

  - `data.channels.name` (string)
    Example: Example Topic Name

  - `data.source` (object)

  - `data.source.type` (string)
    Example: studio

  - `data.source.post_id` (string)
    The unique identifier of the post on the source system, if it is republished from another platform or application.
    Example: abc123

  - `data.source.posted_at` (string)
    The timestamp at which the post was published on the source system, if it is republished from another platform or application.
    Example: 2000-01-01T00:00:00Z

  - `data.template` (object)

  - `data.template.id` (integer)
    Example: 234

  - `data.visibility` (string)
    An indication of the native availability of the post within the Firstup platform. If 'public', the post has a public_link_url and shares of the post should use that url as the canonical url. If 'private', the post requires user authentication to view.
    Enum: "private", "public", "any"

  - `data.shareable_url` (string)
    The publicly shareable url of the post if its visibility is public. Private visibility posts will have no shareable_url.
    Example: https://onfirstup.com/acme/acmetimes/sc4#contents/456

  - `data.language` (string)
    The language. For non-translatable posts, this value will be null.
    Example: en

  - `data.is_translatable` (boolean)
    Whether the content is translatable.
    Example: true

  - `data.is_commentable` (boolean)
    Whether the content allows comments.
    Example: true

  - `data.comment_count` (integer)
    The number of comments on the content.
    Example: 5

  - `data.created_at` (string)
    When this content was created in ISO8601 format and UTC timezone.
    Example: 2000-01-01T00:00:00Z

  - `data.updated_at` (string)
    When this content was last updated in ISO8601 format and UTC timezone.
    Example: 2000-01-01T00:00:00Z

  - `data.published_at` (string)
    When this content was published in ISO8601 format and UTC timezone.
    Example: 2000-01-01T00:00:00Z

  - `data.links` (array)

  - `data.links.link_url` (string)
    Example: https://google.com

  - `data.images` (array)

  - `data.images.id` (integer)
    The unique identifier of this image record
    Example: 678

  - `data.images.image_url` (string)
    Example: https://cdn.example.com/acme/acmetimes/images/abc123

  - `data.images.width` (integer)
    The width of the image in pixels
    Example: 1024

  - `data.images.height` (integer)
    The height of the image in pixels
    Example: 768

  - `data.image_blocks` (array)
    All image blocks of Creator Studio content

  - `data.image_blocks.id` (integer)
    The unique identifier of this image block record
    Example: 678

  - `data.image_blocks.image_url` (string)
    Example: https://cdn.example.com/acme/acmetimes/images/abc123

  - `data.image_blocks.width` (integer)
    The width of the image in pixels
    Example: 1024

  - `data.image_blocks.height` (integer)
    The height of the image in pixels
    Example: 768

  - `data.image_blocks.alt_text` (string)
    The alt text of the image
    Example: Example alt text

  - `data.videos` (array)

  - `data.videos.id` (integer)
    The unique identifier of this video record

  - `data.videos.uuid` (string)
    The unique uuid identifier of this video record. Used in public urls.
    Example: 205ba32a-7f12-439d-b33d-df1c611c8e9c

  - `data.videos.caption` (string)
    A caption description of this video.
    Example: Example video caption

  - `data.videos.source` (string)
    Enum: "youtube", "vimeo", "socialchorus", "socialchorus_galaxy", "office365"

  - `data.videos.state` (string)
    Enum: "completed", "submitted", "error"

  - `data.videos.duration` (integer)
    Length of the video in seconds
    Example: 30

  - `data.videos.preview_image_url` (string)
    A url to an image that acts as a poster for the video before the video is loaded.

  - `data.videos.embed_html` (string)
    An HTML iframe widget that can be used to embed the video in an article.
    Example: <iframe href='https://onfirstup.com/acme/acmetimes/sc4#contents/456/videos/abc123'></iframe>


  - `data.videos.link_url` (string)
    A link to the video where it can be played
    Example: https://onfirstup.com/acme/acmetimes/sc4#contents/456/videos/abc123

  - `data.videos.created_at` (string)
    Example: 2000-01-01T00:00:00Z

  - `data.initiatives` (array)
    A list of the initiatives.

  - `data.initiatives.id` (integer)
    Unique identifier for the initiative.
    Example: 2

  - `data.initiatives.name` (string)
    Example: Example Initiative Name

## Response 400:

  - `400` (unknown)
    Bad Request

## Response 401:

  - `401` (unknown)
    Unauthenticated. See more on error responses  here.

## Response 401 fields (*/*):

  - `errors` (array)

  - `errors.code` (integer)
    Example: 401

  - `errors.title` (string)
    Example: Unauthenticated

  - `errors.detail` (string)
    Example: Access token was not provided or not recognized.

## Response 403:

  - `403` (unknown)
    Unauthorized. See more on error responses  here.

## Response 403 fields (*/*):

  - `errors` (array)

  - `errors.code` (integer)
    Example: 403

  - `errors.title` (string)
    Example: Unauthorized

  - `errors.detail` (string)

## Response 422:

  - `422` (unknown)
    Validation Failed

