{"openapi":"3.1.0","info":{"title":"FindUtils Tool API","version":"1.0.0","description":"Public REST API for FindUtils — 20 flagship utilities available as programmable tools. Foundation for MCP server and ChatGPT integration.","contact":{"name":"FindUtils","url":"https://findutils.com"},"license":{"name":"MIT"}},"servers":[{"url":"https://api.findutils.com","description":"Production"}],"tags":[{"name":"Encoding"},{"name":"Developer"},{"name":"Crypto"},{"name":"Data"},{"name":"Conversion"},{"name":"Datetime"},{"name":"Text"},{"name":"System"}],"paths":{"/api/tools":{"get":{"operationId":"listTools","summary":"List all available tools","tags":["Tools"],"responses":{"200":{"description":"Array of tool definitions with schemas","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"tools":{"type":"array","items":{"$ref":"#/components/schemas/ToolInfo"}},"count":{"type":"integer","example":20}}}}}}}}},"/api/health":{"get":{"operationId":"healthCheck","summary":"Health check","tags":["System"],"responses":{"200":{"description":"Service is healthy","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"tools":{"type":"integer","example":20},"version":{"type":"string","example":"1.0.0"}}}}}}}}},"/api/tools/base64":{"get":{"operationId":"getTool_base64","summary":"Get info for Base64 Encoder / Decoder","tags":["Encoding"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/base64/execute":{"post":{"operationId":"execute_base64","summary":"Execute Base64 Encoder / Decoder","description":"Encode text to Base64 or decode Base64 back to text.","tags":["Encoding"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"action":{"type":"string","enum":["encode","decode"],"description":"Whether to encode or decode."},"text":{"type":"string","description":"The text to encode or the Base64 string to decode.","maxLength":1000000}},"required":["action","text"],"additionalProperties":false},"example":{"action":"encode","text":"Hello, World!"}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"result":"SGVsbG8sIFdvcmxkIQ=="},"meta":{"tool":"base64","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/url-encode":{"get":{"operationId":"getTool_url_encode","summary":"Get info for URL Encoder / Decoder","tags":["Encoding"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/url-encode/execute":{"post":{"operationId":"execute_url_encode","summary":"Execute URL Encoder / Decoder","description":"Encode or decode URL components.","tags":["Encoding"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"action":{"type":"string","enum":["encode","decode"],"description":"Whether to encode or decode."},"text":{"type":"string","description":"The text or URL to encode/decode.","maxLength":100000},"mode":{"type":"string","enum":["component","full"],"description":"encode: component = encodeURIComponent (default), full = encodeURI.","default":"component"}},"required":["action","text"],"additionalProperties":false},"example":{"action":"encode","text":"hello world & more"}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"result":"hello%20world%20%26%20more"},"meta":{"tool":"url-encode","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/uuid":{"get":{"operationId":"getTool_uuid","summary":"Get info for UUID Generator","tags":["Developer"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/uuid/execute":{"post":{"operationId":"execute_uuid","summary":"Execute UUID Generator","description":"Generate one or more UUID v4 values.","tags":["Developer"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer","description":"Number of UUIDs to generate (1–100).","minimum":1,"maximum":100,"default":1},"uppercase":{"type":"boolean","description":"Return UUIDs in uppercase.","default":false}},"additionalProperties":false},"example":{}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"uuids":["550e8400-e29b-41d4-a716-446655440000"]},"meta":{"tool":"uuid","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/hash":{"get":{"operationId":"getTool_hash","summary":"Get info for Hash Generator","tags":["Crypto"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/hash/execute":{"post":{"operationId":"execute_hash","summary":"Execute Hash Generator","description":"Generate MD5, SHA-1, SHA-256, or SHA-512 hash of a string.","tags":["Crypto"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"The text to hash.","maxLength":1000000},"algorithm":{"type":"string","enum":["MD5","SHA-1","SHA-256","SHA-512"],"description":"Hash algorithm to use.","default":"SHA-256"}},"required":["text"],"additionalProperties":false},"example":{"text":"Hello, World!","algorithm":"SHA-256"}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"hash":"dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986d","algorithm":"SHA-256"},"meta":{"tool":"hash","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/hmac":{"get":{"operationId":"getTool_hmac","summary":"Get info for HMAC Generator","tags":["Crypto"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/hmac/execute":{"post":{"operationId":"execute_hmac","summary":"Execute HMAC Generator","description":"Generate an HMAC signature using SHA-1, SHA-256, or SHA-512.","tags":["Crypto"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"The message to sign.","maxLength":1000000},"key":{"type":"string","description":"The secret key.","maxLength":10000},"algorithm":{"type":"string","enum":["SHA-1","SHA-256","SHA-512"],"description":"HMAC algorithm.","default":"SHA-256"}},"required":["text","key"],"additionalProperties":false},"example":{"text":"Hello, World!","key":"secret","algorithm":"SHA-256"}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"hmac":"88aab3ede8d3adf94d26ab90d3bafd4a2083070c3bcce9c014ee04a443847c0b","algorithm":"SHA-256"},"meta":{"tool":"hmac","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/json-format":{"get":{"operationId":"getTool_json_format","summary":"Get info for JSON Formatter / Minifier","tags":["Data"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/json-format/execute":{"post":{"operationId":"execute_json_format","summary":"Execute JSON Formatter / Minifier","description":"Format (pretty-print) or minify a JSON string.","tags":["Data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"json":{"type":"string","description":"The JSON string to process.","maxLength":1000000},"action":{"type":"string","enum":["format","minify"],"description":"\"format\" pretty-prints with indentation, \"minify\" removes whitespace.","default":"format"},"indent":{"type":"integer","description":"Number of spaces for indentation (format only).","minimum":1,"maximum":8,"default":2}},"required":["json"],"additionalProperties":false},"example":{"json":"{\"name\":\"Alice\",\"age\":30}","action":"format"}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"result":"{\n  \"name\": \"Alice\",\n  \"age\": 30\n}"},"meta":{"tool":"json-format","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/json-validate":{"get":{"operationId":"getTool_json_validate","summary":"Get info for JSON Validator","tags":["Data"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/json-validate/execute":{"post":{"operationId":"execute_json_validate","summary":"Execute JSON Validator","description":"Check whether a string is valid JSON and get basic structure info.","tags":["Data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"json":{"type":"string","description":"The string to validate as JSON.","maxLength":1000000}},"required":["json"],"additionalProperties":false},"example":{"json":"{\"name\":\"Alice\",\"scores\":[1,2,3]}"}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"valid":true,"type":"object","keys":2},"meta":{"tool":"json-validate","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/percentage":{"get":{"operationId":"getTool_percentage","summary":"Get info for Percentage Calculator","tags":["Conversion"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/percentage/execute":{"post":{"operationId":"execute_percentage","summary":"Execute Percentage Calculator","description":"Calculate percentages: X% of Y, percent change, increase, or decrease.","tags":["Conversion"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mode":{"type":"string","enum":["of","change","increase","decrease","what_percent"],"description":"\"of\": what is X% of Y? | \"change\": percent change from X to Y | \"increase\": increase X by Y% | \"decrease\": decrease X by Y% | \"what_percent\": X is what percent of Y?"},"x":{"type":"number","description":"First number (see mode description)."},"y":{"type":"number","description":"Second number (see mode description)."}},"required":["mode","x","y"],"additionalProperties":false},"example":{"mode":"of","x":15,"y":200}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"result":30,"expression":"15% of 200 = 30"},"meta":{"tool":"percentage","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/unit-convert":{"get":{"operationId":"getTool_unit_convert","summary":"Get info for Unit Converter","tags":["Conversion"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/unit-convert/execute":{"post":{"operationId":"execute_unit_convert","summary":"Execute Unit Converter","description":"Convert between units of length, weight, temperature, data size, area, and speed.","tags":["Conversion"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"number","description":"The value to convert."},"from":{"type":"string","description":"Source unit (e.g. \"km\", \"lb\", \"C\", \"GB\")."},"to":{"type":"string","description":"Target unit (e.g. \"mi\", \"kg\", \"F\", \"MB\")."},"category":{"type":"string","enum":["length","weight","temperature","data","area","speed"],"description":"Unit category. If omitted, auto-detected from units."}},"required":["value","from","to"],"additionalProperties":false},"example":{"value":10,"from":"km","to":"mi","category":"length"}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"result":6.21371,"from":"km","to":"mi","category":"length"},"meta":{"tool":"unit-convert","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/color-convert":{"get":{"operationId":"getTool_color_convert","summary":"Get info for Color Converter","tags":["Conversion"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/color-convert/execute":{"post":{"operationId":"execute_color_convert","summary":"Execute Color Converter","description":"Convert colors between HEX, RGB, and HSL formats.","tags":["Conversion"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"color":{"type":"string","description":"Input color. Examples: \"#ff6b35\", \"rgb(255, 107, 53)\", \"hsl(18, 100%, 60%)\""},"from":{"type":"string","enum":["hex","rgb","hsl"],"description":"Input format."}},"required":["color","from"],"additionalProperties":false},"example":{"color":"#ff6b35","from":"hex"}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"hex":"#ff6b35","rgb":"rgb(255, 107, 53)","hsl":"hsl(18, 100%, 60%)","r":255,"g":107,"b":53,"h":18,"s":100,"l":60},"meta":{"tool":"color-convert","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/unix-timestamp":{"get":{"operationId":"getTool_unix_timestamp","summary":"Get info for Unix Timestamp Converter","tags":["Datetime"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/unix-timestamp/execute":{"post":{"operationId":"execute_unix_timestamp","summary":"Execute Unix Timestamp Converter","description":"Convert Unix timestamps to human-readable dates and vice versa.","tags":["Datetime"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"action":{"type":"string","enum":["to_date","to_timestamp","now"],"description":"\"to_date\": timestamp -> date string | \"to_timestamp\": date string -> timestamp | \"now\": current timestamp"},"value":{"type":"string","description":"Unix timestamp (seconds or ms) or ISO date string. Not needed for \"now\"."}},"required":["action"],"additionalProperties":false},"example":{"action":"to_date","value":"1704067200"}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"timestamp":1704067200,"iso":"2024-01-01T00:00:00.000Z","utc":"Mon, 01 Jan 2024 00:00:00 GMT","relative":"about 3 months ago"},"meta":{"tool":"unix-timestamp","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/number-base":{"get":{"operationId":"getTool_number_base","summary":"Get info for Number Base Converter","tags":["Conversion"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/number-base/execute":{"post":{"operationId":"execute_number_base","summary":"Execute Number Base Converter","description":"Convert numbers between binary, octal, decimal, and hexadecimal.","tags":["Conversion"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"string","description":"The number to convert (as string to handle large values).","maxLength":256},"from":{"type":"string","enum":["binary","octal","decimal","hexadecimal","bin","oct","dec","hex"],"description":"Source base."}},"required":["value","from"],"additionalProperties":false},"example":{"value":"255","from":"decimal"}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"decimal":"255","binary":"11111111","octal":"377","hexadecimal":"ff"},"meta":{"tool":"number-base","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/case-convert":{"get":{"operationId":"getTool_case_convert","summary":"Get info for Text Case Converter","tags":["Text"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/case-convert/execute":{"post":{"operationId":"execute_case_convert","summary":"Execute Text Case Converter","description":"Convert text between different cases: uppercase, lowercase, title, camelCase, PascalCase, snake_case, kebab-case, and CONSTANT_CASE.","tags":["Text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"The text to convert.","maxLength":100000},"to":{"type":"string","enum":["upper","lower","title","camel","pascal","snake","kebab","constant","sentence"],"description":"Target case format."}},"required":["text","to"],"additionalProperties":false},"example":{"text":"hello world foo","to":"camel"}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"result":"helloWorldFoo"},"meta":{"tool":"case-convert","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/word-count":{"get":{"operationId":"getTool_word_count","summary":"Get info for Word Counter","tags":["Text"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/word-count/execute":{"post":{"operationId":"execute_word_count","summary":"Execute Word Counter","description":"Count words, characters, sentences, paragraphs, and estimate reading time.","tags":["Text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"The text to analyze.","maxLength":1000000}},"required":["text"],"additionalProperties":false},"example":{"text":"Hello world! How are you today?\n\nThis is a new paragraph."}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"words":10,"characters":55,"charactersNoSpaces":44,"sentences":3,"paragraphs":2,"readingTimeSeconds":3},"meta":{"tool":"word-count","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/lorem-ipsum":{"get":{"operationId":"getTool_lorem_ipsum","summary":"Get info for Lorem Ipsum Generator","tags":["Text"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/lorem-ipsum/execute":{"post":{"operationId":"execute_lorem_ipsum","summary":"Execute Lorem Ipsum Generator","description":"Generate placeholder \"Lorem Ipsum\" text by words, sentences, or paragraphs.","tags":["Text"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["words","sentences","paragraphs"],"description":"Unit of generation.","default":"paragraphs"},"count":{"type":"integer","description":"Number of units to generate (1–100).","minimum":1,"maximum":100,"default":3},"startWithLorem":{"type":"boolean","description":"Start the first paragraph with \"Lorem ipsum dolor sit amet...\"","default":true}},"additionalProperties":false},"example":{"type":"paragraphs","count":2}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"result":"Lorem ipsum dolor sit amet...\n\nUt labore..."},"meta":{"tool":"lorem-ipsum","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/jwt-decode":{"get":{"operationId":"getTool_jwt_decode","summary":"Get info for JWT Decoder","tags":["Developer"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/jwt-decode/execute":{"post":{"operationId":"execute_jwt_decode","summary":"Execute JWT Decoder","description":"Decode a JWT token and inspect its header and payload. Does NOT verify the signature.","tags":["Developer"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","description":"The JWT token to decode.","maxLength":100000}},"required":["token"],"additionalProperties":false},"example":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"header":{"alg":"HS256","typ":"JWT"},"payload":{"sub":"1234567890","name":"John Doe","iat":1516239022},"signature":"SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c","verified":false,"warning":"Signature not verified. Do not trust this token without verification."},"meta":{"tool":"jwt-decode","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/regex-test":{"get":{"operationId":"getTool_regex_test","summary":"Get info for Regex Tester","tags":["Developer"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/regex-test/execute":{"post":{"operationId":"execute_regex_test","summary":"Execute Regex Tester","description":"Test a regular expression against text and return all matches with groups.","tags":["Developer"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pattern":{"type":"string","description":"The regular expression pattern (without delimiters).","maxLength":1000},"text":{"type":"string","description":"The text to test against.","maxLength":100000},"flags":{"type":"string","description":"Regex flags: g (global), i (case-insensitive), m (multiline), s (dotAll). Default: \"g\"","default":"g"}},"required":["pattern","text"],"additionalProperties":false},"example":{"pattern":"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}","text":"Contact us at hello@example.com or support@findutils.com","flags":"g"}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"matched":true,"matchCount":2,"matches":[{"match":"hello@example.com","index":14,"groups":[]},{"match":"support@findutils.com","index":35,"groups":[]}]},"meta":{"tool":"regex-test","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/date-diff":{"get":{"operationId":"getTool_date_diff","summary":"Get info for Date Difference Calculator","tags":["Datetime"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/date-diff/execute":{"post":{"operationId":"execute_date_diff","summary":"Execute Date Difference Calculator","description":"Calculate the difference between two dates in various units.","tags":["Datetime"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"string","description":"Start date (ISO 8601 or any parseable date string)."},"to":{"type":"string","description":"End date (ISO 8601 or any parseable date string). Defaults to now if omitted."}},"required":["from"],"additionalProperties":false},"example":{"from":"2024-01-01","to":"2024-12-31"}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"days":365,"weeks":52,"months":12,"years":1,"hours":8760,"minutes":525600,"seconds":31536000,"fromDate":"2024-01-01T00:00:00.000Z","toDate":"2024-12-31T00:00:00.000Z"},"meta":{"tool":"date-diff","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/csv-to-json":{"get":{"operationId":"getTool_csv_to_json","summary":"Get info for CSV to JSON Converter","tags":["Data"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/csv-to-json/execute":{"post":{"operationId":"execute_csv_to_json","summary":"Execute CSV to JSON Converter","description":"Convert CSV text to a JSON array of objects. First row is used as headers.","tags":["Data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"csv":{"type":"string","description":"The CSV content to convert.","maxLength":1000000},"delimiter":{"type":"string","description":"Field delimiter character. Default: \",\"","default":","},"coerce":{"type":"boolean","description":"Automatically coerce numbers, booleans, and nulls. Default: true","default":true}},"required":["csv"],"additionalProperties":false},"example":{"csv":"name,age,city\nAlice,30,NYC\nBob,25,LA"}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"rows":[{"name":"Alice","age":30,"city":"NYC"},{"name":"Bob","age":25,"city":"LA"}],"count":2,"headers":["name","age","city"]},"meta":{"tool":"csv-to-json","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/tools/json-to-csv":{"get":{"operationId":"getTool_json_to_csv","summary":"Get info for JSON to CSV Converter","tags":["Data"],"responses":{"200":{"description":"Tool info and parameter schema","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolInfoResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/tools/json-to-csv/execute":{"post":{"operationId":"execute_json_to_csv","summary":"Execute JSON to CSV Converter","description":"Convert a JSON array of objects to CSV format.","tags":["Data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"json":{"type":"string","description":"A JSON array of objects to convert.","maxLength":1000000},"delimiter":{"type":"string","description":"Field delimiter. Default: \",\"","default":","},"includeHeaders":{"type":"boolean","description":"Include a header row. Default: true","default":true}},"required":["json"],"additionalProperties":false},"example":{"json":"[{\"name\":\"Alice\",\"age\":30},{\"name\":\"Bob\",\"age\":25}]"}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"},"example":{"success":true,"result":{"csv":"name,age\nAlice,30\nBob,25","rows":2,"columns":2},"meta":{"tool":"json-to-csv","executionMs":1}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"429":{"$ref":"#/components/responses/RateLimited"}}}}},"components":{"schemas":{"ToolInfo":{"type":"object","properties":{"id":{"type":"string","example":"base64"},"name":{"type":"string","example":"Base64 Encoder / Decoder"},"description":{"type":"string"},"category":{"type":"string","example":"encoding"},"parameters":{"type":"object","description":"JSON Schema for tool parameters"}}},"ToolInfoResponse":{"type":"object","properties":{"success":{"type":"boolean"},"tool":{"$ref":"#/components/schemas/ToolInfo"}}},"SuccessResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"result":{"type":"object"},"meta":{"type":"object","properties":{"tool":{"type":"string"},"executionMs":{"type":"integer"}}}}},"ErrorResponse":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string","example":"VALIDATION_ERROR"},"message":{"type":"string"}}}}}},"responses":{"NotFound":{"description":"Tool not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Tool not found."}}}}},"ValidationError":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Missing required field: text"}}}}},"RateLimited":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Remaining requests in current window"},"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until rate limit resets"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"success":false,"error":{"code":"RATE_LIMITED","message":"Rate limit exceeded. Try again later."}}}}}}}}