Request a capability
const url = 'https://api-v1.tailwind.ai/v1/capability-requests';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"description":"No way to change a scheduled Pin\'s board after creating it — I had to delete the Pin and recreate it, which lost its scheduled time."}'};
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/capability-requests \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "description": "No way to change a scheduled Pin'\''s board after creating it — I had to delete the Pin and recreate it, which lost its scheduled time." }'Tell Tailwind about something this API cannot do yet — an endpoint you expected and could not find, a missing field or filter, or a step you had to work around. Requests go to the product team, who use them to decide what to build next. Your description is recorded in Tailwind’s internal analytics and posted to an internal Tailwind channel for staff to read, so send only what you would be comfortable sharing with Tailwind — do not include credentials or personal data. No request resource is created: there is nothing to read back, no ticket to follow up on, and no timeline, so this returns only an acknowledgement. Report gaps as you hit them rather than working around them silently. Not for reporting errors: a rejected argument, an expired token, or an out-of-credits response are not missing capabilities. Free — this consumes no credits.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
What you were trying to do and what was missing, in plain sentences. Describe the outcome you wanted, not just an endpoint name — the concrete case is what makes a request actionable.
Example
No way to change a scheduled Pin's board after creating it — I had to delete the Pin and recreate it, which lost its scheduled time.Responses
Section titled “Responses”Capability request received
object
object
Always true — failures return an error status instead.
object
Unique request ID for debugging
Examplegenerated
{ "data": { "received": true }, "meta": { "requestId": "example" }}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" }}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" }}