Connect a feed
const url = 'https://api-v1.tailwind.ai/v1/feeds';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"feedUrl":"example","accountId":"example","keywords":["example"],"designTier":"basic","premiumStyle":"image-highlight","generationFrequency":"every-3-days","autoRegenerate":true}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api-v1.tailwind.ai/v1/feeds \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "feedUrl": "example", "accountId": "example", "keywords": [ "example" ], "designTier": "basic", "premiumStyle": "image-highlight", "generationFrequency": "every-3-days", "autoRegenerate": true }'Subscribe to an RSS feed. The feed’s current posts are snapshotted as the baseline, so nothing already published generates a Pin — only posts appearing on a later watcher run do.
The watcher runs once a day and creates each Pin as a draft for review; it never schedules or publishes. Generated Pins consume SmartPin credits at the same rate as manual ones, so connecting many feeds can drive credit use.
feedUrl must be an actual feed. Use preview-feed first when you only have a site URL.
accountId must name a currently connected Pinterest account: a feed assigned to a disconnected one would be skipped by the watcher every day without any error, so this is refused with 400 rather than accepted silently.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
A resolved RSS or Atom feed URL. Use preview-feed to turn a site URL into one.
Pinterest account the generated Pins are assigned to, from list-accounts.
Applied to every Pin this feed generates.
Defaults to basic. premium requires premiumStyle.
Required when designTier is premium, and rejected otherwise.
Responses
Section titled “Responses”The feed was connected
object
object
A connected RSS feed subscription.
object
Feed ID. Pass to get-feed, update-feed, delete-feed.
Pinterest account the generated Pins are assigned to.
The feed’s own title, when it declares one.
Keywords applied to every Pin this feed generates.
Design treatment for generated Pins. template-match is readable but cannot be set through this API — it is not generally available.
Set only on the premium tier; null otherwise.
How often a generated Pin is redesigned, when autoRegenerate is on. Not how often the feed is checked — that is daily.
Whether generated Pins are periodically redesigned.
A paused feed generates nothing, but is also not polled — so posts published while it is paused are treated as new on resume.
ISO 8601 timestamp of the last watcher run over this feed, or null if it has not run yet.
Why the last poll failed, or null. A feed that keeps failing here is usually unreachable rather than empty.
SmartPins generated from this feed so far.
ISO 8601
ISO 8601
object
Unique request ID for debugging
Example
{ "data": { "feed": { "designTier": "basic", "premiumStyle": "image-highlight", "generationFrequency": "every-3-days", "status": "active" } }}Invalid request
object
object
Error code
Error message
Machine-readable denial reason. Present on PAYMENT_REQUIRED errors: insufficient_credits, trial_exhausted, no_access, account_not_connected, legacy_post_limit_exceeded.
Present on PAYMENT_REQUIRED errors: where the denial can be resolved. Reason-specific, because buying credits does not clear a trial, access or connection denial. Requests sent with X-Request-Source: mcp receive an informational plans page instead, so agent surfaces never present a purchase link.
object
Unique request ID for debugging
Example
{ "error": { "code": "BAD_REQUEST", "message": "Invalid request body" }, "meta": { "requestId": "abc123" }}Authentication required or invalid bearer credentials
object
object
Error code
Error message
Machine-readable denial reason. Present on PAYMENT_REQUIRED errors: insufficient_credits, trial_exhausted, no_access, account_not_connected, legacy_post_limit_exceeded.
Present on PAYMENT_REQUIRED errors: where the denial can be resolved. Reason-specific, because buying credits does not clear a trial, access or connection denial. Requests sent with X-Request-Source: mcp receive an informational plans page instead, so agent surfaces never present a purchase link.
object
Unique request ID for debugging
Example
{ "error": { "code": "UNAUTHORIZED", "message": "Invalid API key" }, "meta": { "requestId": "abc123" }}Resource not found
object
object
Error code
Error message
Machine-readable denial reason. Present on PAYMENT_REQUIRED errors: insufficient_credits, trial_exhausted, no_access, account_not_connected, legacy_post_limit_exceeded.
Present on PAYMENT_REQUIRED errors: where the denial can be resolved. Reason-specific, because buying credits does not clear a trial, access or connection denial. Requests sent with X-Request-Source: mcp receive an informational plans page instead, so agent surfaces never present a purchase link.
object
Unique request ID for debugging
Example
{ "error": { "code": "NOT_FOUND", "message": "Account not found" }, "meta": { "requestId": "abc123" }}This organization has already connected this feed
object
object
Error code
Error message
Machine-readable denial reason. Present on PAYMENT_REQUIRED errors: insufficient_credits, trial_exhausted, no_access, account_not_connected, legacy_post_limit_exceeded.
Present on PAYMENT_REQUIRED errors: where the denial can be resolved. Reason-specific, because buying credits does not clear a trial, access or connection denial. Requests sent with X-Request-Source: mcp receive an informational plans page instead, so agent surfaces never present a purchase link.
object
Unique request ID for debugging
Example
{ "error": { "code": "CONFLICT", "message": "You've already connected this feed." }, "meta": { "requestId": "abc123" }}The feed was fetched and parsed, but the result is too large to process. Retrying returns the same feed, so this needs a smaller one.
object
object
Error code
Error message
Machine-readable denial reason. Present on PAYMENT_REQUIRED errors: insufficient_credits, trial_exhausted, no_access, account_not_connected, legacy_post_limit_exceeded.
Present on PAYMENT_REQUIRED errors: where the denial can be resolved. Reason-specific, because buying credits does not clear a trial, access or connection denial. Requests sent with X-Request-Source: mcp receive an informational plans page instead, so agent surfaces never present a purchase link.
object
Unique request ID for debugging
Example
{ "error": { "code": "PAYLOAD_TOO_LARGE", "message": "That feed is too large for Tailwind to process. Try a feed with fewer or smaller entries." }, "meta": { "requestId": "abc123" }}The document was fetched but is not a usable RSS or Atom feed. Retrying will not help.
object
object
Error code
Error message
Machine-readable denial reason. Present on PAYMENT_REQUIRED errors: insufficient_credits, trial_exhausted, no_access, account_not_connected, legacy_post_limit_exceeded.
Present on PAYMENT_REQUIRED errors: where the denial can be resolved. Reason-specific, because buying credits does not clear a trial, access or connection denial. Requests sent with X-Request-Source: mcp receive an informational plans page instead, so agent surfaces never present a purchase link.
object
Unique request ID for debugging
Example
{ "error": { "code": "UNPROCESSABLE_ENTITY", "message": "The RSS feed could not be parsed. It may be malformed or in an unsupported format." }, "meta": { "requestId": "abc123" }}The site could not be read. Either it did not respond, or its firewall refused us — the message says which, and a bot-protection refusal names the user agent to allowlist.
object
object
Error code
Error message
Machine-readable denial reason. Present on PAYMENT_REQUIRED errors: insufficient_credits, trial_exhausted, no_access, account_not_connected, legacy_post_limit_exceeded.
Present on PAYMENT_REQUIRED errors: where the denial can be resolved. Reason-specific, because buying credits does not clear a trial, access or connection denial. Requests sent with X-Request-Source: mcp receive an informational plans page instead, so agent surfaces never present a purchase link.
object
Unique request ID for debugging
Example
{ "error": { "code": "FAILED_DEPENDENCY", "message": "This site's firewall or bot protection is blocking Tailwind from reading the feed. Ask your security provider to allow the TailwindApp-SiteIndexer user agent, then try again." }, "meta": { "requestId": "abc123" }}Rate limit exceeded
object
object
Error code
Error message
Machine-readable denial reason. Present on PAYMENT_REQUIRED errors: insufficient_credits, trial_exhausted, no_access, account_not_connected, legacy_post_limit_exceeded.
Present on PAYMENT_REQUIRED errors: where the denial can be resolved. Reason-specific, because buying credits does not clear a trial, access or connection denial. Requests sent with X-Request-Source: mcp receive an informational plans page instead, so agent surfaces never present a purchase link.
object
Unique request ID for debugging
Example
{ "error": { "code": "RATE_LIMIT_EXCEEDED", "message": "Daily rate limit of 5000 requests exceeded. Resets at midnight UTC." }, "meta": { "requestId": "abc123" }}The site did not answer within the fetch budget. Safe to retry.
object
object
Error code
Error message
Machine-readable denial reason. Present on PAYMENT_REQUIRED errors: insufficient_credits, trial_exhausted, no_access, account_not_connected, legacy_post_limit_exceeded.
Present on PAYMENT_REQUIRED errors: where the denial can be resolved. Reason-specific, because buying credits does not clear a trial, access or connection denial. Requests sent with X-Request-Source: mcp receive an informational plans page instead, so agent surfaces never present a purchase link.
object
Unique request ID for debugging
Example
{ "error": { "code": "GATEWAY_TIMEOUT", "message": "The site took too long to respond. Please try again." }, "meta": { "requestId": "abc123" }}