Threaded posts (for example a Twitter/X thread or a Bluesky, Threads, or Mastodon thread) are created with the `createPost` mutation by passing a `thread` array inside the service-specific `metadata`. Each entry in the array is one post in the thread, and they are published in order, each replying to the previous one.

> **Important:** every post in the thread - including the first one - must be provided as an item in the `thread` array. The thread array is the source of truth for what gets published. The top-level `text` on `CreatePostInput` should be set to the same value as the **first** item in the `thread` array so the two stay in sync.

For example, for a three-post thread you have to provide all three posts as `thread` entries, and the top-level `text` repeats the first entry's text.

```graphql
mutation CreateThreadedPost {
  createPost(
    input: {
      text: "This is the first post in my thread."
      channelId: "some_channel_id"
      schedulingType: automatic
      mode: addToQueue
      metadata: {
        twitter: {
          thread: [
            { text: "This is the first post in my thread." }
            { text: "Here's the second post, replying to the first." }
            { text: "And the third post wraps everything up." }
          ]
        }
      }
    }
  ) {
    ... on PostActionSuccess {
      post {
        id
        status
      }
    }
    ... on MutationError {
      message
    }
  }
}
```

The same pattern applies to the other services that support threads - swap `twitter` for `bluesky`, `threads`, or `mastodon` in the `metadata` object. Each `ThreadedPostInput` also accepts an ordered `assets` list if you want to attach media to an individual post in the thread.
