Recommend Pins to add to a board
const url = 'https://api-v1.tailwind.ai/v1/accounts/example/boards/example/recommended-pins?keyword=example&limit=10';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://api-v1.tailwind.ai/v1/accounts/example/boards/example/recommended-pins?keyword=example&limit=10' \ --header 'Authorization: Bearer <token>'Pins from Pinterest’s public search worth adding to this board for a keyword, strongest first, each carrying the relevance tier that earned its place. Excludes Pins already on the board, promoted/ad content, and anything that does not clear the relevance threshold — so relevance is never poor, and an empty list means nothing on-topic was found rather than that the board is bad. These are public Pins from across Pinterest, not the account’s own. Free: no credit is checked or spent.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Numeric Tailwind account ID returned by GET /v1/accounts
Numeric Pinterest board ID returned by GET /v1/accounts/{accountId}/boards. Tailwind’s own b_-prefixed CSV export format is accepted and normalized; board names and board URLs are rejected with a 400.
Query Parameters
Section titled “Query Parameters”The keyword or topic to find Pins for
How many recommendations to return. Bounds the response only — every candidate is scored regardless, so the top result is the best of the whole candidate set.
Responses
Section titled “Responses”Recommended Pins, strongest first. Empty when nothing cleared the threshold.
object
object
A public Pinterest Pin worth adding to the board. Not one of the account’s own Pins — creating it still requires a post.
object
Pinterest Pin ID
Destination URL, when set
How well this Pin matches the keyword. Never “poor” — weaker Pins are dropped rather than recommended.
object
Unique request ID for debugging
Example
{ "data": { "pins": [ { "relevance": "excellent" } ] }}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" }}The account’s Pinterest connection is no longer usable. Your API key is fine — this is not an authentication failure on Tailwind’s side, which is why it is not a 401. The account holder needs to reconnect Pinterest in Tailwind before this operation can succeed.
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": "Reconnect your Pinterest account to manage Boards.", "reason": "pinterest_reconnect_required" }, "meta": { "requestId": "abc123" }}Too many distinct keyword searches from this org in a short window. This is Tailwind’s own limit protecting the upstream search, not Pinterest refusing — repeating the same keyword is served from cache and does not count against it.
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": "TOO_MANY_REQUESTS", "message": "Too many Pin searches in a short window. Wait a minute before requesting recommendations for another keyword.", "reason": "recommended_pins_rate_limited" }, "meta": { "requestId": "abc123" }}Pinterest’s public Pin search could not be reached. Distinct from a Pinterest v5 fault on the board read: nothing about the board or the account is wrong, and the request can be retried.
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_GATEWAY", "message": "Could not search Pinterest for Pins right now. Nothing was changed, so this can be retried.", "reason": "recommended_pins_search_failed" }, "meta": { "requestId": "abc123" }}Pinterest rate-limited the upstream read. Distinct from a 429, which means the caller’s own API-key limit — retry this request rather than backing off across the API.
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": "SERVICE_UNAVAILABLE", "message": "Could not read this board from Pinterest.", "reason": "pinterest_rate_limited" }, "meta": { "requestId": "abc123" }}The request ran out of budget. Nothing was changed. reason: "recommended_pins_board_too_large" means the board itself has more Pins than can be read completely within one request — the board must be read in full, because a partial read would recommend Pins the board already holds. reason: "recommended_pins_timeout" means the request as a whole (board read, search, and scoring together) ran past budget without any single step being identifiably at fault.
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": "This board holds too many Pins to read within one request. Nothing was changed.", "reason": "recommended_pins_board_too_large" }, "meta": { "requestId": "abc123" }}