{"openapi":"3.1.0","info":{"title":"Lotus Converter","description":"Public HTTP APIs for the Lotus Converter website (lotusconverter.com). The desktop product converts Lotus 1-2-3 spreadsheets locally on Windows; supported inputs are .123, .wk1, .wk3, .wk4, .wks. Supported outputs are XLSX, PDF, HTML, Markdown, CSV, XLS. These endpoints cover pricing, downloads, feedback, roadmap votes, and Stripe checkout helpers used by the site and desktop app. Versioning: stable operations use major-version URL paths under /api/v1. Breaking changes require a new major path (/api/v2). Unversioned /api/* paths are compatibility aliases for existing website and desktop clients. Deprecations will be announced with RFC 9745 Deprecation and Sunset response headers before removal. Public APIs allow 120 requests per client IP per 60 seconds. Responses include IETF RateLimit / RateLimit-Policy headers (plus RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset). HTTP 429 responses also include Retry-After. Errors use a consistent JSON object with code, message, and resolution fields.","version":"1.0.0","contact":{"name":"Lotus Converter Support","email":"support@lotusconverter.com","url":"https://lotusconverter.com/contact"}},"servers":[{"url":"https://lotusconverter.com","description":"Production — prefer /api/v1 paths documented below"}],"tags":[{"name":"Pricing","description":"Live product offer payload"},{"name":"Download","description":"Windows installer redirects"},{"name":"Feedback","description":"Public feedback and reviews"},{"name":"Roadmap","description":"Public roadmap features and votes"},{"name":"Checkout","description":"Stripe Checkout session helpers for desktop purchases"},{"name":"Discovery","description":"Machine-readable site discovery documents"}],"paths":{"/api/v1/pricing":{"get":{"operationId":"getPricing","tags":["Pricing"],"summary":"Get live Lotus Converter pricing","description":"Returns the live product offer payload (prices, payment links, trial limit) used by the website and desktop app. Compatibility alias: GET /api/pricing.","responses":{"200":{"description":"Pricing payload","headers":{"RateLimit":{"description":"IETF RateLimit structured field (remaining + time window).","schema":{"type":"string","example":"\"public-api\";r=119;t=58"}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy structured field (quota + window).","schema":{"type":"string","example":"\"public-api\";q=120;w=60"}},"RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","example":58}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingPayload"}}}},"429":{"$ref":"#/components/responses/ApiError"},"500":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/download":{"get":{"operationId":"getDownload","tags":["Download"],"summary":"Start Windows MSI download","description":"Redirects to the current Lotus Converter MSI (or to a Windows-only warning page for non-Windows clients unless force=1). Compatibility alias: GET /api/download.","parameters":[{"name":"source","in":"query","required":false,"schema":{"type":"string"},"description":"Analytics source label (for example homepage, llms, blog)."},{"name":"force","in":"query","required":false,"schema":{"type":"string","enum":["1"]},"description":"Skip the non-Windows warning redirect when set to 1."}],"responses":{"302":{"description":"Redirect to MSI URL or Windows-only warning page","headers":{"RateLimit":{"description":"IETF RateLimit structured field (remaining + time window).","schema":{"type":"string","example":"\"public-api\";r=119;t=58"}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy structured field (quota + window).","schema":{"type":"string","example":"\"public-api\";q=120;w=60"}},"RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","example":58}},"Location":{"description":"Redirect target","schema":{"type":"string","format":"uri"}}}},"400":{"$ref":"#/components/responses/ApiError"},"429":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/feedback":{"post":{"operationId":"postFeedback","tags":["Feedback"],"summary":"Submit product feedback","description":"Accepts feature requests, bug reports, general feedback, and reviews from the website. Compatibility alias: POST /api/feedback.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}}},"responses":{"201":{"description":"Feedback accepted","headers":{"RateLimit":{"description":"IETF RateLimit structured field (remaining + time window).","schema":{"type":"string","example":"\"public-api\";r=119;t=58"}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy structured field (quota + window).","schema":{"type":"string","example":"\"public-api\";q=120;w=60"}},"RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","example":58}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackSuccess"}}}},"400":{"$ref":"#/components/responses/ApiError"},"429":{"$ref":"#/components/responses/ApiError"},"500":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/roadmap":{"get":{"operationId":"getRoadmap","tags":["Roadmap"],"summary":"List visible roadmap features","description":"Returns visible roadmap features and whether the caller IP has already voted. Compatibility alias: GET /api/roadmap.","responses":{"200":{"description":"Roadmap feature list","headers":{"RateLimit":{"description":"IETF RateLimit structured field (remaining + time window).","schema":{"type":"string","example":"\"public-api\";r=119;t=58"}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy structured field (quota + window).","schema":{"type":"string","example":"\"public-api\";q=120;w=60"}},"RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","example":58}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoadmapResponse"}}}},"429":{"$ref":"#/components/responses/ApiError"},"500":{"$ref":"#/components/responses/ApiError"}}},"post":{"operationId":"voteRoadmap","tags":["Roadmap"],"summary":"Toggle a roadmap vote","description":"Toggles a vote for a visible roadmap feature for the caller IP. Compatibility alias: POST /api/roadmap.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoadmapVoteRequest"}}}},"responses":{"200":{"description":"Updated vote state","headers":{"RateLimit":{"description":"IETF RateLimit structured field (remaining + time window).","schema":{"type":"string","example":"\"public-api\";r=119;t=58"}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy structured field (quota + window).","schema":{"type":"string","example":"\"public-api\";q=120;w=60"}},"RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","example":58}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoadmapVoteResponse"}}}},"400":{"$ref":"#/components/responses/ApiError"},"404":{"$ref":"#/components/responses/ApiError"},"429":{"$ref":"#/components/responses/ApiError"},"500":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/checkout/create":{"post":{"operationId":"createCheckoutSession","tags":["Checkout"],"summary":"Create a Stripe Checkout session","description":"Creates a Stripe Checkout session for Lotus Converter Standard, Plus add-on, or Plus bundle. Used by the desktop app purchase flow. Compatibility alias: POST /api/checkout/create.","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutCreateRequest"}}}},"responses":{"200":{"description":"Checkout session created","headers":{"RateLimit":{"description":"IETF RateLimit structured field (remaining + time window).","schema":{"type":"string","example":"\"public-api\";r=119;t=58"}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy structured field (quota + window).","schema":{"type":"string","example":"\"public-api\";q=120;w=60"}},"RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","example":58}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutCreateResponse"}}}},"429":{"$ref":"#/components/responses/ApiError"},"500":{"$ref":"#/components/responses/ApiError"}}}},"/api/v1/checkout/status":{"get":{"operationId":"getCheckoutStatus","tags":["Checkout"],"summary":"Read checkout / license status","description":"Returns payment status and issued license keys for a Stripe Checkout session after payment. Compatibility alias: GET /api/checkout/status.","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Checkout status","headers":{"RateLimit":{"description":"IETF RateLimit structured field (remaining + time window).","schema":{"type":"string","example":"\"public-api\";r=119;t=58"}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy structured field (quota + window).","schema":{"type":"string","example":"\"public-api\";q=120;w=60"}},"RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","example":58}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutStatusResponse"}}}},"400":{"$ref":"#/components/responses/ApiError"},"429":{"$ref":"#/components/responses/ApiError"},"500":{"$ref":"#/components/responses/ApiError"}}}},"/llms.txt":{"get":{"operationId":"getLlmsTxt","tags":["Discovery"],"summary":"LLM-oriented site summary","description":"Plain-text summary of Lotus Converter for AI agents, including developer resources.","responses":{"200":{"description":"llms.txt body","headers":{"RateLimit":{"description":"IETF RateLimit structured field (remaining + time window).","schema":{"type":"string","example":"\"public-api\";r=119;t=58"}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy structured field (quota + window).","schema":{"type":"string","example":"\"public-api\";q=120;w=60"}},"RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","example":58}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/LlmsTxtDocument"}}}},"429":{"$ref":"#/components/responses/ApiError"}}}},"/openapi.json":{"get":{"operationId":"getOpenApi","tags":["Discovery"],"summary":"OpenAPI document","description":"This OpenAPI 3.1 specification for Lotus Converter public website APIs.","responses":{"200":{"description":"OpenAPI 3.1 document","headers":{"RateLimit":{"description":"IETF RateLimit structured field (remaining + time window).","schema":{"type":"string","example":"\"public-api\";r=119;t=58"}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy structured field (quota + window).","schema":{"type":"string","example":"\"public-api\";q=120;w=60"}},"RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","example":58}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenApiDocument"}}}},"429":{"$ref":"#/components/responses/ApiError"}}}}},"components":{"schemas":{"ApiError":{"type":"object","required":["code","message","resolution"],"additionalProperties":false,"properties":{"code":{"type":"string","description":"Stable machine-readable error code","examples":["not_found","rate_limited","description_required"]},"message":{"type":"string","description":"Human-readable error summary"},"resolution":{"type":"string","description":"Suggested next step for the client or agent"}}},"PricingPayload":{"type":"object","required":["product","productDisplayName","currency","licensePrice","licensePriceDisplay","stripePaymentLink","trialFileLimit"],"properties":{"product":{"type":"string","const":"lotus"},"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"}}},"FeedbackRequest":{"type":"object","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}}},"FeedbackSuccess":{"type":"object","required":["success"],"additionalProperties":false,"properties":{"success":{"type":"boolean","const":true}}},"RoadmapFeature":{"type":"object","required":["id","title","description","category","vote_count","voted"],"properties":{"id":{"type":"integer"},"title":{"type":"string"},"description":{"type":"string"},"category":{"type":"string"},"vote_count":{"type":"integer"},"voted":{"type":"boolean"},"release_version":{"type":["string","null"]}}},"RoadmapResponse":{"type":"object","required":["features"],"additionalProperties":false,"properties":{"features":{"type":"array","items":{"$ref":"#/components/schemas/RoadmapFeature"}}}},"RoadmapVoteRequest":{"type":"object","required":["featureId"],"additionalProperties":false,"properties":{"featureId":{"type":"integer","minimum":1}}},"RoadmapVoteResponse":{"type":"object","required":["voted","vote_count"],"additionalProperties":false,"properties":{"voted":{"type":"boolean"},"vote_count":{"type":"integer"}}},"CheckoutCreateRequest":{"type":"object","additionalProperties":false,"properties":{"product":{"type":"string","enum":["standard","plus_addon","plus_bundle"],"description":"Desktop checkout product SKU."},"channel":{"type":"string","enum":["store","msi"],"description":"Install channel metadata for fulfillment analytics."}}},"CheckoutCreateResponse":{"type":"object","required":["sessionId","url"],"additionalProperties":false,"properties":{"sessionId":{"type":"string"},"url":{"type":"string","format":"uri"}}},"CheckoutStatusResponse":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["pending","processing","paid"]},"licenseKey":{"type":["string","null"]},"standardLicenseKey":{"type":["string","null"]},"plusLicenseKey":{"type":["string","null"]}}},"LlmsTxtDocument":{"type":"string","description":"Plain-text llms.txt body for Lotus Converter."},"OpenApiDocument":{"type":"object","description":"OpenAPI 3.1 document object for Lotus Converter public APIs.","additionalProperties":true}},"responses":{"ApiError":{"description":"Structured JSON error with machine-readable code and resolution hint","headers":{"RateLimit":{"description":"IETF RateLimit structured field (remaining + time window).","schema":{"type":"string","example":"\"public-api\";r=119;t=58"}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy structured field (quota + window).","schema":{"type":"string","example":"\"public-api\";q=120;w=60"}},"RateLimit-Limit":{"description":"Maximum requests permitted in the current window.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","example":119}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","example":58}},"Retry-After":{"description":"Seconds to wait before retrying (present on HTTP 429).","schema":{"type":"integer","example":30}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"examples":{"notFound":{"value":{"code":"not_found","message":"No API endpoint exists at /api/v1/unknown.","resolution":"Consult https://lotusconverter.com/openapi.json for published public endpoints."}},"rateLimited":{"value":{"code":"rate_limited","message":"Public API rate limit exceeded.","resolution":"Wait for RateLimit-Reset seconds (see Retry-After) and retry."}}}}}}}}}