Changelog
New platforms, posting features, API endpoints, and product improvements — newest first.
New marks brand-new capabilities. Improved marks enhancements to things you already use.
August 2026
Section titled “August 2026”August 28
Section titled “August 28”New Instagram participant status — New GET /api/profiles/:id/participants/:user_id returns whether a user follows your Instagram account (and vice versa), their verified badge, and follower count — fetched live from Instagram. The user_id is the Instagram-scoped id from a DM chat (participant_external_id) or a comment (author_external_id); Instagram only resolves users who have messaged or commented on your account. Responses are cached for one second per user, with the X-Cached header telling you which you got. Instagram only.
August 26
Section titled “August 26”Improved Placements and their history survive disconnects — Placements — Facebook Pages, LinkedIn organizations, Pinterest boards, Telegram channels, Google Business locations — are now account-level records: one per placement, no matter which profile connected it.
Disconnecting that profile no longer strands a placement: it keeps its posts, stats, comments, and DM chats, shows as orphaned, and is taken over automatically by another connected profile with access. Reconnecting the original works too, reviving the same profile record with the same ID, history, and no second billable unit.
A placement can be reassigned to another profile group any time via PATCH /api/profiles/:id/assign_placement_to_group.
New A Placements page in the app — A new Placements sidebar section lists every placement across your account, grouped by platform, with how it’s connected, its status (active, orphaned, or removed), and its profile group. Each placement gets its own page: performance insights, the posts targeting it, the profile currently serving it, and the group assignment control.
Improved Comments and chats follow the placement — After a placement changes hands, comment endpoints accept the placement’s current profile in profile_id, even for posts published by the previous one. GET /api/comments gains a placement_id filter, and GET /api/profiles/:id/placements now returns every placement a profile can currently see. Facebook DM chats carry their conversation history across the handover.
New placement.orphaned and placement.restored webhooks — placement.orphaned fires for each active placement a profile was serving when it disconnects; placement.restored fires when the placement is served again, with data.object.profile_id naming the profile now serving it. The payload’s id is the platform’s own placement ID — stable across handovers. Existing events are unchanged; subscribe to the new ones (or use *).
August 20
Section titled “August 20”Improved Per-item delivery status on threads — Every entry in a post’s thread array now carries its own platforms array — status, permalink, error, and error_details, same shape as the parent’s — on GET /api/posts and GET /api/posts/:id. A thread publishes as a sequential chain, so an item still processing or failed means every later item is undelivered. Purely additive. See Checking a thread was fully delivered.
Improved A comment reply is never posted twice — Some platform errors are ambiguous: the reply reaches the platform but the API still reports failure. Those now move the comment to a new delivery_unconfirmed status instead of being resent; Postproxy confirms the reply on the platform and marks it published with the real external_id.
delivery_unconfirmed is not terminal — don’t re-issue a comment sitting in it. A comment.delivery_unconfirmed webhook fires on the transition, and the app shows these comments as Confirming.
New Send TikTok posts to drafts — Tick “Upload to TikTok drafts” in the composer, or pass upload_as_draft: true in the TikTok platform parameters, and the media lands in the creator’s TikTok inbox — they finish the post in the TikTok app. It’s the only way to put a trending sound from TikTok’s music library on a post.
A video draft ignores every other TikTok parameter, including the post body; a photo draft keeps everything except privacy_status. status: "published" means delivered to the creator’s inbox, not live on TikTok — permalink stays null and no insights are collected until they publish.
August 18
Section titled “August 18”New Account activity summary — A new GET /api/summary returns one snapshot of account activity instead of making you fan out across the posts, comments, and chats endpoints: posts published, failed, and scheduled, engagement totals, comments and reviews received, and DM volume, broken down per network — plus awaiting_reply counts for comments, reviews, and chats still waiting on you.
Pass window=24h (default), 7d, or 30d; every windowed count comes with its *_previous equivalent so a delta is two numbers, and from/to take an arbitrary range. Read-only, scoped like every other endpoint.
August 17
Section titled “August 17”New Reshare a LinkedIn post — Pass reshare_urn in the LinkedIn platform parameters of POST /api/posts, with either a post URN or a pasted LinkedIn post URL (normalized to the URN for you). The post body becomes the commentary above the reshared post — send an empty body for a plain repost, or combine with organization_id to reshare as a company page. A reshare can’t carry its own media: media together with reshare_urn returns a 422. API only for now.
New Quick replies and buttons in Facebook and Instagram DMs — Structured replies on Meta, the counterpart to Telegram’s reply_markup. POST /api/chats/:chat_id/messages takes quick_replies (up to 13 tappable chips, each a title and payload) and buttons (up to 3 per message, web_url or postback), plus an optional card for a richer product-style layout.
Buttons cap body at 80 characters (Meta’s limit), and Instagram is stricter than Messenger — chips only on plain-text messages. Also available through the MCP server’s dm_message_send; no composer field yet. See Quick replies and buttons for the full rules.
Improved Taps come back as tapped_action — A tapped chip, button, or ice breaker arrives as an inbound message carrying tapped_action — { kind, payload, title } — on both the message object and the message.received webhook, so payloads no longer have to be dug out of platform_data. It also resolves for taps received before today. Facebook button and ice-breaker taps now arrive as well; existing Pages pick this up automatically, no reconnect needed.
August 6
Section titled “August 6”New Post backfill and post syncs — Import the posts a profile published before you connected it. POST /api/profiles/:id/backfill_posts — or a date picker in the new Post sync section of a profile’s page — walks the feed backwards until it reaches your from date or the platform stops returning history.
Every pull is now recorded as a post sync with its status, timing, and post counts: list them with GET /api/profiles/:id/post_syncs or poll a run with GET /api/profiles/:id/post_syncs/:post_sync_id.
Imported posts behave like ones the poll picks up — source: "imported", post.imported webhook, insights and comments fetched. One backfill per profile at a time; posts you already have are skipped.
August 5
Section titled “August 5”New Comments across every post in one call — A new GET /api/comments returns comments spanning every post in the profile group, so you can poll for activity without walking post by post. Narrow it with post_ids, profiles, from/to, and page/per_page. The response is flat — replies are their own entries linked by parent_external_id — and each entry carries post_id, profile_id, and platform for use with the post-scoped endpoints. Newest first.
Improved Date filters on comments — GET /api/posts/:post_id/comments now accepts from and to (ISO 8601, or a bare date meaning that date’s start of day), filtering on when Postproxy received the comment. The response shape is unchanged.
New Idempotency keys — Every write request now accepts an optional Idempotency-Key header, so a dropped connection no longer forces a choice between a duplicate post and a lost one. Send a fresh key per logical operation and retry the request unchanged if you never saw a response: the retry replays the original status and body with an Idempotent-Replay: true header.
Only 2xx responses are stored, and stored responses expire after 24 hours. See Idempotency.
New Instagram user tags — Tag Instagram accounts in a post: pass user_tags in the Instagram platform parameters as an array of { "username": "natgeo", "x": 0.5, "y": 0.4, "media_index": 0 } objects, on a feed post, Reel, or Story. Images take x/y coordinates, Reels and video slides tag by username only, and media_index picks the carousel slide. API only for now.
New Human agent replies on Facebook and Instagram DMs — Meta approved the Human Agent feature for Postproxy, so a human can now reply free-form up to 7 days after the participant’s last inbound message instead of 24 hours. Pass tag: "HUMAN_AGENT" to POST /api/chats/:chat_id/messages; the app applies it automatically when you reply outside the 24-hour window.
Use it only for human-handled replies to the participant’s own inquiry — anything promotional or automated under this tag violates Meta’s policy and can get the account’s messaging suspended. See Messaging window.
July 2026
Section titled “July 2026”July 21
Section titled “July 21”Improved More LinkedIn post stats — LinkedIn post stats now normalize likes, comments, shares, and clicks alongside impressions in the stats object, surfaced in the app’s per-post stats and GET /api/posts/stats. These metrics were previously only available under their original names in raw_stats. Organization posts only — LinkedIn returns no stats for member (personal) profiles. Additive; existing keys are unchanged. See Stats fields by platform.
July 20
Section titled “July 20”Improved Raw platform stats on snapshots — Every post stats snapshot now carries a raw_stats object alongside the normalized stats, exposing each metric under its original platform name — including metrics that aren’t mapped into stats, like Instagram reach and Facebook’s full reaction-type breakdown. Returned by GET /api/posts/stats and in the platform_post.insights webhook payload; purely additive. See Stats fields by platform.
July 13
Section titled “July 13”New Assign placements to groups via the API — A new PATCH /api/profiles/:id/assign_placement_to_group endpoint moves an individual placement — a Facebook Page, LinkedIn organization, Telegram channel, Google Business location — into a different profile group, the same operation as the group selector on a profile’s page in the app. Pass placement_id (from List placements) and target_profile_group_id; the response returns the placement with its new profile_group_id. Group-scoped API keys can’t move placements across groups — use an account-wide key.
July 6
Section titled “July 6”New YouTube comments — Comments on your published YouTube videos, including nested replies, now sync into the per-post Comments view and GET /api/posts/:id/comments, and you can write top-level comments, reply, and delete — from the UI and the API, the same surface as the other comment platforms. Hide and like aren’t available (the YouTube Data API doesn’t offer them). YouTube profiles connected before today must be reconnected to grant the new permission; until you do, comment syncing stays off for that profile — posting is unaffected — and turns on automatically once you reconnect.
June 2026
Section titled “June 2026”June 29
Section titled “June 29”New Bring your own keys on every network — Bring-your-own-keys, previously X (Twitter) only, now covers every OAuth network: TikTok, YouTube, Google Business, Pinterest, Facebook, Instagram, LinkedIn, and Threads. Save your own developer app’s key and secret for a network on the Integrations page — now tabbed per platform — and any profile you connect or reconnect authenticates through your app, so you’re on your own rate limits instead of the shared pool. App secrets are stored encrypted. Changing or removing a network’s keys deactivates the profiles connected with them and prompts a reconnect against the new app.
June 23
Section titled “June 23”Improved Placement metadata — GET /api/profiles/:id/placements now returns a metadata object on each placement. For Google Business locations it carries the place_id (Google Maps Place ID), so you can cross-reference a location with Google Maps / Places or build a reviews permalink without a separate lookup. Additive — the existing id and name fields are unchanged.
June 22
Section titled “June 22”New Uploads endpoint for MCP clients — A new POST /api/uploads returns a short-lived upload target (key, upload_url, expires_in); push a file to the upload_url, then pass it as a media URL when you create a post. This is for remote MCP clients, which can’t send local file bytes through a JSON tool call — direct API callers can keep uploading files inline and don’t need it.
June 18
Section titled “June 18”New Split placements across profile groups — A connection’s individual placements — Facebook Pages, Pinterest boards, Telegram channels, Google Business locations — can now live in different profile groups, independent of where the connection itself is homed. Assign each one to its own group from the profile’s page, and group-scoped surfaces follow the placement: the profiles list, the posts list and group filter, the composer’s available pages, and queue targeting. Think of it as connecting the same Facebook account once per group, each with only the relevant Page — which Facebook doesn’t technically allow.
June 16
Section titled “June 16”New First comments on Facebook Reels — Set first_comment on a Facebook Reel to add a comment after publishing.
June 10
Section titled “June 10”New ig.me / m.me link referrals — When a user enters a DM thread via an https://ig.me/m/<username>?ref=... (Instagram) or https://m.me/<page>?ref=... (Facebook) link, the referral is stored on the chat (metadata.referral with the ref, source, and type) and a new referral.received webhook event fires with the ref and the chat object. Per Meta policy a referral also opens the 24-hour messaging window, so you can reply free-form before the user sends a message. On Instagram, Meta only delivers referrals for profiles with at least one ice breaker set.
New Instagram ice breakers — Manage the up to four suggested questions Instagram shows when a user opens a new thread with your business, via GET / POST / DELETE /api/profiles/:id/ice_breakers (docs). When a user taps one, Postproxy records it as an inbound direct message — body is the question, your payload rides along in platform_data — and fires message.received.
Improved Settings — Email and password changes moved from the Account tab to the Security tab, alongside 2FA; users who sign in via OAuth see which provider account they’re connected with instead of a password form. The Account tab now holds timezone plus a new Notifications section with a “Disconnected profile alerts” toggle (default on) for the profile-disconnected emails.
June 9
Section titled “June 9”New Comment failure webhooks — New comment.failed, comment.failed_waiting_for_retry, profile_comment.failed, and profile_comment.failed_waiting_for_retry webhook events fire when an outgoing comment or profile-comment reply errors out or is scheduled for retry. They reuse the .created payload shape, with error and error_details populated.
Improved Structured comment & message errors — Comments, profile-comment replies, and direct messages now return a structured error_details object — platform error code, subcode, message, and a Postproxy note — alongside an error summary, in both REST responses and webhook payloads. This matches what platform posts already return.
Improved Publishing logs — The publishing log now records comment, profile-comment, and direct-message activity, with a new Type filter (Posts, Comments, Profile Comments, DMs) that composes with the existing level and date filters.
Improved Profile lookups across groups — Reading or deleting a profile by ID — GET /api/profiles/:id, its /placements and /stats, and DELETE /api/profiles/:id — no longer needs a profile_group_id. Omit it and the profile is resolved across every group your API key or OAuth user can access, matching how POST /api/posts already works. Listing profiles without a group now spans all accessible groups too.
June 8
Section titled “June 8”Improved YouTube & TikTok — privacy_status is now optional when publishing. Omit it and the post defaults to the most public setting — public on YouTube, PUBLIC_TO_EVERYONE on TikTok — and POST /api/posts no longer returns a 422 for a missing privacy_status on these networks. TikTok only accepts the public setting for production-audited apps, so unaudited or sandbox apps must still pass a private value.
June 5
Section titled “June 5”New Instagram story mentions & replies — Inbound direct messages now surface story interactions. A story mention arrives as a message with a story_mention attachment whose media is mirrored to durable storage (the original Meta URL expires with the story). A reply to one of your stories carries a story_reply object pointing at the source story.
Improved Comments — POST /api/posts/:id/comments and POST /api/profiles/:id/comments now take a body parameter, consistent with the rest of the API. The previous text parameter still works as an alias, so existing integrations keep running.
Improved Direct Message webhooks — message.* webhook payloads now mirror the full REST message shape, so you no longer need a REST refetch per inbound DM: chat_id, external_comment_id, reply_to_external_id, reply_markup, reactions, platform_data, and the new story_reply are all included. The message payload’s error field is now named error_message (was error) to match the REST API.
June 3
Section titled “June 3”New Direct Messages — Read and send 1:1 direct messages across Facebook, Instagram, Telegram, and Bluesky. A new Chats API adds chats and messages endpoints, private replies that turn a comment into a DM, reactions (Facebook & Instagram), message attachments (incoming and outgoing media), and delivery/read state. Telegram adds message edits, reply threading, and inline/reply keyboards (button taps arrive as inbound messages); Bluesky adds text DMs with archive/unarchive. A redesigned Chats UI ties it together.
New Comment attachments — Synced comments now include their media. GET /api/posts/:id/comments returns an attachments array on each comment (Facebook, Threads, and Bluesky), and the per-post Comments view renders images and videos inline.
New Google Business reviews inbox — A new account-wide Reviews page collects reviews from every connected Google Business location in one threaded list, with platform, profile, and location filters and an inline reply composer.
New Google Business photos — A new photo format uploads a standalone image straight to a location’s media gallery — no local-post text wrapper. Available in the composer alongside standard / event / offer and via the API with format: "photo" (just a location_id). Deletion and post sync are wired through, so the gallery’s photos import back as photo posts.
New X polls — Attach a native poll to an X post with the new poll format: 2–4 options (max 25 characters each) and a duration from 5 minutes to 7 days. Available in the composer as a content-type toggle and via the API with format: "poll" (poll_options array, poll_duration_minutes integer). Polls can’t be combined with media or threads.
June 1
Section titled “June 1”New Comments — A per-post Comments view with threaded replies, a composer, and an action bar. Comments now carry author and engagement details throughout the app and API. The removal flow is clearer, with undo. The API Playground gained comment recipes (list, get, create, reply).
Improved Webhooks — Creating and editing a webhook now happens on its own dedicated page instead of an inline form.
May 2026
Section titled “May 2026”May 24
Section titled “May 24”Improved Posting — You can create a post via the API without naming a profile_group_id when a profile id is passed — it’s resolved for you.
May 22
Section titled “May 22”Improved Publishing logs — From/To date pickers sit next to the level tabs, so you can filter logs and event counts by date while keeping the info/warn/error filter active.
May 20
Section titled “May 20”Improved Google Business — Reviews are pulled on a more frequent schedule.
May 15
Section titled “May 15”New Google Business — Reviews are pulled automatically as soon as you connect a location.
Improved Reviews — Google Business reviews returned from the API and the profile_comment.created webhook now include a permalink to the location’s public reviews page on Google.
May 14
Section titled “May 14”New Per-attachment errors — When a single image or video in a post fails to publish, the reason is now shown on the post page and returned in the API.
May 13
Section titled “May 13”New Google Business Profile — New integration: publish standard, event, and offer posts, pull in reviews, and read reviews through the profile-comments API.
May 12
Section titled “May 12”New Telegram & Bluesky — Both are now generally available in the “Add a profile” list for every account.
New Profile stats — A new GET /api/profiles/:id/stats endpoint, plus expanded follower/engagement stats in profile responses.
Improved Your own keys — Saved credentials gained a “pull stats” toggle on the Integrations page.
Improved Composer — Clearer inline messaging when no Facebook Page or Pinterest board is available to post to.
May 11
Section titled “May 11”Improved Webhooks — Redesigned form with clearer event selection.
New Telegram — Channel posting is fully launched: publish, delete, per-platform options, and API docs.
New Profile stats — Per-profile follower and engagement snapshots, surfaced in the app and pushed via webhooks.
Improved Profiles — Section redesigned with a profile detail page, an analytics view, and group filtering.
Improved Composer — Redesigned with a clearer publish summary and platform cards.
New OAuth discovery — Protected-resource discovery (RFC 9728) so AI agents and MCP clients can find the auth server automatically.
New Workspace Overview — A new dashboard with an API call-volume chart, recent activity, and global search.
New Your own keys — Bring your own X (Twitter) developer keys, managed on a new Integrations page.
Improved Posts — The posts list can now be filtered by profile group and profile.
Improved Threads — Large, high-bitrate Threads videos are now transcoded automatically before publishing, so clips that previously failed to upload now go through.
Improved X (Twitter) — The published-post limit is now enforced consistently across the app and API.
Improved TikTok — Outgoing videos are transcoded automatically, so unsupported source files now publish.
Improved Instagram — Reels publishing reliability improvements.
April 2026
Section titled “April 2026”April 30
Section titled “April 30”New Bluesky — New platform. Connect with an app password, then publish text, image, and video posts and threads with automatic mention/hashtag/link facets and link-card previews.
April 29
Section titled “April 29”New Profile avatars — Avatars are fetched from each platform on connect, shown in the profile picker and lists, and returned as avatar_url from the API.
April 28
Section titled “April 28”New Two-factor authentication — TOTP plus backup codes, available for all accounts.
Improved Imported posts — “Synced” is now “Imported” everywhere, with a new post.imported webhook, a Source badge (Synced / API / App) on the posts list and detail, and a source field on API post responses.
April 27
Section titled “April 27”New Import posts — Pull posts you’ve already published natively on a connected account back into Postproxy, tagged with their source.
New API Playground — An in-app interactive console with recipes for publishing posts, listing posts and profiles, and fetching stats.
April 24
Section titled “April 24”Improved Profiles — A search box at the top of Profiles matches across all your profile groups by name, network, or ID, with results in one unified list.
April 23
Section titled “April 23”Improved X (Twitter) — Posts with links in the body are rejected with a clear error pointing you to threads instead.
Improved Profiles — A “Disconnect” button next to profiles that need re-authentication.
April 22
Section titled “April 22”New Per-platform attachments — Use distinct media or cover images per platform (Instagram Reels, YouTube, Pinterest) via cover_url/cover_file, with base64, data-URI, and multipart upload formats.
New Teams — Invite or edit team members and choose which profile groups each can access.
Improved Comments — Comments that fail on a transient error now retry automatically instead of getting stuck.
April 20
Section titled “April 20”Improved App redesign — Rebuilt sidebar with Workspace and Developer sections, plus a redesigned posts index, publishing logs, and account settings.
New Structured errors — Platform posts now carry structured error_details (platform error code, subcode, message, and a Postproxy note) in API responses and in the post.published / post.failed / post.insights_updated webhooks.
April 19
Section titled “April 19”Improved API validation — Platform parameter types (boolean, integer, array, string) are validated on post create/update with clearer error messages.
April 17
Section titled “April 17”New Delete posts — Soft-delete for posts and platform posts: deleted items disappear from lists, counts, and API responses without losing history. A new POST /api/posts/:id/delete_on_platform endpoint and a delete_on_platform flag on DELETE /api/posts/:id, with a new delete dialog. Supported on Facebook, Threads, X, LinkedIn, Pinterest, and YouTube.
April 16
Section titled “April 16”New Unpublish — Delete a post on the platform straight from the post page, for Facebook, Instagram, and Threads.
April 15
Section titled “April 15”New YouTube — New tags, category_id, and contains_synthetic_media parameters.
April 12
Section titled “April 12”Improved Instagram — Dozens of Instagram error subcodes are now mapped to clear categories (media validation, quota, account restricted, spam, transient). Failed posts show why they failed and whether they’ll retry.
April 10
Section titled “April 10”New OAuth apps — Third parties can request access to a Postproxy account with read/write scopes through a redesigned authorization screen.
April 7
Section titled “April 7”Improved Threads — Multi-attachment posts and replies now publish reliably.
Improved Posts — A permalink is now included on platform posts in API and webhook responses.
April 2
Section titled “April 2”Improved Instagram — Clearer transient vs. permanent error messages, so you can tell when a failure will retry on its own.
March 2026
Section titled “March 2026”March 31
Section titled “March 31”Improved Posts — The post detail page now shows comments.
March 30
Section titled “March 30”New Webhooks — A new comment.created event fires whenever a comment you authored through Postproxy is published, with a full comment payload (body, author info, permalink, like/reply counts).
March 29
Section titled “March 29”New Notifications — Email notifications when you’re approaching or have reached your posting limit, plus an Instagram token-expiry notice.
March 28
Section titled “March 28”Improved X (Twitter) — A clear “daily limit reached” message in the app and API once a profile hits its 24-hour posting cap.
March 25
Section titled “March 25”New Comments API — List, create, delete, hide, and like comments across Instagram, Facebook, YouTube, Threads, and LinkedIn.
March 24
Section titled “March 24”Improved OAuth — Cancelling or failing an OAuth flow now lands you somewhere useful — back at the originating profile group or invitation, with a clear message — instead of the root URL.
March 22
Section titled “March 22”New Base64 uploads — The media array on post create/update accepts base64 input as either a data: URI string or a { base64, content_type, filename? } object, so you can upload files without hosting them first.
Improved Profiles — Connecting an account that returns no name (some Instagram/Facebook business accounts) no longer fails — the profile saves as “No name” and can be renamed afterward.
March 20
Section titled “March 20”Improved API validation — Media URLs pointing at localhost or 127.0.0.1 are rejected with a clear message directing you to upload local files directly.
March 19
Section titled “March 19”New Edit posts via API — A new PATCH /api/posts/:id lets you edit drafts and not-yet-publishing scheduled posts: change the body, schedule, draft state, profile list, per-platform options, media, or thread tweets, with the same 5-minute pre-publish buffer as the app.
Improved Sign-up — Page redesigned with testimonials.
March 13
Section titled “March 13”New LinkedIn — The composer accepts document attachments (a single PDF, DOC/DOCX, or PPT/PPTX up to 100 MB), uploaded as native LinkedIn document posts.
March 12
Section titled “March 12”New Facebook — A Reel format in the composer with its own options (page, title, first comment), for mp4/mov videos up to 300 MB and 3–60 seconds.
New Onboarding — A dedicated onboarding flow that walks new users through connect a profile → create a post → done, advancing automatically as you go.
New API — A new GET /api/me returns the account name and the name of the API key you authenticated with.
March 11
Section titled “March 11”Improved Posts — Scheduled posts are now editable up to 5 minutes before they publish, not just drafts.
Improved Webhooks — Delivery rows on the endpoint page expand in place to show the full, pretty-printed JSON payload of each delivery.
March 9
Section titled “March 9”New Posting queues — Define a named queue per profile group with weekly recurring time slots and a timezone, then drop posts in and let Postproxy assign each one the next free slot (up to 8 weeks ahead). Managed in the app and via /api/queues, with optional jitter to nudge each slot by a few minutes.
March 6
Section titled “March 6”Improved Attachments — URL-based media now handles links that contain literal spaces, so badly-quoted source URLs no longer fail to download.
March 5
Section titled “March 5”New Character limits — Per-platform character limits are now enforced and shown as you write.
March 4
Section titled “March 4”Improved UI polish — A unified create-post button, tooltips on action icons, and consistent selectors throughout.
March 3
Section titled “March 3”Improved Posts API — GET /api/posts returns a compact, much faster response that omits per-attachment objects and per-platform insight snapshots — use GET /api/posts/:id for the full payload.
March 2
Section titled “March 2”New Threads — Threads posts can now include image and video attachments — a single file or up to 10 in a carousel — in addition to text-only posts, via the composer and POST /api/posts.
New Webhooks — Configurable webhook endpoints with delivery tracking and a dedicated UI.
New YouTube — A “Made for Kids” toggle on video posts in the composer and via networks.youtube.made_for_kids.
Improved API validation — POST /api/posts rejects requests missing required platform options (such as Facebook/Instagram page_id, TikTok/YouTube privacy_status, or Pinterest board_id) with a 422 listing each missing field and a hint pointing to /api/profiles/:id/placements.