# Content Publishing
The Content Publishing API provides access to content the same way Program Studio does, enabling the creation and updating of articles, links, videos, and images.
For contextual guidance on content publishing, and for use case examples, refer to our Content Publishing Overview page.
## Create a topic in the program - [POST /v2/channels](https://developers.firstup.io/doorman/openapi/content-publishing/createchannel.md): Creates new topic in the program ## List all topics in the program - [GET /v2/channels](https://developers.firstup.io/doorman/openapi/content-publishing/listchannels.md): Returns a list of topics and allows for sorting, filtering, and pagination of the records. Response body is an array of records. ## Update a topic in the program - [PUT /v2/channels/{channel_id}](https://developers.firstup.io/doorman/openapi/content-publishing/updatechannel.md): Updates a topic in the program ## List all followers of a topic - [GET /v2/channels/{channel_id}/followers](https://developers.firstup.io/doorman/openapi/content-publishing/listchannelfollowers.md): Returns a list of all users who follow the topic, and allows for pagination of the records. Response body is an array of records. ## Fetch a collection of content - [GET /v2/content](https://developers.firstup.io/doorman/openapi/content-publishing/listcontent.md): Returns a list of content records and allows for sorting, filtering, and pagination of the records. Response body is an array of records. ## Create a new content post - [POST /v2/content](https://developers.firstup.io/doorman/openapi/content-publishing/createcontent.md): 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. ## Fetch the details of a content post - [GET /v2/content/{content_id}](https://developers.firstup.io/doorman/openapi/content-publishing/detailcontent.md): Read an existing content record. Returns a single record by identifier or by the content UUID. ## Update an existing content post - [PUT /v2/content/{content_id}](https://developers.firstup.io/doorman/openapi/content-publishing/updatecontent.md): Update an existing content record. Content can be updated in any state, but some states have different validations. Any or all of the content attributes can be provided and only those provided will be updated. This endpoint cannot be used to change content type, state, or topics. 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 updated record. ## Archive an existing content post - [PUT /v2/content/{content_id}/archive](https://developers.firstup.io/doorman/openapi/content-publishing/archivecontent.md): Archive an existing content post. Transition the content state from any state directly to "archived". Response body contains the latest version of the content record. ## Draft an existing content post - [PUT /v2/content/{content_id}/draft](https://developers.firstup.io/doorman/openapi/content-publishing/draftcontent.md): Transition the content state of an existing content post to draft. A post can be set to draft from any any current state. If the post was published or archived, it will no longer be. Response body is the updated record. Returns `` if the content cannot be transitioned to 'draft' due to validation reasons. ## Publish an existing content post - [PUT /v2/content/{content_id}/publish](https://developers.firstup.io/doorman/openapi/content-publishing/publishcontent.md): Change the state of the content to “published.” If the content is already in the “published” state, this request does nothing. Content in a “scheduled” state remains scheduled. For all other states, the content is published immediately. Publishing content requires that at least one topic be associated to the content, as content must always have at least one topic. Response body is the updated record. This endpoint returns `` if the content cannot be published. Some attributes have validations that are only applied when moving content to the published state. For example, content cannot be published until its title has been filled in. ## Mark an existing post as ready for review - [PUT /v2/content/{content_id}/review](https://developers.firstup.io/doorman/openapi/content-publishing/reviewcontent.md): Change the state of the post to "review". The post is immediately removed from feeds. Posts that are already in "review" state will not change. ## List the comments on a content post - [GET /v2/content/{content_id}/comments](https://developers.firstup.io/doorman/openapi/content-publishing/listcontentcomments.md): List the comments on a content post. Only top-level comments are returned. Comments which are replies to other comments are not currently available through this endpoint. ## List the replies on comment post - [GET /v2/content/{content_id}/comments/{comment_id}/replies](https://developers.firstup.io/doorman/openapi/content-publishing/listcontentcommentreplies.md): List the replies on comment post. ## Add an image to a content post - [PUT /v2/content/{content_id}/images](https://developers.firstup.io/doorman/openapi/content-publishing/addcontentimage.md): Add a new image to a content record. Response body is the updated content record. Note: This API does not resize or rehost images. Images should be appropriately sized and will be served from the provided URL. ## Add a video for use in content of type article - [PUT /v2/content/{content_id}/videos](https://developers.firstup.io/doorman/openapi/content-publishing/addcontentvideo.md): Add a new video to a content record. Response body is the attributes of the video record. Insert the returned embed_html into the body of the article at the location you want the video to appear in the article. ## Remove an image from a content post - [DELETE /v2/content/{content_id}/images/{content_image_id}](https://developers.firstup.io/doorman/openapi/content-publishing/removecontentimage.md): Remove an image from a content record. Images cannot be removed from published content. Response status for removed content is 204 No Content. ## Fetch content replications - [GET /v2/content/replications](https://developers.firstup.io/doorman/openapi/content-publishing/listcontentreplications.md): The endpoint allow users to get details of content replication. Source or target filter is required ## Get a download URL for a content video - [GET /v2/videos/{video_id}/download](https://developers.firstup.io/doorman/openapi/content-publishing/downloadcontentvideo.md): Returns a temporary link to a content video. ## Fetch the unique count of users who can see the content post - [GET /v2/content/{content_id}/reach/unique_user_count](https://developers.firstup.io/doorman/openapi/content-publishing/contentreachcount.md): Fetch the content reach, the unique user count for audiences, topics, and both.