{"openapi":"3.1.0","info":{"title":"Works Converter","summary":"Public HTTP API for Works Converter (worksconverter.com)","description":"Machine-readable description of the existing public Works Converter website APIs: live pricing, MSI download redirect, public roadmap, feedback, and Stripe checkout helpers used by the desktop app and website.\n\nThis document lists only real public endpoints. Conversion itself runs in the Windows desktop app and is not exposed as an HTTP conversion API.\n\nVersioning: stable public operations use major-version URL paths under /api/v1/*. Unversioned /api/* paths are permanent v1 aliases of the same handlers. Breaking changes require a new major path (/api/v2/...). Deprecations are announced in this OpenAPI description and via RFC 9745 Deprecation/Sunset response headers when a path is scheduled for removal. Rate limits: 120 requests per client IP per 60 seconds on documented public endpoints. Responses include IETF RateLimit-Policy, RateLimit, RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset; HTTP 429 also includes Retry-After. Errors use the shared Error schema ({ code, message, resolution }).","version":"1.0.0","contact":{"name":"Works Converter support","email":"support@worksconverter.com","url":"https://worksconverter.com/contact"},"license":{"name":"Works Converter Terms","url":"https://worksconverter.com/terms"}},"externalDocs":{"description":"Works Converter developer resources (llms.txt)","url":"https://worksconverter.com/llms.txt"},"servers":[{"url":"https://worksconverter.com","description":"Works Converter production"}],"tags":[{"name":"Pricing","description":"Live public pricing payload."},{"name":"Download","description":"Windows MSI download redirect."},{"name":"Roadmap","description":"Public roadmap features and votes."},{"name":"Feedback","description":"Website feedback submissions."},{"name":"Checkout","description":"Stripe Checkout session helpers for Works Converter licenses."}],"paths":{"/api/v1/pricing":{"get":{"tags":["Pricing"],"operationId":"getWorksConverterPricingV1","summary":"Get live Works Converter pricing","description":"Returns the current public pricing payload (trial limit, Standard, Plus, commercial) used by the website and desktop purchase UI.","security":[],"responses":{"200":{"description":"Live pricing payload","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingPayload"}}}},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}},"Retry-After":{"description":"Seconds to wait before retrying after HTTP 429.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/download":{"get":{"tags":["Download"],"operationId":"downloadWorksConverterMsiV1","summary":"Redirect to the current Works Converter MSI","description":"Logs a download event and redirects (302) to the current signed MSI on object storage. Non-Windows clients without force=1 are redirected to /download/windows-only.","security":[],"parameters":[{"in":"query","name":"source","required":false,"description":"Attribution label for analytics (for example homepage, llms, markdown).","schema":{"type":"string"}},{"in":"query","name":"force","required":false,"description":"Set to 1 to skip the non-Windows warning redirect.","schema":{"type":"string","enum":["1"]}}],"responses":{"302":{"description":"Redirect to the MSI URL or the Windows-only warning page","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}}},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}},"Retry-After":{"description":"Seconds to wait before retrying after HTTP 429.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/roadmap":{"get":{"tags":["Roadmap"],"operationId":"listWorksConverterRoadmapV1","summary":"List visible roadmap features","description":"Returns visible public roadmap features and whether the caller has voted.","security":[],"responses":{"200":{"description":"Roadmap feature list","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoadmapListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}},"Retry-After":{"description":"Seconds to wait before retrying after HTTP 429.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Roadmap"],"operationId":"voteWorksConverterRoadmapFeatureV1","summary":"Toggle a roadmap feature vote","description":"Toggles the caller vote for a visible roadmap feature id.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoadmapVoteRequest"}}}},"responses":{"200":{"description":"Updated vote state","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoadmapVoteResponse"}}}},"400":{"description":"Invalid feature id","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Feature not found","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}},"Retry-After":{"description":"Seconds to wait before retrying after HTTP 429.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Vote failed","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/feedback":{"post":{"tags":["Feedback"],"operationId":"submitWorksConverterFeedbackV1","summary":"Submit website feedback","description":"Accepts feature requests, bug reports, general feedback, or reviews from the website.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}}},"responses":{"201":{"description":"Feedback accepted","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackAccepted"}}}},"400":{"description":"Missing description","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}},"Retry-After":{"description":"Seconds to wait before retrying after HTTP 429.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/checkout/create":{"post":{"tags":["Checkout"],"operationId":"createWorksConverterCheckoutSessionV1","summary":"Create a Stripe Checkout session","description":"Creates a Stripe Checkout session for a Works Converter license product. Used by the desktop app and website purchase flows.","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutCreateRequest"}}}},"responses":{"200":{"description":"Checkout session created","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutCreateResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}},"Retry-After":{"description":"Seconds to wait before retrying after HTTP 429.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Checkout creation failed","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/checkout/status":{"get":{"tags":["Checkout"],"operationId":"getWorksConverterCheckoutStatusV1","summary":"Read Stripe Checkout fulfillment status","description":"Returns pending/processing/paid status for a Checkout session id, including license keys when fulfillment is complete.","security":[],"parameters":[{"in":"query","name":"session_id","required":true,"description":"Stripe Checkout session id","schema":{"type":"string"}}],"responses":{"200":{"description":"Checkout status","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutStatusResponse"}}}},"400":{"description":"Missing session_id","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}},"Retry-After":{"description":"Seconds to wait before retrying after HTTP 429.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Status read failed","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/pricing":{"get":{"tags":["Pricing"],"operationId":"getWorksConverterPricing","summary":"Get live Works Converter pricing (v1 alias)","description":"Alias of GET /api/v1/pricing.","security":[],"responses":{"200":{"description":"Live pricing payload","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingPayload"}}}},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}},"Retry-After":{"description":"Seconds to wait before retrying after HTTP 429.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/download":{"get":{"tags":["Download"],"operationId":"downloadWorksConverterMsi","summary":"Redirect to the current Works Converter MSI (v1 alias)","description":"Alias of GET /api/v1/download.","security":[],"parameters":[{"in":"query","name":"source","required":false,"schema":{"type":"string"}},{"in":"query","name":"force","required":false,"schema":{"type":"string","enum":["1"]}}],"responses":{"302":{"description":"Redirect to the MSI URL or the Windows-only warning page","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}}},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}},"Retry-After":{"description":"Seconds to wait before retrying after HTTP 429.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/roadmap":{"get":{"tags":["Roadmap"],"operationId":"listWorksConverterRoadmap","summary":"List visible roadmap features (v1 alias)","description":"Alias of GET /api/v1/roadmap.","security":[],"responses":{"200":{"description":"Roadmap feature list","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoadmapListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}},"Retry-After":{"description":"Seconds to wait before retrying after HTTP 429.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Roadmap"],"operationId":"voteWorksConverterRoadmapFeature","summary":"Toggle a roadmap feature vote (v1 alias)","description":"Alias of POST /api/v1/roadmap.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoadmapVoteRequest"}}}},"responses":{"200":{"description":"Updated vote state","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoadmapVoteResponse"}}}},"400":{"description":"Invalid feature id","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Feature not found","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}},"Retry-After":{"description":"Seconds to wait before retrying after HTTP 429.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Vote failed","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/feedback":{"post":{"tags":["Feedback"],"operationId":"submitWorksConverterFeedback","summary":"Submit website feedback (v1 alias)","description":"Alias of POST /api/v1/feedback.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}}},"responses":{"201":{"description":"Feedback accepted","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackAccepted"}}}},"400":{"description":"Missing description","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}},"Retry-After":{"description":"Seconds to wait before retrying after HTTP 429.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Server error","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/checkout/create":{"post":{"tags":["Checkout"],"operationId":"createWorksConverterCheckoutSession","summary":"Create a Stripe Checkout session (v1 alias)","description":"Alias of POST /api/v1/checkout/create.","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutCreateRequest"}}}},"responses":{"200":{"description":"Checkout session created","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutCreateResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}},"Retry-After":{"description":"Seconds to wait before retrying after HTTP 429.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Checkout creation failed","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/checkout/status":{"get":{"tags":["Checkout"],"operationId":"getWorksConverterCheckoutStatus","summary":"Read Stripe Checkout fulfillment status (v1 alias)","description":"Alias of GET /api/v1/checkout/status.","security":[],"parameters":[{"in":"query","name":"session_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Checkout status","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutStatusResponse"}}}},"400":{"description":"Missing session_id","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}},"Retry-After":{"description":"Seconds to wait before retrying after HTTP 429.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Status read failed","headers":{"RateLimit-Policy":{"description":"Quota policy (works-public) in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";q=120;w=60"}},"RateLimit":{"description":"Current remaining quota and reset time in IETF RateLimit structured-field format.","schema":{"type":"string","example":"\"works-public\";r=119;t=54"}},"RateLimit-Limit":{"description":"Compatibility form of the request quota.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Compatibility form of the remaining request quota.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current quota window resets.","schema":{"type":"integer","example":54}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","additionalProperties":false,"required":["code","message","resolution"],"properties":{"code":{"type":"string","description":"Stable machine-readable error code"},"message":{"type":"string","description":"Human-readable error summary"},"resolution":{"type":"string","description":"What an agent or client should do next"}},"example":{"code":"api_route_not_found","message":"The requested Works Converter API route does not exist.","resolution":"Discover public endpoints in /openapi.json. For product docs use /llms.txt."}},"PricingPayload":{"type":"object","additionalProperties":true,"required":["product","currency","licensePrice","trialFileLimit"],"properties":{"product":{"type":"string","const":"works"},"productDisplayName":{"type":"string"},"currency":{"type":"string","const":"USD"},"licensePrice":{"type":"string"},"licensePriceDisplay":{"type":"string"},"stripePaymentLink":{"type":"string","format":"uri"},"commercialLicensePrice":{"type":"string"},"commercialLicensePriceDisplay":{"type":"string"},"stripeCommercialPaymentLink":{"type":"string","format":"uri"},"trialFileLimit":{"type":"integer"},"plusAddonPrice":{"type":"string"},"plusAddonPriceDisplay":{"type":"string"},"stripePlusAddonPaymentLink":{"type":"string","format":"uri"},"plusBundlePrice":{"type":"string"},"plusBundlePriceDisplay":{"type":"string"},"stripePlusBundlePaymentLink":{"type":"string","format":"uri"},"plusCommercialPrice":{"type":"string"},"plusCommercialPriceDisplay":{"type":"string"},"stripePlusCommercialPaymentLink":{"type":"string","format":"uri"},"plusAddonCommercialPrice":{"type":"string"},"plusAddonCommercialPriceDisplay":{"type":"string"},"stripePlusAddonCommercialPaymentLink":{"type":"string","format":"uri"}}},"RoadmapListResponse":{"type":"object","additionalProperties":false,"required":["features"],"properties":{"features":{"type":"array","items":{"$ref":"#/components/schemas/RoadmapFeature"}}}},"RoadmapFeature":{"type":"object","additionalProperties":true,"required":["id","title","description","category","vote_count","voted"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string"},"category":{"type":"string"},"vote_count":{"type":"integer"},"voted":{"type":"boolean"},"release_version":{"type":["string","null"]}}},"RoadmapVoteRequest":{"type":"object","additionalProperties":false,"required":["featureId"],"properties":{"featureId":{"type":"string","format":"uuid","description":"Roadmap feature UUID"}}},"RoadmapVoteResponse":{"type":"object","additionalProperties":false,"required":["voted","vote_count"],"properties":{"voted":{"type":"boolean"},"vote_count":{"type":"integer"}}},"FeedbackRequest":{"type":"object","additionalProperties":false,"required":["description"],"properties":{"type":{"type":"string","enum":["feature_request","bug_report","general","review"]},"email":{"type":"string","format":"email"},"description":{"type":"string","minLength":1},"appVersion":{"type":"string"},"rating":{"type":"integer","minimum":1,"maximum":5}}},"FeedbackAccepted":{"type":"object","additionalProperties":false,"required":["success"],"properties":{"success":{"type":"boolean","const":true}}},"CheckoutCreateRequest":{"type":"object","additionalProperties":false,"properties":{"channel":{"type":"string","enum":["store","msi"]},"product":{"type":"string","description":"Works license product key recognized by the checkout normalizer"}}},"CheckoutCreateResponse":{"type":"object","additionalProperties":false,"required":["sessionId","url"],"properties":{"sessionId":{"type":"string"},"url":{"type":"string","format":"uri"}}},"CheckoutStatusResponse":{"type":"object","additionalProperties":true,"required":["status"],"properties":{"status":{"type":"string","enum":["pending","processing","paid"]},"licenseKey":{"type":["string","null"]},"standardLicenseKey":{"type":["string","null"]},"plusLicenseKey":{"type":["string","null"]}}}}}}