Get generation status
const url = 'https://api-v1.tailwind.ai/v1/generations/example';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/generations/example \ --header 'Authorization: Bearer <token>'Poll the status of a Pin generation. Generation typically completes in 1-3 minutes; poll every ~15 seconds and give up after ~30 minutes (retryable failures can hold processing for several minutes, and a hung request can stay processing for ~25 minutes before the terminal generation-request-timed-out status lands). A 404 within ~10 seconds of creating the generation is a transient index-lag artifact — retry, don’t stop. Once status is success, list the account’s draft posts and filter by generationId to find the generated drafts.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Generation ID returned by POST /v1/accounts/{accountId}/generations
Responses
Section titled “Responses”Generation status
object
object
object
Generation ID
Source URL the generation ran against
Present once status is success or failed.
Stable failure code, present only when status is “failed”. Known values include scrape-failed, no-images-on-page, not-enough-credits, smartpin-content-flagged, smartpin-lapsed-user, smartpin-no-account, smartpin-account-not-connected, failed-to-upload-source-images, generation-request-timed-out, generation-cancelled; “unknown” when no code was recorded.
Why a scrape-failed generation failed; present only when failureCode is scrape-failed and the cause is known. blocked: the site’s firewall refuses Tailwind’s scraper; retrying won’t help until the site allows it. no-content: the page had no readable text, often because it was just published; retry once after a minute or two, and stop if it fails again. fetch-failed: the page couldn’t be loaded; retry later.
object
Unique request ID for debugging
Example
{ "data": { "generation": { "status": "processing", "failureDetail": "blocked" } }}Authentication required or invalid bearer credentials
object
object
Error code
Error message
Machine-readable reason. On PAYMENT_REQUIRED errors it is the denial reason: insufficient_credits, trial_exhausted, no_access, account_not_connected, legacy_post_limit_exceeded. Other errors may carry an operation-specific reason, such as pinterest_reconnect_required, pinterest_rate_limited, pinterest_timeout, pinterest_request_failed or list_boards_upstream_failed; each operation’s documented error responses show the values it returns. Branch on reason rather than parsing message.
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 reason. On PAYMENT_REQUIRED errors it is the denial reason: insufficient_credits, trial_exhausted, no_access, account_not_connected, legacy_post_limit_exceeded. Other errors may carry an operation-specific reason, such as pinterest_reconnect_required, pinterest_rate_limited, pinterest_timeout, pinterest_request_failed or list_boards_upstream_failed; each operation’s documented error responses show the values it returns. Branch on reason rather than parsing message.
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" }}Rate limit exceeded
object
object
Error code
Error message
Machine-readable reason. On PAYMENT_REQUIRED errors it is the denial reason: insufficient_credits, trial_exhausted, no_access, account_not_connected, legacy_post_limit_exceeded. Other errors may carry an operation-specific reason, such as pinterest_reconnect_required, pinterest_rate_limited, pinterest_timeout, pinterest_request_failed or list_boards_upstream_failed; each operation’s documented error responses show the values it returns. Branch on reason rather than parsing message.
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 10000 requests for this organization exceeded. Resets at midnight UTC." }, "meta": { "requestId": "abc123" }}Headers
Section titled “Headers”Seconds until the daily limit resets at midnight UTC.
