---
title: "Draft Status Changed"
method: POST
path: "draft.status_changed"
tags: ["Webhooks"]
---

# Draft Status Changed

`POST draft.status_changed` (webhook)

Triggered on any status transition. This event fires alongside specific events like draft.scheduled or draft.published.

## Payload

- object — Payload envelope sent to webhook endpoints.
  - `event` 'draft.status_changed', required — The event type that triggered this webhook
  - `data` DraftDetailResponse, required — Response schema for draft creation and retrieval
    - `id` integer, required — Unique identifier for the draft
    - `social_set_id` integer, required — ID of the social set (account) this draft belongs to
    - `draft_id` integer, required — Deprecated: Use 'id' instead. Unique identifier for the draft.
    - `status` 'draft' | 'scheduled' | 'published' | 'publishing' | 'error' | 'planned', required — Current status of the draft. 'draft' = saved but not scheduled, 'scheduled' = queued for publishing, 'published' = successfully posted, 'error' = publishing failed, 'planned' = dated but inert (it has a scheduled_date but never auto-publishes until confirmed in the Typefully app). This reflects the stored draft lifecycle; it does not flip to 'publishing' while an immediate publish is in flight - use `publish_state` to track that.
    - `publish_state` 'in_progress' | 'finished', nullable — Async publish-progress signal, separate from `status`. null = no publish initiated; 'in_progress' = at least one platform is currently being posted; 'finished' = publishing has completed for all platforms. 'finished' means the job is done, not that it succeeded - read `status` and the per-platform published URLs (x_published_url, etc.) for the outcome. After publish_at="now", poll GET /drafts/{id} until publish_state is 'finished'.
    - `created_at` string, date-time, required — Timestamp when the draft was created (ISO 8601 format in UTC)
    - `updated_at` string, date-time, nullable — Timestamp when the draft was last edited (ISO 8601 format in UTC). Null if never edited.
    - `scheduled_date` string, date-time, nullable — Timestamp when the draft is scheduled to publish (ISO 8601 format in UTC). Null if not scheduled.
    - `published_at` string, date-time, nullable — Timestamp when the draft was published on any enabled platform (ISO 8601 format in UTC). Null if not yet published.
    - `draft_title` string, nullable — Human-readable title for the draft. This is for internal organization only and is not posted to social media.
    - `tags` string[] — List of tag slugs (not names) associated with this draft. Use the /tags endpoint to get available tags with their slugs.
    - `preview` string, required — Text preview of the draft, smart-trimmed with a 100-character limit
    - `share_url` string, nullable — Public share URL for the draft. Null if the draft is not publicly shared.
    - `private_url` string, required — Private URL for accessing the draft in Typefully. Can be shared with team members without requiring public sharing.
    - `platforms` PlatformsResponse, required — Schema for platform configurations in responses (no validation limits)
      - `x` union — X (Twitter) configuration
        - EnabledXPlatformResponse — Enabled X platform for responses (no validation limits)
          - `enabled` true, required
          - `posts` XPostResponse[], required — List of posts for this platform
            - `text` string, required — The text content of the post
            - `media_ids` string[] — List of media IDs attached to the post.
            - `quote_post_url` string, nullable — X-only: URL of the X post quoted by this post. Null when no quoted post is configured.
            - `subscribers_only` boolean — X-only: Whether this individual post is visible only to paying Subscribers.
            - `paid_partnership` boolean — X-only: Whether this post is labeled as a paid partnership.
            - `made_with_ai` boolean — X-only: Whether this post is labeled as made with AI.
          - `settings` XSettings — Settings specific to X (Twitter)
            - `reply_to_url` string, nullable — URL of the X post to reply to. When provided, the first post in your thread will be posted as a reply.
            - `community_id` string, nullable — ID of the X community to post to. Find the ID in the community URL (e.g., x.com/i/communities/1493446837214187523). You must have permission to post to the community, otherwise publishing will fail.
            - `share_with_followers` boolean, nullable — When posting to a community, whether to also share the post to your timeline/followers. Defaults to true if not specified. Only has an effect when community_id is provided.
        - DisabledPlatform — Shared schema for all disabled platforms
          - `enabled` false, required
      - `linkedin` union — LinkedIn configuration
        - EnabledLinkedInPlatformResponse — Enabled LinkedIn platform for responses (no validation limits)
          - `enabled` true, required
          - `posts` LinkedInPostResponse[], required — List of posts for this platform
            - `text` string, required — The text content of the post
            - `media_ids` string[] — List of media IDs attached to the post.
            - `linkedin_reshare_urn` string, nullable — LinkedIn-only: canonical URN of the LinkedIn post reshared (repost) by this post. Null when no reshare is configured.
            - `hide_link_preview` boolean — Whether the link-preview card is suppressed for this post.
          - `settings` LinkedInSettings — Settings specific to LinkedIn
        - DisabledPlatform — Shared schema for all disabled platforms
          - `enabled` false, required
      - `mastodon` union — Mastodon configuration
        - EnabledMastodonPlatformResponse — Enabled Mastodon platform for responses (no validation limits)
          - `enabled` true, required
          - `posts` PostResponse[], required — List of posts for this platform
            - `text` string, required — The text content of the post
            - `media_ids` string[] — List of media IDs attached to the post.
          - `settings` MastodonSettings — Settings specific to Mastodon
        - DisabledPlatform — Shared schema for all disabled platforms
          - `enabled` false, required
      - `threads` union — Threads configuration
        - EnabledThreadsPlatformResponse — Enabled Threads platform for responses (no validation limits)
          - `enabled` true, required
          - `posts` LinkPreviewPostResponse[], required — List of posts for this platform
            - `text` string, required — The text content of the post
            - `media_ids` string[] — List of media IDs attached to the post.
            - `hide_link_preview` boolean — Whether the link-preview card is suppressed for this post.
          - `settings` ThreadsSettings — Settings specific to Threads
        - DisabledPlatform — Shared schema for all disabled platforms
          - `enabled` false, required
      - `bluesky` union — Bluesky configuration
        - EnabledBlueskyPlatformResponse — Enabled Bluesky platform for responses (no validation limits)
          - `enabled` true, required
          - `posts` LinkPreviewPostResponse[], required — List of posts for this platform
            - `text` string, required — The text content of the post
            - `media_ids` string[] — List of media IDs attached to the post.
            - `hide_link_preview` boolean — Whether the link-preview card is suppressed for this post.
          - `settings` BlueskySettings — Settings specific to Bluesky
        - DisabledPlatform — Shared schema for all disabled platforms
          - `enabled` false, required
      - `substack` union — Substack Notes configuration
        - EnabledSubstackPlatformResponse — Enabled Substack platform for responses (no validation limits)
          - `enabled` true, required
          - `posts` PostResponse[], required — List of posts for this platform
            - `text` string, required — The text content of the post
            - `media_ids` string[] — List of media IDs attached to the post.
          - `settings` SubstackSettings — Settings specific to Substack
        - DisabledPlatform — Shared schema for all disabled platforms
          - `enabled` false, required
      - `x_article` XArticlePlatformResponse — X Article platform data in responses.
        - `content_markdown` string, required — Canonical X Article Markdown: first non-empty block must be `# Title` (sets the title); later blocks are body. Supports paragraphs, blockquotes, ordered/unordered lists, `#`/`##` body headings, bold, italic, strikethrough, links, and standalone `---` or `***` dividers (GET returns `---`). Prefix delimiter-only paragraph text with a backslash (for example, `\---`) to keep it literal. Embeds are block-only, alone on a line: `<typ:media media_id="..." />`, `<typ:x-post url="https://x.com/user/status/123" />`. Existing comment anchors may round-trip as Typefully comment-thread marker tags in GET responses; preserve those markers exactly when PATCHing. GET returns canonical Markdown from stored rich text, not original bytes.
        - `cover_media_id` string, nullable — Media ID for the X Article cover image, or null when no cover is configured.
    - `x_published_url` string, nullable — URL of the published post on X (Twitter). Null if not published to X or URL not available.
    - `linkedin_published_url` string, nullable — URL of the published post on LinkedIn. Null if not published to LinkedIn or URL not available.
    - `mastodon_published_url` string, nullable — URL of the published post on Mastodon. Null if not published to Mastodon or URL not available.
    - `threads_published_url` string, nullable — URL of the published post on Threads. Null if not published to Threads or URL not available.
    - `bluesky_published_url` string, nullable — URL of the published post on Bluesky. Null if not published to Bluesky or URL not available.
    - `substack_published_url` string, nullable — URL of the published note on Substack. Null if not published to Substack or URL not available.
    - `x_article_published_url` string, nullable — URL of the published X Article. Null if not published or URL not available.
    - `x_post_published_at` string, date-time, nullable — Timestamp when the post was published to X (ISO 8601 format in UTC). Null if not published to X.
    - `linkedin_post_published_at` string, date-time, nullable — Timestamp when the post was published to LinkedIn (ISO 8601 format in UTC). Null if not published to LinkedIn.
    - `mastodon_post_published_at` string, date-time, nullable — Timestamp when the post was published to Mastodon (ISO 8601 format in UTC). Null if not published to Mastodon.
    - `threads_post_published_at` string, date-time, nullable — Timestamp when the post was published to Threads (ISO 8601 format in UTC). Null if not published to Threads.
    - `bluesky_post_published_at` string, date-time, nullable — Timestamp when the post was published to Bluesky (ISO 8601 format in UTC). Null if not published to Bluesky.
    - `substack_post_published_at` string, date-time, nullable — Timestamp when the note was published to Substack (ISO 8601 format in UTC). Null if not published to Substack.
    - `x_article_published_at` string, date-time, nullable — Timestamp when the X Article was published (ISO 8601 format in UTC). Null if not published.
    - `scratchpad_text` string, nullable — Plain text scratchpad notes for the draft. Formatting is stripped.

## Acknowledgement `200`

Return any 2xx status to acknowledge receipt

---

[API](https://skmtc.dev/raycast/apis/typefully-public-api.md) · [All operations](https://skmtc.dev/raycast/apis/typefully-public-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/raycast/typefully-public-api/revisions/784a28669fa5/schema)
