{"openapi":"3.1.0","info":{"title":"eesel AI Website API","version":"2026-08-24","description":"Public endpoints used by eesel AI website tools and interactive skill previews. See /developers for authentication, versioning, deprecation, rate-limit, and error conventions."},"servers":[{"url":"https://www.eesel.ai"}],"externalDocs":{"description":"eesel AI API Docs","url":"https://www.eesel.ai/api-docs"},"x-api-versioning":{"strategy":"date-based request header","header":"API-Version","current":"2026-08-24","default":"2026-08-24","deprecation":"Deprecated versions return a Deprecation header. Versions scheduled for removal also return a Sunset header at least 90 days before removal."},"paths":{"/api/tools/invoke":{"post":{"operationId":"invokeTextTool","summary":"Run a supported text tool","description":"Runs a public text utility with the supplied tool identifier and parameters.","tags":["Tools"],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInvocation"}}}},"responses":{"200":{"description":"Generated text","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["result"],"properties":{"result":{"type":"string"}}}}}},"400":{"description":"The request could not be completed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"The hourly public API request limit has been reached.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/tools/analyze-image":{"post":{"operationId":"analyzeImage","summary":"Run a supported image analysis tool","description":"Analyzes an image URL or data URL with the public image-to-prompt utility.","tags":["Tools"],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tool","params"],"properties":{"tool":{"type":"string","enum":["image-to-prompt"]},"params":{"type":"object","required":["image"],"properties":{"image":{"type":"string","description":"An http(s) image URL or base64 data URL."}},"additionalProperties":true}}}}}},"responses":{"200":{"description":"Image analysis result","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["result"],"properties":{"result":{"type":"string"}}}}}},"400":{"description":"The request could not be completed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"The hourly public API request limit has been reached.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/tools/pdf":{"post":{"operationId":"processPdf","summary":"Extract, inspect, split, or merge PDF files","description":"Processes uploaded PDF files and returns JSON metadata or a PDF download, depending on the action.","tags":["Tools"],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["pdf-to-text","get-info","split","merge"]},"file":{"type":"string","format":"binary"},"files":{"type":"array","items":{"type":"string","format":"binary"}},"ranges":{"type":"string","example":"1-3,5,7-9"}}}}}},"responses":{"200":{"description":"JSON metadata/text or an application/pdf download","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","description":"The shape depends on the requested PDF action.","additionalProperties":true}},"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"The request could not be completed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"The hourly public API request limit has been reached.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/skills/ai-blog-writer-light":{"post":{"operationId":"previewBlogPost","summary":"Generate a limited blog post preview","description":"Creates a public, usage-limited blog post preview from a topic.","tags":["Skill previews"],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["topic"],"properties":{"topic":{"type":"string","minLength":3,"maxLength":120}}}}}},"responses":{"200":{"description":"Generated, gated, capped, or degraded preview state","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillPreview"}}}},"400":{"description":"The request could not be completed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"The hourly public API request limit has been reached.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/skills/ai-humanizer":{"post":{"operationId":"previewHumanizedText","summary":"Generate a limited humanized-text preview","description":"Creates a public, usage-limited humanized-text preview from supplied text.","tags":["Skill previews"],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","minLength":1}}}}}},"responses":{"200":{"description":"Generated, gated, capped, degraded, or too-long state","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillPreview"}}}},"400":{"description":"The request could not be completed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"The hourly public API request limit has been reached.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/waitlist":{"post":{"operationId":"joinWaitlist","summary":"Add an email address to the waitlist","description":"Adds a valid email address to the public eesel AI waitlist.","tags":["Waitlist"],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"sheetName":{"type":"string"}}}}}},"responses":{"200":{"description":"Email added","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["success","message"],"properties":{"success":{"type":"boolean","const":true},"message":{"type":"string"},"updatedRange":{"type":"string"}}}}}},"400":{"description":"The request could not be completed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The request could not be completed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The request could not be completed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"The hourly public API request limit has been reached.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The request could not be completed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"parameters":{"ApiVersion":{"name":"API-Version","in":"header","required":false,"description":"Date-based API version. If omitted, the current version is used.","schema":{"type":"string","enum":["2026-08-24"],"default":"2026-08-24"}}},"headers":{"ApiVersion":{"description":"The API version used for the response.","schema":{"type":"string","example":"2026-08-24"}},"RateLimitLimit":{"description":"Maximum requests allowed in the current window.","schema":{"type":"integer","example":120}},"RateLimit":{"description":"RFC 9651 rate-limit status with the remaining quota and reset interval.","schema":{"type":"string","example":"\"public\";r=119;t=3599"}},"RateLimitRemaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","minimum":0}},"RateLimitReset":{"description":"Seconds until the current rate-limit window resets.","schema":{"type":"integer","minimum":1}},"RateLimitPolicy":{"description":"Request quota and window in seconds.","schema":{"type":"string","example":"\"public\";q=120;w=3600"}}},"schemas":{"ToolInvocation":{"type":"object","required":["tool","params"],"properties":{"tool":{"type":"string","description":"A tool identifier listed on /tools."},"params":{"type":"object","additionalProperties":true}}},"Error":{"type":"object","required":["error","code","message","hint"],"properties":{"error":{"type":"string","description":"Backward-compatible alias of message.","example":"The request body is invalid."},"code":{"type":"string","example":"INVALID_REQUEST"},"message":{"type":"string","example":"The request body is invalid."},"hint":{"type":"string","example":"Check /openapi.json and retry the request."}}},"SkillPreview":{"type":"object","description":"A generated preview or a structured gated, capped, or degraded state.","additionalProperties":true}}}}