New, changed, deprecated and removed capabilities in the Tailwind REST API and MCP server, newest first. Bug fixes are listed only when they change what a caller can do or rely on. Entries marked Breaking need a change on your side: a removed capability, or one that now behaves differently for existing callers.
The same entries are published as a machine-readable JSON Feed at https://api-docs.tailwind.ai/changelog.json. Agents and integrations that track Tailwind’s capabilities should read the feed rather than this page; its format is described in Feed format.
A Pin that Tailwind's AI generated, from a generation request or a connected feed, is a draft that never publishes on its own. The post list and the generationId field now say so, and a new guide shows how an AI assistant or a script reviews those drafts against your own criteria, revises them, schedules the good ones and deletes the rest. Nothing on the wire changed.
When Pinterest fails an analytics read with an error on its side, account analytics, top Pins, the Pin inventory and Pin analytics still answer 500, but now with reason pinterest_upstream_error and a message saying that retrying right away will not help. These requests used to fail with a generic "An unexpected error occurred". Try again later.
A cursor that cannot be used for the post list, such as a malformed one or one taken from a list with a different status or date range, now gets a 400 saying to pass the previous page's cursor unchanged or start again without one. These requests used to fail with a generic 500, which read as worth retrying.
Creating or editing a post now refuses a destination url longer than 1000 bytes (UTF-8) with a 400 naming url. Such a url could not be stored and used to fail with a generic 500. A mediaUrl on a Tailwind image host that is not a Tailwind image a Pin can use is refused with a 422 and reason media_url_not_pablo_asset; pass the image's original URL or upload the file instead. Nothing is written in either case.
Scheduling or rescheduling a post now answers a refusal with its own status and message instead of a generic 500. A draft saved with multiple interval Boards cannot be scheduled this way and gets a 400 saying so; create the Pin with intervalBoards on create_post instead. A post that changed status while it was being scheduled gets a 409; read it back before retrying. Neither writes anything, and any charge is refunded.
Accounts now carry tokenStatus: authorized, unauthorized, or unknown. unknown means Tailwind could not check the Pinterest connection just now, usually a temporary failure, and is not a reason to reconnect. tokenAuthorized is unchanged and is still false in that case, so read tokenStatus to tell a revoked connection from an unverified one. list_accounts and get_account only ask for a reconnect when the status is unauthorized.
POST /v1/accounts/{accountId}/post-batches takes up to 175 Pins, each with its own image, copy, link, Board and schedule, and returns a batch id. GET /v1/post-batches/{batchId} reports each Pin as created, failed or pending, in request order. Drafts can leave out the image and get the placeholder, which must be replaced in Tailwind before the Pin can be scheduled. Send an Idempotency-Key header to make a resend safe. create_posts and get_post_batch bring the same to MCP.
A new read lists the Pins on one of the account's boards, secret boards included, with each Pin's Pinterest URL, image URL, destination link, saved time and board section. Pages follow Pinterest's board order and can be filtered by date. It is free and consumes no credits.
Listing queued posts now returns them by send time, soonest first. They used to come back newest-created first, so an assistant could not show a schedule in order. Without a startDate the list now begins at the current time, so queued posts whose send time has passed are listed only under status missed. Other statuses keep their order.
get-account-connect-link returns a browser link that adds another Pinterest account to the organization, or re-authorizes an existing one whose tokenAuthorized is false. For a new account it first checks that the caller is an organization admin and the plan has room, and returns the reason instead of a link when it does not. Nothing is connected or billed until the user completes the flow in a browser signed in to the same Tailwind organization.
When Pinterest rate-limits a connected account, account analytics, top Pins, the Pin inventory and Pin analytics now answer 503 with reason pinterest_rate_limited and, when Pinterest reports it, a Retry-After header. These requests used to fail with a slow 500. A 429 always means the organization's daily request limit. MCP tool errors now carry the reason in their error metadata.
The connect_pinterest_account tool returns a browser link that adds another Pinterest account to the organization, or re-authorizes one whose Pinterest token has expired. When a new account can't be added it says why instead. list_accounts and get_account now point to it for expired accounts rather than sending the user to the dashboard.
When no Pinterest account is connected, list_accounts now has the assistant fetch a connect link from connect_pinterest_account and tell the user what connecting unlocks, or relay why no link was given.
The daily request limit is now 10,000 requests per organization, shared by every API key and every OAuth connection in it, including MCP clients. It was 5,000 per API key, and OAuth requests were not counted. A request over the limit returns 429 with a Retry-After header giving the seconds until the limit resets at midnight UTC.
Reading a generated Pin's design now also returns sourceImageCandidates: the photos the user picked for its SmartPin and the photos Tailwind scraped and scored from the source page. Pass one as mediaUrl to the design update to rebuild the Pin around a different photo.
When Pinterest limits the lookups behind a top Pins read, some ranked Pins can't be loaded. The response now sets isPartial and lists those Pins in omittedPinIds, in ranking order, instead of returning a shorter list that looks complete. Retrying shortly should return the full list. list_top_pins tells the assistant the list is incomplete.
Listing Boards now returns each Board's pinsModifiedAt, the time Pinterest last recorded a change to the Board's Pins. An old date marks a Board that has gone quiet, so a Board audit no longer has to read every Pin to find the Boards that need refreshing.
A generation that fails with failureCode scrape-failed now carries a failureDetail when the cause is known: blocked (the site refuses Tailwind's scraper), no-content (the page had no readable text, often because it was just published) or fetch-failed (the page couldn't be loaded). Use it to decide whether a retry can help.
Tailwind is waiting for Pinterest to approve access to its Pin search API. Pinterest's public search stopped returning Pins that can be saved, so until access is granted get-recommended-pins returns 503 with reason recommended_pins_awaiting_pinterest_access instead of recommendations. Saving Pins whose IDs you already have still works.
Saving Pins onto a board created through Tailwind in the last hour stays free for up to 50 Pins in total. Any other save now costs what scheduling a Pin costs: one credit per saved Pin on credit plans, or one post from the post allowance on legacy and Shopify billing. A save the plan cannot cover returns 402 with nothing saved.
pinterestSearchVolume on a saved keyword is now absent when Tailwind has no Pinterest search volume data for the term, instead of 0. Treat a missing value as unknown rather than zero demand, the same as the commercialIntentScore and detectedLanguage fields.
Board lists, the ordered groups of Boards used to publish one Pin across several Boards at an interval, can now be created, replaced and deleted. An update sends the full ordered set of Boards. Changing a board list never changes the Boards or their Pins on Pinterest.
PATCH /v1/accounts/{accountId}/posts edits a batch of draft or scheduled Pins, each with its own fields. A save needs a preview token from a dryRun request first, and each result carries the Pin's previous values so the edit can be undone. MCP clients use preview_update_posts, then update_posts.
A Pin generation can be cancelled while it is still queued, and is then never charged. It reads back as failed with failureCode generation-cancelled. Once generation has started the cancel is refused.
GET /v1/accounts/{accountId}/pins lists every Pin on the connected Pinterest account, newest first, however it was published: through Tailwind, directly on Pinterest, or by another tool. MCP clients use list_pins.
Pausing stops every scheduled Pin on the account from publishing without changing the Pins. A Pin whose time arrives during the pause fails with failureReason publishing_paused and is not retried on resume, so reschedule it.
GET /v1/accounts/{accountId}/posts/{postId}/image returns the Pin's image as raw bytes: the cover of an image or carousel Pin, or a video Pin's cover. Use it when you cannot fetch the post's mediaUrl yourself. MCP clients use get_post_image.
When Pinterest fails a Board, Board section or Pin write with an error of its own, the response is now a 502 with reason pinterest_request_failed instead of a generic 500. A create may still have taken effect, so list Boards or sections before repeating one; other requests can be retried.
Unschedule a queued Pin, including a missed one, to revise it before it publishes. The Pin keeps its postId and everything stored on it; only its status and scheduled time change. Any scheduling credit it was charged is returned.
A failed post now carries failureReason, a stable code such as board_not_found or expired_token, and failureMessage, the explanation the Tailwind dashboard shows. New codes are added over time, so treat an unknown code as a generic failure.
GET /v1/accounts/{accountId}/boards now documents distinct errors for a disconnected account, a Pinterest reconnect, rate limiting, a Pinterest failure (reason list_boards_upstream_failed) and a Pinterest timeout (reason pinterest_timeout). Branch on the error's reason rather than its message.
List an account's Pin Spacing rules, or ask which rule the scheduler applies to a given destination URL. Pin Spacing is the minimum gap kept between Pins that share a URL. Rules are read-only here and managed in the Tailwind dashboard.
Save existing Pinterest Pins (repins) onto one of the account's Boards, for example the recommended Pins found for a new Board's keyword. Pins that cannot be saved are counted in failedCount and the rest still save. Free.
Listing posts accepts status failed and missed. A missed post is a queued post whose send time passed without publishing. Missed needs a date window; failed takes both dates or neither.
open_schedule_calendar shows an interactive calendar of an account's scheduled, published, failed and missed Pins in clients that render MCP Apps interfaces, such as ChatGPT and Claude. Other clients get the account list as plain data.
Updating a post accepts isSimplifiedPin on drafts and scheduled Pins. Setting it to false is refused while the Pin has product tags; send an empty productTagPinIds in the same request to remove them.
delete_board now takes a required confirm argument. Any value other than true refuses the call and deletes nothing, so pass true only after the user has confirmed the Board and its Pins should be destroyed.
The text list_posts returns now shows each Pin's Board, Board section and publish time alongside its scheduled time, so a client that reads only the text can group Pins by Board without a get_post per Pin.
Account analytics and top Pins accept contentType: ORGANIC, PAID or ALL, the default. The filter applied is echoed back as contentType. Per-Pin analytics are always organic-only.
Each top Pin now includes creativeType, Pinterest's format for the Pin, such as REGULAR, VIDEO or CAROUSEL. Pinterest adds values over time, so treat it as an open set. It is null when Pinterest reports none.
Account usage now includes unlimitedScheduling. When it is true, scheduling Pins spends no credits whatever the credit balance says; credits still pay for AI generation.
See how much an account can still spend before a credit- or post-consuming action, and when it refills. Read billingSystem and scope to interpret the numbers. This read is free.
Read a generated Pin's design and change it: re-render a template design with a new title, colors, fonts or image, switch between rendered variations, revert to the original photo, or have AI regenerate a premium design. Regeneration spends credits and runs as a job to poll; the other edits are free.
Creating a post accepts carouselItems, up to four more images after the cover, each given as a mediaUrl or an uploadId. Posts read back with their carousel images in carouselItems.
Add, move and delete recurring weekly timeslots, or rebuild the whole smart schedule with a set number of slots per day. A rebuild deletes every non-evergreen slot. Managing the schedule is free.
Get public Pinterest Pins that fit one of the account's Boards for a keyword, strongest first, each with the relevance tier that earned its place. Pins already on the Board and promoted Pins are left out. Free.
Preview a site or feed URL, connect the feed, and Tailwind drafts a Pin for each new post it finds, once a day, for review; it never schedules or publishes. Generated Pins spend credits like manual generations. The MCP tools followed on 2026-09-19.
Score a Board's live Pinterest content against a keyword and get the Pins that earned the score. A scored request costs one credit; an absent result is free.
Read an account's Pinterest performance over a date window, its best-performing Pins ranked by one metric, and one Pin's performance with lifetime totals.
Updating a post accepts productTagPinIds, up to 24 product Pin IDs that replace the Pin's existing tags. Send an empty array to remove every tag. Tagging makes the Pin a simplified Pin.
This entry marks where the changelog starts. On this date the REST API and MCP server could list and read the connected Pinterest accounts, manage Boards and Board sections, and read Board lists, group Boards and subscriptions. They could create Pins from a media URL or an uploaded file, publish one Pin across several Boards at an interval, edit, delete, list and schedule Pins, and read the smart schedule. They could also generate Pins from a URL and Pin copy with AI, and list, save and delete Saved Keywords.
The feed is a JSON Feed 1.1 document, so any JSON Feed reader can subscribe to it. Each item uses the standard fields: id, url (a link to the entry on this page), title, content_text, date_published and tags. date_published is the day the change reached production, in UTC, at midnight. Items are ordered newest first. Tailwind-specific data is in a _tailwind extension object, as the JSON Feed spec allows.
The feed’s top-level _tailwind object holds about, a link to this section, and schema_version, currently 1.
Each item’s _tailwind object holds:
Field
Type
Description
type
string
added, changed, deprecated or removed
breaking
boolean
true when existing callers must change: always for removed, and for any change that alters behavior callers rely on
surfaces
array of strings
Which surfaces changed: rest (the REST API) and/or mcp (the MCP server)
rest_operations
array of strings
The operationIds of the REST operations affected, matching the OpenAPI specification
mcp_tools
array of strings
The names of the MCP tools affected
mcp_resources
array of strings
The URIs of the MCP resources affected
docs_url
string
Optional. The documentation for the capability. Absent when the capability no longer exists.
tags repeats type, the surfaces and, for breaking entries, breaking, for readers that don’t parse the extension.
An item’s id is permanent. An entry may be corrected after publication, but it keeps its id, so a reader that has seen it can skip it.
Within schema version 1, fields are only added, never removed, renamed or changed in meaning. Ignore fields you don’t recognize. The values of type and surfaces listed above are fixed for version 1.
A change that breaks this format will be published as a new schema version at a new URL. It will be announced in this changelog as a deprecation, and the version 1 feed will keep updating until the removal date that entry gives.