Skip to content

Content types

The content_type field selects the rendering pipeline. Set it once on create — PATCH does not accept content_type, so it cannot be changed afterwards. Create a new object instead.

If you omit it on create, it defaults to single_image.

content_typeDescriptionKey fields
text_onlyPlain text post with no media.caption
single_imageOne image with a caption. Default.caption, media_urls[0]
slideshowMulti-slide image post (TikTok/Instagram slides).caption, media_urls[]
carouselInstagram sidecar carousel, up to 10 images.caption, media_urls[]
reelInstagram Reels or TikTok short-form vertical video.caption, media_urls[0], aspect_ratio
talking_headRendered talking-head video with a subtitle overlay.caption, media_urls[0]
video_hookShort vertical video leading with a large hook overlay.caption, media_urls[0]
video_hook_demoHook overlay followed by a product demo segment.caption, media_urls[]

Those eight values are the entire enum. Anything else fails validation with 400 invalid_body.

There is no photo type — use single_image. There is no generic video type — pick the specific format (reel, talking_head, video_hook, video_hook_demo). There is no story type; stories are not publishable through the API.

Every type reads its copy from caption. There is no per-type text field — no body_text, no hook_text, no slide_copy. The hook line for video_hook and video_hook_demo is derived by the render pipeline from the caption and the template, not passed as a separate argument.

  • reel vs talking_head vs video_hook: all three are vertical short-form. reel is a straight video post. talking_head is oriented around a speaker with subtitles burned in. video_hook foregrounds a hook line for the first two to three seconds before revealing the rest.
  • video_hook vs video_hook_demo: video_hook_demo follows the hook with a screen-recorded product segment, so it expects more than one entry in media_urls.
  • slideshow vs carousel: slideshow is the TikTok/Instagram-slides style with per-slide text baked into each image. carousel is an Instagram sidecar where the same caption applies to all slides.

The API does not reject mismatched type/platform combinations at create time. target_platforms is accepted as a free-form array of up to 10 strings, and creating a text_only post targeting instagram returns 201 exactly like any other create.

Incompatibilities surface later, when the publish cron calls the platform’s API and that leg fails. Watch for content.publish_failed, whose per-platform error field carries the platform’s own message.

See Platforms for which combinations actually work in practice.