> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mymarky.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> API and documentation updates for the Marky public API

Public API release notes and documentation changes. Subscribe via **RSS** (feed URL below) or connect the feed to Slack or email automation tools.

**RSS feed:** [https://docs.mymarky.ai/changelog/rss.xml](https://docs.mymarky.ai/changelog/rss.xml)

**Email:** We are wiring **Mailchimp** digests for workspace administrators on accounts that use the API. Until that is live, use RSS so you do not miss breaking changes or new endpoints.

<Update label="July 2, 2026" description="Breaking: publish_to renamed to restrict_publish_to" tags={["breaking", "posts"]} rss="Breaking (beta): the optional post field publish_to is renamed to restrict_publish_to on create/update/schedule/publish, and in responses. The name makes the meaning clear: omit or null = publish to ALL connected platforms; a list restricts to those. The old publish_to key is no longer accepted (sending it now returns 422). Rename the field in your integration.">
  ### Breaking: `publish_to` → `restrict_publish_to`

  * **Clearer name for platform targeting** — the optional post field `publish_to` is now **`restrict_publish_to`** on create, update, schedule, and publish, and in responses. The name makes the behavior obvious: **omit it or set it to null to publish to ALL connected platforms**; provide a list (e.g. `["instagram", "facebook"]`) to restrict to just those.
  * **Action required** — the old `publish_to` key is **no longer accepted**; sending it returns a `422` naming the unknown field. Rename it to `restrict_publish_to` in your requests, and read `restrict_publish_to` from responses. (It briefly shipped as an accepted alias; that alias is now removed.)
</Update>

<Update label="July 2, 2026" description="Daily and weekly rate limits added alongside the per-minute limit" tags={["rate-limits"]} rss="Rate limits: alongside the existing 100 requests/minute, each API key now also has a 2,000/day and 10,000/week limit. A 429 response names the window you hit; the X-RateLimit-* and Retry-After headers tell you when to retry.">
  ### Rate limits

  * **Daily and weekly limits added** — alongside the existing **100 requests/minute**, each API key now also has a **2,000 requests/day** and **10,000 requests/week** limit. These are generous for normal automation (a weekly batch of 10 posts uses \~20 requests). A `429` response names the specific window you hit, and the `X-RateLimit-*` and `Retry-After` headers tell you when to retry. See [Errors](/errors#rate_limit_exceeded) for header details.
</Update>

<Update label="June 30, 2026" description="Business-scoped endpoints are now nested under /api/businesses/{business_id}" tags={["breaking", "endpoints"]} rss="Breaking: business-scoped endpoints (posts, topics, library, media, files, folders, jobs, per-integration stats) are now nested under /api/businesses/{business_id}/.... The business_id moves from the request body or query string into the URL path.">
  ### Breaking changes

  * **Business-scoped endpoints are now nested under the business** — endpoints that operate on a single business now live under `/api/businesses/{business_id}/...` (for example `POST /api/businesses/{business_id}/posts`, `GET /api/businesses/{business_id}/topics`, `POST /api/businesses/{business_id}/media`). The `business_id` moves out of the JSON body and query string and into the URL path. Org-level endpoints (`/api/businesses`, `/api/keys`, `/api/webhooks`, `/api/feedback`, `/api/health`) are unchanged.
</Update>

<Update label="May 19, 2026" description="Publish-now, stats, and platform-post listing endpoints" tags={["features", "publishing", "stats", "integrations"]} rss="New: publish a post immediately via POST /api/businesses/{business_id}/posts/{post_id}/publish, fetch per-platform stats for a Marky post or business, list connected integrations on a business, list posts published to any connected platform account, and raw passthrough stats endpoints for accounts not connected through Marky.">
  ### New features

  * **Publish a post immediately** — [`POST /api/businesses/{business_id}/posts/{post_id}/publish`](/api-reference/publish-post) fires the publish flow in the background and returns the post right away. Poll [`GET /businesses/{business_id}/posts/{post_id}`](/api-reference/get-post) for the final status. Optional `publish_to` body restricts the publish to a subset of connected platforms.
  * **List integrations on a business** — [`GET /api/businesses/{business_id}/integrations`](/api-reference/list-integrations) returns the connected social accounts (platform, username, page, status). Use the `id` field as the `integration_id` in stats endpoints.
  * **List posts on a connected platform** — [`GET /api/businesses/{business_id}/integrations/{integration_id}/posts`](/api-reference/list-integration-posts) lists posts on the connected account (Marky-posted or otherwise) with stats. Supports cursor-based pagination. Covers all 7 platforms.
  * **Per-post stats — all platforms** — [`GET /api/businesses/{business_id}/posts/{post_id}/stats`](/api-reference/get-post-stats) returns per-platform metrics for a post published through Marky, hydrated from your connected integrations. Covers Facebook, Instagram, LinkedIn, Twitter/X, TikTok, Pinterest, and YouTube. Stats are normalized into a consistent shape (`likes`, `comment_count`, `reach`, `views`, `impressions`, etc.) — no per-platform branching in your code.
  * **Per-integration stats** — [`GET /api/businesses/{business_id}/integrations/{integration_id}/stats`](/api-reference/get-integration-stats) returns account metrics for a single integration. [`GET /api/businesses/{business_id}/integrations/{integration_id}/posts/{external_post_id}/stats`](/api-reference/get-integration-post-stats) returns metrics for a single post on a single platform — useful with the `publish_id` values from [`/businesses/{business_id}/integrations/{integration_id}/posts`](/api-reference/list-integration-posts).
</Update>

<Update label="April 27, 2026" description="Media upload improvements, reliability & billing fixes" tags={["updates", "media", "reliability"]} rss="Updates: Giphy URLs allowed in media uploads, retry logic for transient errors on CRUD endpoints, restored analytics view columns. Fixes: malformed EXIF handling, image search fallback, Stripe webhook plan sync, narrower checkout fraud blocks. Security: RLS tightened on API keys and Canva connections.">
  ### Updates

  * **Giphy URLs in media uploads** — `giphy.com` is now an allowed host suffix when [uploading media](/api-reference/upload-media), so you can pass Giphy-hosted GIFs directly without re-uploading.
  * **Better image upload handling** — Images with malformed EXIF metadata no longer fail to upload, and image generation errors now return clearer messages.
  * **Retry on transient errors** — CRUD endpoints now automatically retry transient database errors, improving reliability for [posts](/api-reference/list-posts), [businesses](/api-reference/list-businesses), [topics](/api-reference/list-topics), and [media](/api-reference/list-media).
  * **Restored analytics fields** — Post-count and period columns are back on business analytics views, so business summaries return complete data.

  ### Bug fixes

  * Fixed search fallback when looking up uploaded images — orphaned uploads are now correctly resolved.
  * Plan restrictions are kept in sync when Stripe sends subscription updates, preventing stale limits after plan changes.
  * Narrowed the checkout fraud block to true fraud signals so legitimate customers are no longer incorrectly blocked.
  * Stripe `InvalidRequestError` responses are now logged with full context before being surfaced as a `400`, making billing failures easier to debug.

  ### Security

  * Row-level security is now enforced on API keys and Canva connections, so credentials are only readable by the org that owns them.
</Update>

<Update label="April 20, 2026" description="Creative formats, AI image styles & reference images" tags={["features", "generation", "canva"]} rss="New: creative format selection for posts (design, carousel, meme, image, gif, video), AI image style modifiers, reference image support for video generation, audio URL for shorts, Canva integration improvements, and bug fixes.">
  ### New features

  * **Creative format selection** — You can now specify a `creative_formats` array when [creating posts](/api-reference/create-post) to control the visual format of each post. Options include `design`, `carousel`, `meme`, `image`, `gif`, and `video`. Formats are cycled round-robin across your generated posts.
  * **AI image style modifiers** — Marky now applies style modifiers and creative type mapping when generating AI images, producing visuals that better match the tone and format of each post.
  * **Reference images for video generation** — Pass `reference_images` when generating videos to guide the visual style. Useful for maintaining brand consistency across video content.
  * **Audio URL for shorts** — You can now provide an `audio_url` when generating shorts, giving you direct control over the audio track instead of relying on auto-selected music.

  ### Improvements

  * **Canva design owner filtering** — Marky now identifies the owner of imported Canva designs and surfaces a clearer error when a design is shared as view-only, so you know exactly what to fix.
  * **Imagery preferences in media search** — Your business-level imagery preferences are now consistently applied during media selection, so generated posts better reflect your visual brand.
  * **Webhook reliability** — Background poster generation and webhook delivery have been restored for more reliable post-publish notifications.
  * **Analytics accuracy** — Post analytics now correctly handle posts with zero views instead of treating them as missing data.

  ### Bug fixes

  * Fixed thumbnail generation for deleted or inaccessible videos — the system now handles these gracefully instead of failing silently.
  * Improved video URL detection to support additional formats during thumbnail extraction.
  * Fixed an issue where providing a `custom_idea` without topics would not use the idea as the post topic.
  * Corrected the post restriction period reset schedule for subscription limits.
</Update>

<Update label="April 13, 2026" description="First comment, video upgrades, smart crop & more" tags={["features", "video", "publishing"]} rss="New: auto-post first comment on Facebook/LinkedIn, video speedup transforms, smart image cropping, layout-aware text sizing, BYOK for Gemini image/video generation, carousel video support, and several post generation fixes.">
  ### New features

  * **First comment on publish** — When a post goes live on Facebook or LinkedIn, Marky can now automatically add the post link as the first comment. Useful for driving traffic without cluttering the caption.
  * **Video speedup transforms** — Speed up video clips during post generation. Marky applies the transform automatically when a faster pace fits the design.
  * **Bring Your Own Key (BYOK) for Gemini** — Connect your own Google Gemini API key to generate images and videos. BYOK orgs are not charged Marky credits for AI generation in Max chat.
  * **Carousel video support** — Video generation now works with multi-page (carousel) templates, so you can create richer video posts.
  * **AppSumo credit allowance** — AppSumo users now receive a monthly credit allowance.

  ### Improvements

  * **Smarter text sizing** — Post designs now auto-cap character counts based on the actual box dimensions and a minimum readable font size. Overflowing CTA text is shortened automatically.
  * **Layout-aware copy** — The LLM receives `max_lines` and `chars_per_line` constraints so generated text fits the design without overflow.
  * **Smart image cropping** — Google Vision `CROP_HINTS` are used to frame subjects better across all generated images.
  * **Better video music** — Background music volume is reduced, and the music picker uses genre-based fallback instead of random selection when no audio tags are set.
  * **Imagery preferences** — Your business-level imagery preferences now influence the image keywords Marky generates, giving you more relevant visuals.
  * **Onboarding improvements** — New businesses generate 15 candidate posts during onboarding and surface the best 10 (previously 10 → 3).

  ### Bug fixes

  * Fixed a crash caused by non-numeric `letterSpacing` values in post designs.
  * Fixed text vertical alignment in video rendering.
  * Fixed an issue where video audio tracks were not persisted when saving designs.
  * Corrected media type detection — uploaded videos are no longer incorrectly tagged as images.
  * Fixed empty-string UUID handling in post placeholder creation.
  * Resolved an error when extracting frames from inaccessible video URLs — the API now returns an actionable error message.
  * Fixed video foreground animations using an unsupported `ZOOM` effect.
</Update>

<Update label="April 9, 2026" description="Docs & limits" tags={["documentation", "rate-limits"]} rss="Documentation: rate limits are 100 requests per minute per API key (not per hour). Changelog RSS enabled at /changelog/rss.xml.">
  * Clarified **rate limits** in the Introduction and Errors guides (100 requests **per minute**).
  * Added this **changelog** with an RSS feed for integrations and automation tools.
</Update>

<Update label="April 8, 2026" description="Public API preview" tags={["launch", "api"]} rss="Marky public API preview: org-scoped API keys, posts, businesses, topics, media, webhooks, and feedback endpoint. Base URL https://api.mymarky.ai/api.">
  **Public API (preview)** — Automate posting and workspace management:

  * Org-scoped **API keys** (create in Organization Settings in the dashboard).
  * **Posts**, **businesses**, **topics**, **library / media**, **webhooks**, and **feedback** endpoints.
  * Base URL: `https://api.mymarky.ai/api`

  The API remains in **preview**; see [Terms](/terms) and [Versioning](/versioning) for how we handle changes.
</Update>
