{"openapi":"3.1.0","info":{"title":"PithLab API","version":"1.0.0","description":"Run PithLab tools over HTTP. Docs: https://pithlab.com/developers"},"servers":[{"url":"https://pithlab.com"}],"security":[{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"An API key from your account page, e.g. pl_live_…"}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}}}}},"paths":{"/api/v1/tools/add-prefix-suffix-to-lines":{"post":{"operationId":"addPrefixSuffixToLines","summary":"Add Prefix and Suffix to Lines","description":"Add (or strip) a prefix and suffix on every line, with optional quoting, numbering and a custom joiner, e.g. to build an SQL IN list or a JS array.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text, one item per line.","maxLength":200000},"mode":{"type":"string","description":"add puts the prefix and suffix on each line; strip removes them where present.","default":"add","enum":["add","strip"],"maxLength":200000},"prefix":{"type":"string","description":"Text put before each line.","default":"","maxLength":1000},"suffix":{"type":"string","description":"Text put after each line.","default":"","maxLength":1000},"quote":{"type":"string","description":"Wrap each line in quotes (inside the prefix and suffix).","default":"none","enum":["none","single","double","backtick"],"maxLength":200000},"escapeQuotes":{"type":"boolean","description":"Escape quotes inside a line: doubled for single quotes (SQL style), backslash otherwise.","default":true},"numbering":{"type":"boolean","description":"Put a line number in front of each line.","default":false},"start":{"type":"integer","description":"First line number when numbering.","default":1,"minimum":-1000000,"maximum":1000000},"step":{"type":"integer","description":"Increment between line numbers.","default":1,"minimum":-1000,"maximum":1000},"padding":{"type":"integer","description":"Minimum digits for the number, zero-padded. 0 means no padding.","default":0,"minimum":0,"maximum":20},"numberSeparator":{"type":"string","description":"Text between the number and the line, e.g. \". \" or \") \".","default":". ","maxLength":100},"skipEmpty":{"type":"boolean","description":"Drop blank lines.","default":false},"trimLines":{"type":"boolean","description":"Trim spaces at both ends of each line first.","default":false},"joinWith":{"type":"string","description":"Text placed between output lines. The escapes \\n, \\r, \\t and \\\\ are understood.","default":"\\n","maxLength":100},"wrapStart":{"type":"string","description":"Text before the whole result, e.g. \"(\".","default":"","maxLength":1000},"wrapEnd":{"type":"string","description":"Text after the whole result, e.g. \")\".","default":"","maxLength":1000}},"required":["input"]},"example":{"input":"apple\nbanana\ncherry","quote":"single","joinWith":", ","wrapStart":"(","wrapEnd":")","skipEmpty":true,"trimLines":true}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/age-calculator":{"post":{"operationId":"ageCalculator","summary":"Age Calculator","description":"Exact age in years, months and days on a given date, with totals in days and weeks and the next birthday.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"birthDate":{"type":"string","description":"Date of birth as YYYY-MM-DD.","maxLength":10},"asOf":{"type":"string","description":"Date to calculate the age on, as YYYY-MM-DD. Defaults to today (UTC). Someone born on 29 February has their birthday on 28 February in common years.","maxLength":10}},"required":["birthDate"]},"example":{"birthDate":"1990-05-15","asOf":"2026-10-20"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/ai-token-counter":{"post":{"operationId":"aiTokenCounter","summary":"AI Token Counter","description":"Count LLM tokens in text: exact counts for OpenAI's o200k_base and cl100k_base tokenizers, estimates for Claude, Gemini and Llama, and how much of common context windows it fills.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text or prompt to count.","maxLength":200000}},"required":["input"]},"example":{"input":"PithLab counts tokens the way GPT-4o does."}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/aspect-ratio-calculator":{"post":{"operationId":"aspectRatioCalculator","summary":"Aspect Ratio Calculator","description":"Simplify width × height to an aspect ratio (1920×1080 → 16:9, with the nearest common preset), or resize to a ratio by solving the missing width or height.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"simplify: reduce width and height to a ratio. solve: given ratio and one of width or height, compute the other.","default":"simplify","enum":["simplify","solve"],"maxLength":200000},"width":{"type":"number","description":"Width in any unit (pixels, cm…), greater than 0. Required for simplify; for solve, give width or height, not both.","minimum":0},"height":{"type":"number","description":"Height in the same unit, greater than 0. Required for simplify; for solve, give width or height, not both.","minimum":0},"ratio":{"type":"string","description":"For solve: the target ratio, e.g. \"16:9\", \"4/3\", \"21x9\" or a decimal like \"2.39\".","maxLength":40}}},"example":{"mode":"simplify","width":1920,"height":1080}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/average-calculator":{"post":{"operationId":"averageCalculator","summary":"Average Calculator","description":"Descriptive statistics for a list of numbers: mean, median, mode, min, max, range, geometric and harmonic means, variance, standard deviation and quartiles.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"numbers":{"type":"string","description":"The numbers, separated by spaces, new lines, commas, semicolons or pipes (up to 100,000 values), e.g. \"4, 8, 15, 16, 23, 42\".","maxLength":200000},"quartileMethod":{"type":"string","description":"inclusive: linear interpolation (Excel QUARTILE.INC, Google Sheets, R default). halves: median of the lower and upper halves (TI-84, many textbooks).","default":"inclusive","enum":["inclusive","halves"],"maxLength":200000},"includeSorted":{"type":"boolean","description":"Include the sorted values in the response.","default":false}},"required":["numbers"]},"example":{"numbers":"4, 8, 15, 16, 23, 42"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/barcode-generator":{"post":{"operationId":"barcodeGenerator","summary":"Barcode Generator","description":"Generate a 1D barcode as SVG: EAN-13, UPC-A, EAN-8 (check digit added or verified), Code 128 or Code 39.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"value":{"type":"string","description":"The data. EAN-13: 12 or 13 digits. UPC-A: 11 or 12 digits. EAN-8: 7 or 8 digits. Code 128: printable ASCII, up to 80 characters. Code 39: A–Z, 0–9, space and - . $ / + %.","maxLength":80},"symbology":{"type":"string","description":"Barcode type.","default":"code128","enum":["ean13","upca","ean8","code128","code39"],"maxLength":200000},"code39Check":{"type":"boolean","description":"Code 39 only: append the optional mod 43 check character.","default":false},"barHeight":{"type":"integer","description":"Bar height in modules (narrowest bar widths).","default":50,"minimum":10,"maximum":200},"showText":{"type":"boolean","description":"Print the human-readable text under the bars.","default":true},"scale":{"type":"integer","description":"Pixels per module in the SVG width and height.","default":2,"minimum":1,"maximum":10}},"required":["value"]},"example":{"value":"400638133393","symbology":"ean13"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/base64-encoder-decoder":{"post":{"operationId":"base64EncoderDecoder","summary":"Base64 Encoder/Decoder","description":"Encode text to Base64 or decode Base64 to text (UTF-8).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"Text to encode, or Base64 to decode.","maxLength":200000},"mode":{"type":"string","description":"encode or decode.","enum":["encode","decode"],"maxLength":200000},"urlSafe":{"type":"boolean","description":"Use the URL-safe alphabet without padding when encoding.","default":false}},"required":["input","mode"]},"example":{"input":"Hello, World!","mode":"encode"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/bcrypt-generator":{"post":{"operationId":"bcryptGenerator","summary":"Bcrypt Generator","description":"Hash a password with bcrypt (random salt), or check a password against an existing bcrypt hash.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"hash: create a new bcrypt hash. verify: check password against hash.","default":"hash","enum":["hash","verify"],"maxLength":200000},"password":{"type":"string","description":"The password. bcrypt only uses the first 72 bytes (UTF-8).","maxLength":1000},"cost":{"type":"integer","description":"Cost factor (log2 rounds) when hashing, 4 to 12. 10–12 is typical.","default":10,"minimum":4,"maximum":12},"version":{"type":"string","description":"Hash prefix when hashing: 2b (modern default), 2y (PHP/Apache) or 2a (legacy).","default":"2b","enum":["2b","2y","2a"],"maxLength":200000},"hash":{"type":"string","description":"The bcrypt hash to check against, e.g. $2b$10$…; required for verify. Cost must be 12 or less.","maxLength":100}},"required":["password"]},"example":{"mode":"hash","password":"correct horse battery staple","cost":10}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/bill-splitter":{"post":{"operationId":"billSplitter","summary":"Bill Splitter","description":"Split a restaurant bill item by item (tax and tip shared in proportion to what each person ate, to the cent) or settle group trip expenses with the fewest payments.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"restaurant: split itemised bill. trip: who paid what, and who pays whom to settle up.","default":"restaurant","enum":["restaurant","trip"],"maxLength":200000},"people":{"type":"string","description":"Comma-separated names of everyone splitting, 1 to 20 (at least 2 for trip), e.g. \"Alice, Bob, Cara\". Names must be distinct.","maxLength":2000},"items":{"type":"string","description":"restaurant mode: JSON array of items, each {\"name\": string, \"price\": number, \"sharedBy\": [names or 0-based indexes]}. An empty or missing sharedBy means everyone shares it. Up to 100 items.","maxLength":50000},"expenses":{"type":"string","description":"trip mode: JSON array of expenses, each {\"description\": string, \"amount\": number, \"paidBy\": name or 0-based index, \"sharedBy\": [names or indexes]}. Empty sharedBy means everyone. Up to 100 expenses.","maxLength":50000},"tax":{"type":"number","description":"restaurant mode: tax, as a percentage of the item subtotal or a fixed amount (see taxKind).","default":0,"minimum":0},"taxKind":{"type":"string","description":"Whether tax is a percent (0 to 100) or an amount.","default":"percent","enum":["percent","amount"],"maxLength":200000},"tip":{"type":"number","description":"restaurant mode: tip, as a percentage of the item subtotal or a fixed amount (see tipKind).","default":0,"minimum":0},"tipKind":{"type":"string","description":"Whether tip is a percent (0 to 100) or an amount.","default":"percent","enum":["percent","amount"],"maxLength":200000}},"required":["people"]},"example":{"mode":"restaurant","people":"Alice, Bob, Cara","items":"[{\"name\":\"Pizza\",\"price\":18},{\"name\":\"Pasta\",\"price\":14.5,\"sharedBy\":[\"Alice\"]},{\"name\":\"Salad\",\"price\":9.25,\"sharedBy\":[\"Bob\"]},{\"name\":\"Wine\",\"price\":24,\"sharedBy\":[\"Alice\",\"Cara\"]}]","tax":8,"tip":15}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/bmi-calculator":{"post":{"operationId":"bmiCalculator","summary":"BMI Calculator","description":"Adult body mass index with the WHO category and the healthy weight range for the height, in metric or imperial units.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"units":{"type":"string","description":"metric: weight in kg, height in cm. imperial: weight in lb, height in feet plus inches.","default":"metric","enum":["metric","imperial"],"maxLength":200000},"weight":{"type":"number","description":"Body weight: kilograms (metric, 10 to 650) or pounds (imperial).","minimum":0},"height":{"type":"number","description":"Metric only: height in centimetres (50 to 280).","minimum":0},"feet":{"type":"number","description":"Imperial only: whole feet of height.","minimum":0,"maximum":9},"inches":{"type":"number","description":"Imperial only: inches on top of the feet (or total height in inches if feet is omitted).","minimum":0}},"required":["weight"]},"example":{"units":"metric","weight":70,"height":175}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/body-fat-calculator":{"post":{"operationId":"bodyFatCalculator","summary":"Body Fat Calculator","description":"Body fat percentage by the US Navy circumference method, with the ACE category and (given a weight) fat and lean mass.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"sex":{"type":"string","description":"male or female; the formula differs (women also need hip).","enum":["male","female"],"maxLength":200000},"units":{"type":"string","description":"metric: centimetres and kilograms. imperial: inches and pounds.","default":"metric","enum":["metric","imperial"],"maxLength":200000},"height":{"type":"number","description":"Height (100 to 250 cm, or 39 to 98 in).","minimum":0},"neck":{"type":"number","description":"Neck circumference, just below the larynx.","minimum":0},"waist":{"type":"number","description":"Waist circumference: at the navel for men, at the narrowest point for women.","minimum":0},"hip":{"type":"number","description":"Hip circumference at the widest point. Required for female, ignored for male.","minimum":0},"weight":{"type":"number","description":"Optional body weight (kg or lb) to also get fat mass and lean mass.","minimum":0}},"required":["sex","height","neck","waist"]},"example":{"sex":"male","units":"metric","height":180,"neck":38,"waist":85,"weight":80}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/border-radius-generator":{"post":{"operationId":"borderRadiusGenerator","summary":"Border Radius Generator","description":"Build or normalise a CSS border-radius value (including elliptical blob shapes) from a shorthand value or a named preset.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"value":{"type":"string","description":"A border-radius value to validate and shorten, e.g. \"12px\", \"10px 20px\" or \"30% 70% 70% 30% / 30% 30% 70% 70%\". All non-zero values must share one unit (px, % or rem). Ignored if preset is set.","maxLength":200},"preset":{"type":"string","description":"A named shape instead of value.","enum":["Rounded","Pill","Circle","Leaf","Tab","Blob","Blob 2","Blob 3","Egg","Drop"],"maxLength":200000}}},"example":{"value":"30% 70% 70% 30% / 30% 30% 70% 70%"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/box-shadow-generator":{"post":{"operationId":"boxShadowGenerator","summary":"Box Shadow Generator","description":"Build a CSS box-shadow from one layer's settings, a JSON list of layers, or a named preset. Colours are validated and re-serialised.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"offsetX":{"type":"number","description":"Horizontal offset in px.","default":0,"minimum":-1000,"maximum":1000},"offsetY":{"type":"number","description":"Vertical offset in px.","default":4,"minimum":-1000,"maximum":1000},"blur":{"type":"number","description":"Blur radius in px.","default":12,"minimum":0,"maximum":1000},"spread":{"type":"number","description":"Spread radius in px (negative shrinks the shadow).","default":0,"minimum":-1000,"maximum":1000},"color":{"type":"string","description":"Shadow colour: hex (#rgb, #rrggbb, #rrggbbaa), rgb(), rgba(), hsl() or hsv(). Colour names are not accepted.","default":"rgba(0, 0, 0, 0.25)","maxLength":100},"inset":{"type":"boolean","description":"Draw the shadow inside the box.","default":false},"layers":{"type":"string","description":"Several layers as a JSON array (up to 6), each {\"offsetX\":0,\"offsetY\":4,\"blur\":12,\"spread\":0,\"color\":\"#0003\",\"inset\":false}. Overrides the single-layer fields.","maxLength":5000},"preset":{"type":"string","description":"A named shadow instead of the other fields.","enum":["Soft","Layered","Hard offset","Inset","Glow"],"maxLength":200000}}},"example":{"offsetX":0,"offsetY":8,"blur":24,"spread":-4,"color":"rgba(15, 23, 42, 0.2)"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/break-even-calculator":{"post":{"operationId":"breakEvenCalculator","summary":"Break-Even Calculator","description":"Break-even point: units and revenue needed to cover fixed costs, with contribution margin and an optional target profit.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"fixedCosts":{"type":"number","description":"Total fixed costs for the period (rent, salaries…), in currency units.","minimum":0},"price":{"type":"number","description":"Selling price per unit. Must be greater than the variable cost.","minimum":0},"variableCost":{"type":"number","description":"Variable cost per unit (materials, shipping…).","minimum":0},"targetProfit":{"type":"number","description":"Optional profit to aim for; adds the units and revenue needed to reach it.","minimum":0}},"required":["fixedCosts","price","variableCost"]},"example":{"fixedCosts":10000,"price":50,"variableCost":30,"targetProfit":5000}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/business-days-calculator":{"post":{"operationId":"businessDaysCalculator","summary":"Business Days Calculator","description":"Count working days between two dates, or add/subtract working days to a date, skipping weekends and an optional holiday list.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"count: working days from start to end. add: move start by days working days (negative to go back).","default":"count","enum":["count","add"],"maxLength":200000},"start":{"type":"string","description":"Start date as YYYY-MM-DD.","maxLength":10},"end":{"type":"string","description":"For count: end date as YYYY-MM-DD (dates are swapped if end is earlier).","maxLength":10},"days":{"type":"integer","description":"For add: whole number of working days to add (negative to subtract), up to ±50,000. The start date itself is never counted.","minimum":-50000,"maximum":50000},"weekend":{"type":"string","description":"Weekend days as comma-separated numbers, 0 = Sunday … 6 = Saturday. Default \"0,6\" (Saturday and Sunday); \"5,6\" for Friday–Saturday.","default":"0,6","maxLength":20},"holidays":{"type":"string","description":"Holidays to skip, one per line as YYYY-MM-DD optionally followed by a name, e.g. \"2026-12-25 Christmas Day\".","maxLength":20000},"includeStart":{"type":"boolean","description":"For count: include the start date.","default":true},"includeEnd":{"type":"boolean","description":"For count: include the end date.","default":true},"listExcluded":{"type":"boolean","description":"Include the list of skipped weekend days and holidays in the response.","default":false}},"required":["start"]},"example":{"mode":"count","start":"2026-12-01","end":"2026-12-31","holidays":"2026-12-25 Christmas Day\n2026-12-28 Boxing Day (substitute)"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/cagr-calculator":{"post":{"operationId":"cagrCalculator","summary":"CAGR Calculator","description":"Compound annual growth rate: the CAGR between two values, the future value at a given CAGR, or the years needed to reach a target. Rates are returned as fractions (0.12 = 12%).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"rate: CAGR from begin and end. future: end value from begin and rate. years: time for begin to reach end at rate.","default":"rate","enum":["rate","future","years"],"maxLength":200000},"begin":{"type":"number","description":"Beginning value (greater than 0).","minimum":0},"end":{"type":"number","description":"Ending value (rate mode) or target value (years mode).","minimum":0},"rate":{"type":"number","description":"CAGR in percent (future and years modes), e.g. 7 for 7% a year.","minimum":-99.99,"maximum":1000},"years":{"type":"number","description":"Length of the period in years (rate and future modes). Ignored when startDate and endDate are given.","minimum":0,"maximum":1000},"startDate":{"type":"string","description":"Start date as YYYY-MM-DD; with endDate, sets the period instead of years.","maxLength":10},"endDate":{"type":"string","description":"End date as YYYY-MM-DD.","maxLength":10}},"required":["begin"]},"example":{"mode":"rate","begin":10000,"end":19500,"years":5}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/case-converter":{"post":{"operationId":"caseConverter","summary":"Case Converter","description":"Convert text between upper, lower, title, sentence, camel, Pascal, snake, kebab, constant and dot case.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text.","maxLength":200000},"to":{"type":"string","description":"Target case.","enum":["upper","lower","title","sentence","camel","pascal","snake","kebab","constant","dot"],"maxLength":200000}},"required":["input","to"]},"example":{"input":"user account id","to":"camel"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/certificate-decoder":{"post":{"operationId":"certificateDecoder","summary":"SSL Certificate Decoder","description":"Decode X.509 certificates (PEM, up to 20 in a chain): subject, issuer, validity, SANs, key, extensions and fingerprints, with self-signed and chain-order checks.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"pem":{"type":"string","description":"One or more PEM certificates (-----BEGIN CERTIFICATE-----), or a PKCS#7 bundle, or base64 DER.","maxLength":100000}},"required":["pem"]},"example":{"pem":"-----BEGIN CERTIFICATE-----\nMIIDRzCCAi+gAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwQzELMAkGA1UEBhMCR0Ix\nFTATBgNVBAoMDFBpdGhMYWIgVGVzdDEdMBsGA1UEAwwUUGl0aExhYiBUZXN0IFJv\nb3QgQ0EwHhcNMjYxMDE5MTg0NTQ5WhcNNDYxMDE0MTg0NTQ5WjBDMQswCQYDVQQG\nEwJHQjEVMBMGA1UECgwMUGl0aExhYiBUZXN0MR0wGwYDVQQDDBRQaXRoTGFiIFRl\nc3QgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbMzknv\nf1DOyFoHM7b6dEib/VwDjd1xUEGMc/Qie4FdXwItnl2VMw3GLID0XIaumKMPXFux\nj6JFZXwwDcNCDbN8qyE+4Knf6esBJrgTnHnMEP+PmQgLSuGzZRnSrJZfGtOtCS5d\n4/wFSkANT5zD0NYOThwDXx84mW4+L0fSYEB5yo8JXK+Oq8pM52XaZarUKiQOzSfU\nvmhjO07coHnvtEY0iu4hicj12y1w42vhrPLNS807UhjffkYtyq+Luzd2BZqu9ISY\nrnqo4gkpjdsm6jK+IPQSSq/fNmuXOmU48jTnD1xL/jSPSaHDGID1QGc1XFTwtsz+\n8i5bE2c45BcjrEUCAwEAAaNFMEMwEgYDVR0TAQH/BAgwBgEB/wIBATAOBgNVHQ8B\nAf8EBAMCAQYwHQYDVR0OBBYEFNKRzgsZDwlGxQ96KSzagVfgD+D/MA0GCSqGSIb3\nDQEBCwUAA4IBAQAUkTBtP5mEm3n7fvCVpdroIXT224F43TIKx6MxSHL0Uq76e5xS\ncYSYXpkEh9yDjPm4vm4DdnOD6Exb9Ry1RTDepx2UQHKhDJVTMBw18ApEC0+noyQv\nqdMO5EShFNHkvmrz4EhGelUAYpADnE+nW9YI60b5X1nCzqH8lyMIVnmhB8DXv1Iv\niLPlrKUmTU8BW2SEU+ZafBQlD6zsVFZjRceOGgR9uDADxUrP5k+x5pUXNSmtHd2T\n5utqfNQWumrkRuzt7UgRrORuwxDQ6ZU+2UMUq9Nm11N88zD7zT9Wn/EA07pJMCQ0\nHjfolF5X3iHwGMekx0o8zkPReir2pFlVdCeI\n-----END CERTIFICATE-----\n"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/character-counter":{"post":{"operationId":"characterCounter","summary":"Character Counter","description":"Count characters (grapheme clusters), characters without spaces, UTF-8 bytes, words and lines, plus X post weighted length, SMS encoding and segments, and common platform limits.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text to count.","maxLength":200000}},"required":["input"]},"example":{"input":"Hello, world! 👋"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/cidr-ip-range-converter":{"post":{"operationId":"cidrIpRangeConverter","summary":"CIDR to IP Range Converter","description":"Convert IPv4/IPv6 CIDR blocks to first–last ranges, ranges to the minimal CIDR list, merge overlapping CIDRs and ranges, or list every address in a small block.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"One CIDR (10.0.0.0/22, 2001:db8::/48) or range (10.0.0.0 - 10.0.3.255) per line; # starts a comment.","maxLength":100000},"mode":{"type":"string","description":"cidr-to-range: each CIDR as \"cidr: first - last (count)\". range-to-cidr: each range as CIDR blocks. merge: aggregate all lines into the fewest CIDRs. expand: list every address (at most 4,096).","default":"cidr-to-range","enum":["cidr-to-range","range-to-cidr","merge","expand"],"maxLength":200000}},"required":["input"]},"example":{"input":"192.168.0.0 - 192.168.2.255\n10.0.0.0/23\n10.0.2.0/23","mode":"merge"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/citation-generator":{"post":{"operationId":"citationGenerator","summary":"Citation Generator","description":"Format a reference for a book, journal article, website, newspaper article or report in APA 7, MLA 9, Chicago (notes-bibliography) or Harvard style.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"style":{"type":"string","description":"Citation style.","enum":["apa","mla","chicago","harvard"],"maxLength":200000},"type":{"type":"string","description":"Kind of source.","enum":["book","journal","website","newspaper","report"],"maxLength":200000},"title":{"type":"string","description":"Title of the book, article, page or report.","maxLength":1000},"authors":{"type":"string","description":"Authors separated by semicolons, each as \"Family, Given\" (e.g. \"Smith, Mary Jane; Lee, Ken\"). An organisation is just its name with no comma.","maxLength":5000},"container":{"type":"string","description":"Journal, website, newspaper or magazine name.","maxLength":500},"publisher":{"type":"string","description":"Publisher.","maxLength":500},"place":{"type":"string","description":"Place of publication (used by Chicago and Harvard for books and reports).","maxLength":500},"edition":{"type":"string","description":"Edition, e.g. 2 or 2nd.","maxLength":50},"volume":{"type":"string","description":"Volume number.","maxLength":50},"issue":{"type":"string","description":"Issue number.","maxLength":50},"pages":{"type":"string","description":"Page or page range, e.g. 45-67.","maxLength":50},"reportNumber":{"type":"string","description":"Report number.","maxLength":100},"year":{"type":"string","description":"Publication year, e.g. 2024 (a letter suffix such as 2024a is allowed).","maxLength":10},"month":{"type":"string","description":"Publication month as 1 to 12, or a season such as Spring.","maxLength":20},"day":{"type":"string","description":"Day of the month (needs a numeric month).","maxLength":2},"doi":{"type":"string","description":"DOI, with or without https://doi.org/.","maxLength":500},"url":{"type":"string","description":"URL of an online source.","maxLength":2000},"accessed":{"type":"string","description":"Date you accessed an online source, as YYYY-MM-DD.","maxLength":10}},"required":["style","type","title"]},"example":{"style":"apa","type":"journal","title":"Attention is all you need","authors":"Vaswani, Ashish; Shazeer, Noam","container":"Advances in Neural Information Processing Systems","volume":"30","pages":"5998-6008","year":"2017"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/clip-path-generator":{"post":{"operationId":"clipPathGenerator","summary":"Clip Path Generator","description":"Build a CSS clip-path: polygon from points, circle, ellipse or inset, or a named preset shape (triangle, hexagon, star, arrows…). All values are percentages.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"shape":{"type":"string","description":"Shape kind; decides which other fields are used.","default":"polygon","enum":["polygon","circle","ellipse","inset"],"maxLength":200000},"points":{"type":"string","description":"polygon: points as \"x y\" percentages, one per line or separated by commas, e.g. \"50 0, 100 100, 0 100\". 3 to 40 points, each -50 to 150.","maxLength":2000},"radius":{"type":"number","description":"circle: radius in %.","default":50,"minimum":0,"maximum":100},"rx":{"type":"number","description":"ellipse: horizontal radius in %.","default":50,"minimum":0,"maximum":100},"ry":{"type":"number","description":"ellipse: vertical radius in %.","default":35,"minimum":0,"maximum":100},"cx":{"type":"number","description":"circle and ellipse: centre X in %.","default":50,"minimum":-50,"maximum":150},"cy":{"type":"number","description":"circle and ellipse: centre Y in %.","default":50,"minimum":-50,"maximum":150},"top":{"type":"number","description":"inset: top inset in %.","default":10,"minimum":0,"maximum":100},"right":{"type":"number","description":"inset: right inset in %.","default":10,"minimum":0,"maximum":100},"bottom":{"type":"number","description":"inset: bottom inset in %.","default":10,"minimum":0,"maximum":100},"left":{"type":"number","description":"inset: left inset in %.","default":10,"minimum":0,"maximum":100},"round":{"type":"number","description":"inset: corner rounding in %.","default":0,"minimum":0,"maximum":50},"preset":{"type":"string","description":"A named shape instead of the other fields.","enum":["Triangle","Trapezoid","Parallelogram","Rhombus","Pentagon","Hexagon","Octagon","Star","Left arrow","Right arrow","Left chevron","Right chevron","Message","Cross","Circle","Ellipse","Inset"],"maxLength":200000}}},"example":{"shape":"polygon","points":"50 0, 100 100, 0 100"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/coin-flip":{"post":{"operationId":"coinFlip","summary":"Coin Flip","description":"Flip one or more fair coins with a cryptographic random source, with head/tail counts and longest streaks.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"count":{"type":"integer","description":"How many coins to flip (1 to 1000).","default":1,"minimum":1,"maximum":1000}}},"example":{"count":10}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/color-blindness-simulator":{"post":{"operationId":"colorBlindnessSimulator","summary":"Color Blindness Simulator","description":"Simulate how a list of colours looks with each colour vision deficiency (Machado 2009 model) and flag pairs that become hard to tell apart for one chosen type. Colours only, not images.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"colors":{"type":"string","description":"1 to 12 colours, one per line or separated by commas/spaces: hex, rgb(), hsl() or CSS names.","maxLength":2000},"type":{"type":"string","description":"Deficiency used for the 'hard to tell apart' check.","default":"deuteranopia","enum":["protanopia","deuteranopia","tritanopia","protanomaly","deuteranomaly","tritanomaly","achromatopsia"],"maxLength":200000},"severity":{"type":"number","description":"Severity for the -anomaly types, 0 to 1 (dichromacy types always use 1).","default":1,"minimum":0,"maximum":1},"threshold":{"type":"number","description":"ΔE OK below which two simulated colours count as hard to tell apart.","default":0.05,"minimum":0.001,"maximum":1}},"required":["colors"]},"example":{"colors":"#d62728, #2ca02c, #1f77b4","type":"deuteranopia"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/color-converter":{"post":{"operationId":"colorConverter","summary":"Colour Converter","description":"Convert a colour between HEX, RGB(A), HSL and HSV, detecting the input format.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"color":{"type":"string","description":"The colour: #f80, #ff8800, #ff880080, rgb(255, 136, 0), rgba(…), hsl(32, 100%, 50%) or hsv(32, 100%, 100%).","maxLength":100}},"required":["color"]},"example":{"color":"#0f766e"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/color-mixer":{"post":{"operationId":"colorMixer","summary":"Colour Mixer","description":"Mix two colours in sRGB, linear RGB and OKLab, with the equivalent CSS color-mix() and an evenly spaced blend scale in each space.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"first":{"type":"string","description":"First colour: hex, rgb(), hsl() or a CSS colour name.","maxLength":100},"second":{"type":"string","description":"Second colour.","maxLength":100},"percent":{"type":"number","description":"How much of the second colour, in %: 0 is all first, 100 is all second.","default":50,"minimum":0,"maximum":100},"steps":{"type":"integer","description":"Swatches in each blend scale, including both ends.","default":5,"minimum":2,"maximum":20}},"required":["first","second"]},"example":{"first":"#ff0000","second":"#0000ff","percent":50,"steps":3}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/color-palette-generator":{"post":{"operationId":"colorPaletteGenerator","summary":"Color Palette Generator","description":"Generate a palette from one base colour: complementary, analogous, triadic, tetradic, split-complementary and monochromatic harmonies, plus a 50–950 tint and shade scale as CSS variables and a Tailwind theme.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"color":{"type":"string","description":"Base colour: hex, rgb(), hsl(), hwb(), oklch() or a CSS colour name.","maxLength":100},"name":{"type":"string","description":"Token name for the CSS variables and Tailwind theme, e.g. brand.","default":"brand","maxLength":40}},"required":["color"]},"example":{"color":"#0f766e","name":"teal"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/compound-interest-calculator":{"post":{"operationId":"compoundInterestCalculator","summary":"Compound Interest Calculator","description":"Grow a starting amount with compound interest and optional end-of-month contributions; returns the final balance, interest earned, AER and an optional year-by-year table.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"principal":{"type":"number","description":"Starting amount, in currency units.","minimum":0},"rate":{"type":"number","description":"Nominal annual interest rate in percent, e.g. 5 for 5%.","minimum":0,"maximum":100},"years":{"type":"integer","description":"Whole years to grow, 1 to 100.","minimum":1,"maximum":100},"frequency":{"type":"string","description":"How often interest compounds.","default":"monthly","enum":["annually","semi-annually","quarterly","monthly","weekly","daily"],"maxLength":200000},"monthlyContribution":{"type":"number","description":"Amount added at the end of every month.","default":0,"minimum":0},"breakdown":{"type":"boolean","description":"Include the year-by-year rows (paid in, interest, balance).","default":false}},"required":["principal","rate","years"]},"example":{"principal":10000,"rate":5,"years":10,"frequency":"monthly","monthlyContribution":200}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/contrast-checker":{"post":{"operationId":"contrastChecker","summary":"Contrast Checker","description":"WCAG contrast ratio between two colours, with AA and AAA results.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"foreground":{"type":"string","description":"Text colour, e.g. #767676 or rgb(118 118 118).","maxLength":200000},"background":{"type":"string","description":"Background colour, e.g. #ffffff.","maxLength":200000}},"required":["foreground","background"]},"example":{"foreground":"#767676","background":"#ffffff"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/credit-card-payoff-calculator":{"post":{"operationId":"creditCardPayoffCalculator","summary":"Credit Card Payoff Calculator","description":"How long a credit card balance takes to clear and the interest paid: at a fixed monthly payment, within a set number of months, or paying only the minimum.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"payment: fixed monthly payment. months: payment needed to clear it in `months`. minimum: pay only the issuer's minimum.","default":"payment","enum":["payment","months","minimum"],"maxLength":200000},"balance":{"type":"number","description":"Current balance owed.","minimum":0},"apr":{"type":"number","description":"Annual percentage rate, e.g. 21.99. Interest is charged monthly at APR ÷ 12.","minimum":0,"maximum":100},"payment":{"type":"number","description":"payment mode: the fixed monthly payment (must exceed the first month's interest).","minimum":0},"months":{"type":"integer","description":"months mode: months to clear the balance, 1 to 1200.","minimum":1,"maximum":1200},"minPercent":{"type":"number","description":"minimum mode: minimum payment as a % of the balance, with that month's interest added on top.","default":1,"minimum":0,"maximum":100},"minFloor":{"type":"number","description":"minimum mode: the lowest minimum payment the issuer allows.","default":25,"minimum":0},"schedule":{"type":"boolean","description":"Include the month-by-month rows (payment, interest, balance).","default":false}},"required":["balance","apr"]},"example":{"mode":"payment","balance":5000,"apr":21.99,"payment":200}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/credit-card-validator":{"post":{"operationId":"creditCardValidator","summary":"Credit Card Validator","description":"Check a payment card number's format: brand from its IIN prefix, length and Luhn check digit. Does not contact any bank or check whether the card exists.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"number":{"type":"string","description":"The card number; spaces and dashes are ignored. Use test numbers such as 4111 1111 1111 1111, never real cards.","maxLength":40}},"required":["number"]},"example":{"number":"4111 1111 1111 1111"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/cron-expression-parser":{"post":{"operationId":"cronExpressionParser","summary":"Cron Expression Parser","description":"Explain a five-field cron expression and list its next run times (UTC).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"expression":{"type":"string","description":"The cron expression, e.g. 0 9 * * 1-5.","maxLength":200000},"count":{"type":"integer","description":"How many next runs to list (1 to 50).","default":5,"minimum":1,"maximum":50},"from":{"type":"string","description":"ISO 8601 start time for next runs. Defaults to now.","maxLength":40}},"required":["expression"]},"example":{"expression":"0 9 * * 1-5","count":3,"from":"2026-10-20T00:00:00Z"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/csp-header-generator":{"post":{"operationId":"cspHeaderGenerator","summary":"CSP Header Generator","description":"Build a Content-Security-Policy from directive lines (as header, meta tag, Nginx and Apache config) with a security analysis, or analyse an existing policy for risky settings.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"build: assemble a policy from `directives`. analyse: break down and grade an existing `policy`.","default":"build","enum":["build","analyse"],"maxLength":200000},"directives":{"type":"string","description":"build mode: one directive per line, name then space-separated sources, e.g. \"script-src 'self' https://cdn.example.com\". Supported: default-src, script-src, style-src, img-src, connect-src, font-src, frame-src, media-src, worker-src, manifest-src, object-src, base-uri, form-action, frame-ancestors. Keywords need their quotes ('self', 'none', 'unsafe-inline', 'nonce-…', 'sha256-…').","maxLength":20000},"upgradeInsecureRequests":{"type":"boolean","description":"build mode: add upgrade-insecure-requests.","default":false},"reportUri":{"type":"string","description":"build mode: report-uri value, an https:// URL or a path starting with /.","maxLength":2048},"reportTo":{"type":"string","description":"build mode: report-to endpoint name defined in a Reporting-Endpoints header.","maxLength":100},"reportOnly":{"type":"boolean","description":"build mode: output Content-Security-Policy-Report-Only instead of an enforcing policy.","default":false},"policy":{"type":"string","description":"analyse mode: the policy, with or without a 'Content-Security-Policy:' prefix, or a <meta> tag.","maxLength":20000}}},"example":{"mode":"build","directives":"default-src 'self'\nscript-src 'self' https://cdn.example.com\nobject-src 'none'\nframe-ancestors 'none'","upgradeInsecureRequests":true}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/csr-decoder":{"post":{"operationId":"csrDecoder","summary":"CSR Decoder","description":"Decode a PKCS#10 certificate signing request: subject, public key, requested SANs and extensions, attributes, and whether its self-signature is valid.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"pem":{"type":"string","description":"The CSR in PEM format (-----BEGIN CERTIFICATE REQUEST-----) or base64 DER.","maxLength":50000}},"required":["pem"]},"example":{"pem":"-----BEGIN CERTIFICATE REQUEST-----\nMIIBzzCCAXYCAQAwgZExCzAJBgNVBAYTAkdCMQ8wDQYDVQQIDAZMb25kb24xDzAN\nBgNVBAcMBkxvbmRvbjEUMBIGA1UECgwLRXhhbXBsZSBMdGQxDDAKBgNVBAsMA1dl\nYjEZMBcGA1UEAwwQd3d3LmV4YW1wbGUudGVzdDEhMB8GCSqGSIb3DQEJARYSYWRt\naW5AZXhhbXBsZS50ZXN0MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWIxfVoyp\n0KgIZ3n+X+yyE91ZT/rmpCkycrF/J+R5JFfYL0+3tnlR9wE9ZyHH1jQhY6vkSOw0\nwd/aUHga4HN3/qCBgTB/BgkqhkiG9w0BCQ4xcjBwMG4GA1UdEQRnMGWCEHd3dy5l\neGFtcGxlLnRlc3SCDGV4YW1wbGUudGVzdIcEwAACCocQIAENuAAAAAAAAAAAAAAA\nAYESYWRtaW5AZXhhbXBsZS50ZXN0hhdodHRwczovL2V4YW1wbGUudGVzdC9pZDAK\nBggqhkjOPQQDAgNHADBEAiBIAlGjvPhfb3QjhVHOSmSli1Surh1qzrnkG1kl5L3g\nKAIgZD5i+6FmSB3FkqdOJZ/Ka3xK2grhF0jV+owHocoukgw=\n-----END CERTIFICATE REQUEST-----\n"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/css-gradient-generator":{"post":{"operationId":"cssGradientGenerator","summary":"CSS Gradient Generator","description":"Build a CSS linear, radial or conic gradient (optionally repeating) from colour stops. Colours are validated and written as hex.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"stops":{"type":"string","description":"Colour stops, one per line or comma-separated, each \"colour position%\", e.g. \"#0ea5e9 0%, #8b5cf6 100%\". Colours are hex, rgb(), hsl() or hsv() (no colour names). Positions are 0 to 100; if every position is left out the stops are spread evenly. 2 to 10 stops.","maxLength":200000},"type":{"type":"string","description":"Gradient type.","default":"linear","enum":["linear","radial","conic"],"maxLength":200000},"angle":{"type":"number","description":"linear: direction in degrees (90 = left to right). conic: starting angle.","default":90,"minimum":-360,"maximum":360},"shape":{"type":"string","description":"radial: circle or ellipse.","default":"circle","enum":["circle","ellipse"],"maxLength":200000},"centerX":{"type":"number","description":"radial and conic: centre X in %.","default":50,"minimum":0,"maximum":100},"centerY":{"type":"number","description":"radial and conic: centre Y in %.","default":50,"minimum":0,"maximum":100},"repeating":{"type":"boolean","description":"Use repeating-*-gradient().","default":false}},"required":["stops"]},"example":{"stops":"#0ea5e9 0%, #8b5cf6 100%","type":"linear","angle":135}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/css-grid-generator":{"post":{"operationId":"cssGridGenerator","summary":"CSS Grid Generator","description":"Generate CSS Grid layout code (grid-template-columns/rows, gap and named grid-template-areas) plus matching HTML.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"columns":{"type":"string","description":"Column track sizes separated by spaces, e.g. \"200px 1fr\" or \"1fr minmax(200px, 2fr)\". Up to 12 tracks; fr, px, %, rem, em, vw, vh, ch, auto, min-content, max-content or minmax().","default":"1fr 1fr 1fr","maxLength":500},"rows":{"type":"string","description":"Row track sizes separated by spaces, e.g. \"auto 1fr auto\". Up to 12 tracks.","default":"auto","maxLength":500},"rowGap":{"type":"number","description":"Row gap in px.","default":16,"minimum":0,"maximum":200},"columnGap":{"type":"number","description":"Column gap in px.","default":16,"minimum":0,"maximum":200},"areas":{"type":"string","description":"Optional named areas as grid-template-areas rows, one row per line, one name per column (\".\" for an empty cell), e.g. \"header header\\nsidebar main\\nfooter footer\". Each name must form a rectangle.","maxLength":2000}}},"example":{"columns":"200px 1fr","rows":"auto 1fr auto","areas":"header header\nsidebar main\nfooter footer"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/css-minifier":{"post":{"operationId":"cssMinifier","summary":"CSS Minifier","description":"Minify CSS with csso (optionally merging and reordering rules) or pretty-print it. Syntax problems the parser recovered from are returned as warnings.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The CSS.","maxLength":200000},"mode":{"type":"string","description":"minify or format (pretty-print).","default":"minify","enum":["minify","format"],"maxLength":200000},"restructure":{"type":"boolean","description":"When minifying, merge and reorder rules for smaller output.","default":true},"keepImportantComments":{"type":"boolean","description":"When minifying, keep /*! important comments */ such as licence headers.","default":true},"indent":{"type":"integer","description":"Spaces per indent level when formatting.","default":2,"minimum":1,"maximum":8},"blankLineBetweenRules":{"type":"boolean","description":"When formatting, put a blank line between rules.","default":true}},"required":["input"]},"example":{"input":"/* Buttons */\n.btn {\n  color: #ffffff;\n  margin: 0px 0px 0px 0px;\n}\n.btn { padding: 4px; }"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/css-text-shadow-generator":{"post":{"operationId":"cssTextShadowGenerator","summary":"Text Shadow Generator","description":"Build a CSS text-shadow from one layer's settings, a JSON list of layers, or a named preset (neon, 3D, outline, long shadow).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"x":{"type":"number","description":"Horizontal offset in px.","default":2,"minimum":-500,"maximum":500},"y":{"type":"number","description":"Vertical offset in px.","default":2,"minimum":-500,"maximum":500},"blur":{"type":"number","description":"Blur radius in px.","default":4,"minimum":0,"maximum":500},"color":{"type":"string","description":"Shadow colour: hex, rgb(), hsl() or a CSS colour name.","default":"#000000","maxLength":100},"opacity":{"type":"number","description":"Opacity in %, multiplied with any alpha in the colour.","default":50,"minimum":0,"maximum":100},"layers":{"type":"string","description":"Several layers as a JSON array (up to 24), each {\"x\":0,\"y\":0,\"blur\":10,\"color\":\"#ff00de\",\"opacity\":100}. Overrides the single-layer fields.","maxLength":10000},"preset":{"type":"string","description":"A named effect instead of the other fields.","enum":["Soft","Neon","3D","Outline","Long shadow"],"maxLength":200000}}},"example":{"x":2,"y":2,"blur":4,"color":"#000000","opacity":50}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/css-triangle-generator":{"post":{"operationId":"cssTriangleGenerator","summary":"CSS Triangle Generator","description":"Generate CSS for a triangle pointing in any of eight directions, as the classic border trick and as clip-path, plus a tooltip arrow for straight directions.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"direction":{"type":"string","description":"Which way the triangle points.","default":"up","enum":["up-left","up","up-right","left","right","down-left","down","down-right"],"maxLength":200000},"width":{"type":"number","description":"Width in px.","default":20,"minimum":1,"maximum":1000},"height":{"type":"number","description":"Height in px.","default":20,"minimum":1,"maximum":1000},"color":{"type":"string","description":"Fill colour (hex, rgb(), hsl() or a name).","default":"#0f766e","maxLength":100}}},"example":{"direction":"down","width":24,"height":12,"color":"#0f766e"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/csv-cleaner":{"post":{"operationId":"csvCleaner","summary":"CSV Cleaner","description":"Clean CSV: trim cells, drop empty rows and columns, remove duplicate rows, rename headers, fix ragged rows and drop columns. Returns the cleaned CSV and a report of what changed.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The CSV text.","maxLength":200000},"delimiter":{"type":"string","description":"Input delimiter: \"auto\" to detect, or a single character such as \",\" \";\" \"|\" or a tab.","default":"auto","maxLength":4},"outputDelimiter":{"type":"string","description":"Output delimiter: \"same\" keeps the input one, or a single character.","default":"same","maxLength":4},"header":{"type":"boolean","description":"Treat the first row as a header row (kept, never de-duplicated).","default":true},"trim":{"type":"boolean","description":"Trim whitespace around every cell.","default":true},"removeEmptyRows":{"type":"boolean","description":"Drop rows where every cell is blank.","default":true},"removeEmptyColumns":{"type":"boolean","description":"Drop columns where every data cell is blank.","default":false},"removeDuplicates":{"type":"boolean","description":"Drop repeated data rows, keeping the first.","default":false},"duplicateKeys":{"type":"string","description":"Comma-separated 1-based column numbers that identify a duplicate, e.g. \"2\" for the second column. Empty compares whole rows.","default":"","maxLength":500},"ignoreCase":{"type":"boolean","description":"Ignore letter case when finding duplicates.","default":false},"headerStyle":{"type":"string","description":"Rename headers: keep, snake (first_name) or title (First Name).","default":"keep","enum":["keep","snake","title"],"maxLength":200000},"ragged":{"type":"string","description":"Rows with a different number of cells: keep as they are, pad short rows to the widest row, or fit every row to the first row's width.","default":"keep","enum":["keep","pad","fit"],"maxLength":200000},"removeColumns":{"type":"string","description":"Comma-separated 1-based column numbers to drop, e.g. \"3, 5\".","default":"","maxLength":500},"crlf":{"type":"boolean","description":"Use CRLF line endings instead of LF.","default":false}},"required":["input"]},"example":{"input":" Name , Email \nAda, ada@example.com \n\nAda,ada@example.com\nAlan,alan@example.com","removeDuplicates":true,"headerStyle":"snake"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/csv-to-json":{"post":{"operationId":"csvToJson","summary":"CSV to JSON Converter","description":"Convert CSV (comma, semicolon, tab or pipe separated) to JSON.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The CSV text.","maxLength":200000},"header":{"type":"boolean","description":"Use the first row as keys.","default":true},"inferTypes":{"type":"boolean","description":"Turn numbers and true/false into JSON numbers and booleans.","default":false}},"required":["input"]},"example":{"input":"name,age\nAda,36\nAlan,41","inferTypes":true}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/csv-to-sql":{"post":{"operationId":"csvToSql","summary":"CSV to SQL Converter","description":"Turn CSV into SQL: an optional CREATE TABLE with inferred column types, then batched INSERT statements, quoted for PostgreSQL, MySQL, SQLite or SQL Server.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The CSV text.","maxLength":200000},"dialect":{"type":"string","description":"SQL dialect, which decides identifier quoting, string escaping and type names.","default":"postgresql","enum":["postgresql","mysql","sqlite","sqlserver"],"maxLength":200000},"tableName":{"type":"string","description":"Table name, optionally schema-qualified (public.customers).","default":"my_table","maxLength":200},"delimiter":{"type":"string","description":"CSV delimiter: \"auto\" to detect, or a single character.","default":"auto","maxLength":4},"header":{"type":"boolean","description":"Use the first row as column names; otherwise columns are column_1, column_2…","default":true},"createTable":{"type":"boolean","description":"Start with a CREATE TABLE statement.","default":true},"batchSize":{"type":"integer","description":"Rows per INSERT statement (1 to 1000).","default":100,"minimum":1,"maximum":1000},"emptyAsNull":{"type":"boolean","description":"Write NULL for every empty cell. When false, empty text cells become '' and other empty cells NULL.","default":false},"inferTypes":{"type":"boolean","description":"Infer INTEGER, BIGINT, REAL, BOOLEAN, DATE and TIMESTAMP columns; when false every column is TEXT.","default":true}},"required":["input"]},"example":{"input":"id,name,active\n1,Ada,true\n2,O'Brien,false","tableName":"customers"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/csv-viewer":{"post":{"operationId":"csvViewer","summary":"CSV Viewer","description":"Parse CSV into headers and rows (padded to the same width), optionally filtered by a search term and sorted by a column. Numbers and dates sort naturally.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The CSV text.","maxLength":200000},"delimiter":{"type":"string","description":"Delimiter: \"auto\" to detect, or a single character.","default":"auto","maxLength":4},"header":{"type":"boolean","description":"Use the first row as column headings.","default":true},"filter":{"type":"string","description":"Keep only rows where some cell contains this text (case-insensitive).","default":"","maxLength":500},"sortColumn":{"type":"integer","description":"1-based column number to sort by. Omit to keep file order.","minimum":1,"maximum":10000},"sortDirection":{"type":"string","description":"Sort direction when sortColumn is set.","default":"asc","enum":["asc","desc"],"maxLength":200000},"limit":{"type":"integer","description":"Maximum rows to return (1 to 1000).","default":100,"minimum":1,"maximum":1000}},"required":["input"]},"example":{"input":"city,population\nLeeds,812000\nYork,202800\nBristol,472400","sortColumn":2,"sortDirection":"desc"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/curl-converter":{"post":{"operationId":"curlConverter","summary":"curl Converter","description":"Convert a curl command into equivalent code: JavaScript fetch, Node.js axios, Python requests, Go net/http, PHP curl or HTTPie. Handles headers, -d/--data*, -F forms, -u auth and common flags; unsupported options come back as warnings.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"command":{"type":"string","description":"The curl command, as copied from a terminal or browser dev tools (line continuations allowed).","maxLength":100000},"target":{"type":"string","description":"Output language: fetch (JavaScript fetch), axios (Node.js axios), python (Python requests), go (Go net/http), php (PHP curl), httpie (HTTPie).","default":"fetch","enum":["fetch","axios","python","go","php","httpie"],"maxLength":200000}},"required":["command"]},"example":{"command":"curl -X POST https://api.example.com/v1/items -H 'Content-Type: application/json' -H 'Authorization: Bearer TOKEN' -d '{\"name\":\"Widget\"}'","target":"python"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/date-calculator":{"post":{"operationId":"dateCalculator","summary":"Date Calculator","description":"Add or subtract years, months, weeks and days (or business days) to a date. Month ends are clamped: 31 January + 1 month = 28/29 February.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"start":{"type":"string","description":"Start date as YYYY-MM-DD.","maxLength":10},"operation":{"type":"string","description":"add or subtract the offset.","default":"add","enum":["add","subtract"],"maxLength":200000},"years":{"type":"integer","description":"Years to add or subtract (applied first, with months).","default":0,"minimum":0,"maximum":3650000},"months":{"type":"integer","description":"Months to add or subtract.","default":0,"minimum":0,"maximum":3650000},"weeks":{"type":"integer","description":"Weeks to add or subtract (5 business days each when businessDays is true).","default":0,"minimum":0,"maximum":3650000},"days":{"type":"integer","description":"Days to add or subtract.","default":0,"minimum":0,"maximum":3650000},"businessDays":{"type":"boolean","description":"Count weeks and days as business days (Monday–Friday), skipping weekends.","default":false}},"required":["start"]},"example":{"start":"2026-01-31","operation":"add","months":1,"days":10}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/date-difference-calculator":{"post":{"operationId":"dateDifferenceCalculator","summary":"Date Difference Calculator","description":"Time between two dates in years, months and days, plus total days, weeks and business days (Monday–Friday).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"start":{"type":"string","description":"Start date as YYYY-MM-DD.","maxLength":10},"end":{"type":"string","description":"End date as YYYY-MM-DD. If it's before start the dates are swapped and reversed is true.","maxLength":10},"includeEnd":{"type":"boolean","description":"Count the end date as one more day (by default the start date counts and the end date doesn't, like counting nights).","default":false}},"required":["start","end"]},"example":{"start":"2026-01-15","end":"2026-10-20"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/days-until-calculator":{"post":{"operationId":"daysUntilCalculator","summary":"Days Until Countdown","description":"Days (and a days/hours/minutes/seconds countdown) until a date, or until the next New Year, Valentine's Day, Easter, Halloween, US Thanksgiving or Christmas.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"date":{"type":"string","description":"Target date as YYYY-MM-DD. Give this or preset.","maxLength":10},"preset":{"type":"string","description":"Instead of a date: the next occurrence (on or after today) of a holiday.","enum":["new-year","valentines","easter","halloween","thanksgiving","christmas"],"maxLength":200000},"time":{"type":"string","description":"Target time of day as HH:MM (24-hour). Defaults to 00:00.","default":"00:00","maxLength":5},"timeZone":{"type":"string","description":"IANA time zone the target date and time are in, and in which 'today' is judged, e.g. Europe/London.","default":"UTC","maxLength":64},"now":{"type":"string","description":"ISO 8601 instant to count from, e.g. 2026-10-20T12:00:00Z. Defaults to the current time.","maxLength":40},"title":{"type":"string","description":"Optional event name used in the text summary.","maxLength":80}}},"example":{"preset":"christmas","timeZone":"Europe/London","now":"2026-10-20T12:00:00Z"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/debt-payoff-calculator":{"post":{"operationId":"debtPayoffCalculator","summary":"Debt Payoff Calculator","description":"Compare the avalanche (highest APR first) and snowball (smallest balance first) debt payoff strategies: months to debt-free, total interest and payoff order.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"debts":{"type":"string","description":"JSON array of 1 to 20 debts, each {\"name\": string, \"balance\": number, \"apr\": number (percent), \"minimum\": number (monthly minimum payment)}. Names must be distinct.","maxLength":20000},"extra":{"type":"number","description":"Extra amount paid each month on top of all the minimums.","default":0,"minimum":0}},"required":["debts"]},"example":{"debts":"[{\"name\":\"Credit card\",\"balance\":4000,\"apr\":22.9,\"minimum\":100},{\"name\":\"Car loan\",\"balance\":8000,\"apr\":6.5,\"minimum\":220},{\"name\":\"Store card\",\"balance\":900,\"apr\":18.9,\"minimum\":35}]","extra":200}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/dice-roller":{"post":{"operationId":"diceRoller","summary":"Dice Roller","description":"Roll dice in standard tabletop notation (2d6+3, 4d6kh3, d20-1, 3d8+2d4) with a cryptographic random source; returns each die, the total, and the possible min, max and average.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"notation":{"type":"string","description":"Dice notation: NdS terms (up to 100 dice of up to 1000 sides) joined with + or -, optional constants, and kh/kl to keep the highest/lowest, e.g. 4d6kh3.","maxLength":200},"rolls":{"type":"integer","description":"How many times to roll the whole expression (1 to 100).","default":1,"minimum":1,"maximum":100}},"required":["notation"]},"example":{"notation":"4d6kh3+2"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/discount-calculator":{"post":{"operationId":"discountCalculator","summary":"Discount Calculator","description":"Apply one or more percentage discounts in order (each to the already reduced price): final price, total saving and the equivalent single discount.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"price":{"type":"number","description":"Original price, in currency units.","minimum":0},"discounts":{"type":"string","description":"Comma-separated discount percentages applied in order, e.g. \"20\" or \"20, 10\" (20% off, then a further 10%). Each 0 to 100.","maxLength":500}},"required":["price","discounts"]},"example":{"price":80,"discounts":"25, 10"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/dns-lookup":{"post":{"operationId":"dnsLookup","summary":"DNS Lookup","description":"Look up a domain's DNS records (A, AAAA, CNAME, MX, NS, TXT, CAA, SOA) through public resolvers.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"domain":{"type":"string","description":"The domain name to look up, e.g. example.com. A pasted URL is reduced to its hostname.","maxLength":253},"type":{"type":"string","description":"One record type, or ALL for every type.","default":"ALL","enum":["ALL","A","AAAA","CNAME","MX","NS","TXT","CAA","SOA"],"maxLength":200000}},"required":["domain"]},"example":{"domain":"example.com","type":"MX"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/docker-run-to-compose":{"post":{"operationId":"dockerRunToCompose","summary":"Docker Run to Compose","description":"Convert one or more docker run commands into a docker-compose.yml: ports, volumes, env vars, networks, restart policy, healthchecks, resource limits and more. Unsupported flags come back as warnings.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"command":{"type":"string","description":"One or more docker run commands, separated by new lines, ; or &&. Line continuations (\\) are fine.","maxLength":100000},"resources":{"type":"string","description":"How to write --memory/--cpus: deploy (deploy.resources.limits) or legacy (mem_limit and cpus).","default":"deploy","enum":["deploy","legacy"],"maxLength":200000},"containerName":{"type":"boolean","description":"Add container_name when --name is given.","default":true}},"required":["command"]},"example":{"command":"docker run -d --name web -p 8080:80 -e NGINX_HOST=example.com -v ./html:/usr/share/nginx/html:ro --restart unless-stopped nginx:1.27"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/domain-whois-lookup":{"post":{"operationId":"domainWhoisLookup","summary":"Domain WHOIS Lookup","description":"Registration data (RDAP, the successor to WHOIS) for a domain or a public IP address: registrar, dates, status, nameservers and DNSSEC.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"query":{"type":"string","description":"A domain name, such as example.com, or a public IP address.","maxLength":2048}},"required":["query"]},"example":{"query":"example.com"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/due-date-calculator":{"post":{"operationId":"dueDateCalculator","summary":"Due Date Calculator","description":"Estimated pregnancy due date (40 weeks) from the last period, conception date or IVF transfer, with milestone dates and the gestational age on a given day.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"method":{"type":"string","description":"lmp: first day of the last menstrual period. conception: conception date. ivf: embryo transfer date.","default":"lmp","enum":["lmp","conception","ivf"],"maxLength":200000},"date":{"type":"string","description":"The LMP, conception or transfer date as YYYY-MM-DD.","maxLength":10},"cycleLength":{"type":"integer","description":"LMP method only: average cycle length in days (20 to 45).","default":28,"minimum":20,"maximum":45},"embryoDays":{"type":"integer","description":"IVF only: embryo age at transfer, 3 or 5 days.","default":5,"minimum":3,"maximum":5},"asOf":{"type":"string","description":"Optional date (YYYY-MM-DD) to report the gestational age and trimester on.","maxLength":10}},"required":["date"]},"example":{"method":"lmp","date":"2026-03-01","asOf":"2026-10-20"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/email-auth-checker":{"post":{"operationId":"emailAuthChecker","summary":"Email Authentication Checker","description":"SPF (with the DNS lookup count), DKIM, DMARC, MX, MTA-STS, TLS-RPT and BIMI for a domain, with a plain-English verdict.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"domain":{"type":"string","description":"The domain that sends email, such as example.com.","maxLength":2048},"selectors":{"type":"string","description":"DKIM selectors to check, comma separated. Defaults to common ones (google, selector1, selector2, default, k1, mail).","maxLength":500}},"required":["domain"]},"example":{"domain":"example.com"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/env-json-converter":{"post":{"operationId":"envJsonConverter","summary":".env to JSON Converter","description":"Convert a .env file to JSON, YAML, docker run -e flags or a Kubernetes env list, or a flat JSON object back to .env. Reports duplicate keys (last value wins).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"A .env file (KEY=value lines, comments, export prefixes and quotes allowed) or a flat JSON object of names and values.","maxLength":200000},"from":{"type":"string","description":"Input format: env (dotenv syntax), json (a flat object), or auto (JSON if it starts with {).","default":"auto","enum":["auto","env","json"],"maxLength":200000},"to":{"type":"string","description":"Output format.","default":"json","enum":["json","env","yaml","docker","kubernetes"],"maxLength":200000}},"required":["input"]},"example":{"input":"# Database\nDATABASE_URL=postgres://localhost/app\nexport PORT=8080\nGREETING=\"Hello\\nWorld\"","to":"json"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/fake-data-generator":{"post":{"operationId":"fakeDataGenerator","summary":"Fake Data Generator","description":"Generate realistic fake test data (names, emails on example.com, phones, addresses, UUIDs, IPs from documentation ranges…) as JSON, CSV, SQL INSERTs or NDJSON. A seed makes the output reproducible.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"fields":{"type":"string","description":"Comma-separated columns, in any order (output keeps a canonical order). Available: first_name, last_name, full_name, email, phone, street_address, city, postcode, country, company, job_title, username, date_of_birth, uuid, integer, boolean, ipv4, colour, sentence.","maxLength":1000},"rows":{"type":"integer","description":"Rows to generate (1 to 1000).","default":10,"minimum":1,"maximum":1000},"format":{"type":"string","description":"Output format. json also returns the rows as data.","default":"json","enum":["json","csv","sql","ndjson"],"maxLength":200000},"tableName":{"type":"string","description":"Table name for sql INSERT statements.","default":"people","maxLength":63},"intMin":{"type":"integer","description":"Lowest value for the integer column.","default":1,"minimum":-1000000000000,"maximum":1000000000000},"intMax":{"type":"integer","description":"Highest value for the integer column.","default":100,"minimum":-1000000000000,"maximum":1000000000000},"seed":{"type":"string","description":"Any text; the same seed and settings give the same data. Omit for fresh secure-random data.","default":"","maxLength":200}},"required":["fields"]},"example":{"fields":"full_name,email,city,country","rows":3,"format":"json","seed":"demo"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/fancy-text-generator":{"post":{"operationId":"fancyTextGenerator","summary":"Fancy Text Generator","description":"Turn plain text into Unicode styles (bold, italic, script, fraktur, double-struck, monospace, circled, small caps, upside down, strikethrough…) for social bios and posts.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text to style.","maxLength":10000},"style":{"type":"string","description":"One style id to return just that conversion, or all (default) for every style as a list of { id, name, output }.","default":"all","enum":["all","bold","italic","bold-italic","script","bold-script","fraktur","bold-fraktur","double-struck","monospace","sans","sans-bold","sans-italic","sans-bold-italic","circled","bubble","squared","small-caps","full-width","upside-down","strikethrough","underline"],"maxLength":200000}},"required":["input"]},"example":{"input":"Hello World","style":"bold"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/find-and-replace":{"post":{"operationId":"findAndReplace","summary":"Find and Replace","description":"Find and replace in text, as plain text or a JavaScript regular expression, with case sensitivity and whole-word options. Returns the result and match counts.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text to search.","maxLength":100000},"find":{"type":"string","description":"Text or regular expression (without slashes) to search for.","maxLength":500},"replace":{"type":"string","description":"Replacement. In regex mode $1, $<name> and $& refer to groups; in plain mode it is inserted literally.","default":"","maxLength":10000},"regex":{"type":"boolean","description":"Treat find as a JavaScript regular expression. Runs with a 1 second time limit, so patterns that backtrack heavily, such as (a+)+b, fail with an error.","default":false},"caseSensitive":{"type":"boolean","description":"Match case exactly.","default":false},"wholeWord":{"type":"boolean","description":"Only match where the search is not part of a longer word.","default":false},"replaceAll":{"type":"boolean","description":"Replace every match; false replaces only the first.","default":true}},"required":["input","find"]},"example":{"input":"Colour, colour and more COLOUR.","find":"colour","replace":"color"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/flexbox-playground":{"post":{"operationId":"flexboxPlayground","summary":"Flexbox Playground","description":"Generate flexbox CSS and HTML for a container and its items (direction, wrap, justify, align, gaps, and per-item flex, align-self and order). Defaults are left out of the CSS.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"flexDirection":{"type":"string","description":"flex-direction.","default":"row","enum":["row","row-reverse","column","column-reverse"],"maxLength":200000},"flexWrap":{"type":"string","description":"flex-wrap.","default":"nowrap","enum":["nowrap","wrap","wrap-reverse"],"maxLength":200000},"justifyContent":{"type":"string","description":"justify-content.","default":"flex-start","enum":["flex-start","flex-end","center","space-between","space-around","space-evenly"],"maxLength":200000},"alignItems":{"type":"string","description":"align-items.","default":"stretch","enum":["stretch","flex-start","flex-end","center","baseline"],"maxLength":200000},"alignContent":{"type":"string","description":"align-content (only matters when wrapping).","default":"normal","enum":["normal","flex-start","flex-end","center","space-between","space-around","space-evenly","stretch"],"maxLength":200000},"rowGap":{"type":"number","description":"Row gap in px.","default":8,"minimum":0,"maximum":200},"columnGap":{"type":"number","description":"Column gap in px.","default":8,"minimum":0,"maximum":200},"itemCount":{"type":"integer","description":"Number of items with default settings, when items is not given.","default":3,"minimum":1,"maximum":12},"items":{"type":"string","description":"Per-item settings as a JSON array (1 to 12), each {\"grow\":0,\"shrink\":1,\"basis\":\"auto\",\"alignSelf\":\"auto\",\"order\":0}; missing keys use those defaults. basis is auto, content or a length such as 120px or 25%. alignSelf is one of auto, flex-start, flex-end, center, baseline, stretch.","maxLength":5000}}},"example":{"justifyContent":"space-between","alignItems":"center","items":"[{\"grow\":1},{\"grow\":2,\"basis\":\"0%\"},{}]"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/fraction-calculator":{"post":{"operationId":"fractionCalculator","summary":"Fraction Calculator","description":"Add, subtract, multiply or divide fractions, mixed numbers and decimals exactly, with the simplified result, mixed number, decimal and worked steps.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"a":{"type":"string","description":"First number: a fraction (\"3/4\"), mixed number (\"1 1/2\"), whole number (\"-2\") or decimal (\"0.75\").","maxLength":60},"operation":{"type":"string","description":"The operation to apply: a <op> b.","enum":["add","subtract","multiply","divide"],"maxLength":200000},"b":{"type":"string","description":"Second number, in the same forms as a.","maxLength":60}},"required":["a","operation","b"]},"example":{"a":"1 1/2","operation":"add","b":"3/4"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/fuel-cost-calculator":{"post":{"operationId":"fuelCostCalculator","summary":"Fuel Cost Calculator","description":"Fuel needed and cost of a trip from distance, fuel efficiency (L/100 km, km/L, US or UK MPG) and fuel price, optionally round trip and split between people.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"distance":{"type":"number","description":"One-way distance, in distanceUnit.","minimum":0},"distanceUnit":{"type":"string","description":"km or mi.","default":"km","enum":["km","mi"],"maxLength":200000},"efficiency":{"type":"number","description":"Fuel efficiency, in efficiencyUnit.","minimum":0},"efficiencyUnit":{"type":"string","description":"l-100km (litres per 100 km), km-l (km per litre), mpg-us or mpg-uk (miles per US or UK gallon).","default":"l-100km","enum":["l-100km","km-l","mpg-us","mpg-uk"],"maxLength":200000},"price":{"type":"number","description":"Fuel price per priceUnit, in currency units.","minimum":0},"priceUnit":{"type":"string","description":"What the price is for: litre, us-gallon or uk-gallon.","default":"litre","enum":["litre","us-gallon","uk-gallon"],"maxLength":200000},"roundTrip":{"type":"boolean","description":"Double the distance for a return journey.","default":false},"people":{"type":"integer","description":"People sharing the cost, 1 to 100.","default":1,"minimum":1,"maximum":100}},"required":["distance","efficiency","price"]},"example":{"distance":350,"distanceUnit":"km","efficiency":6.5,"efficiencyUnit":"l-100km","price":1.75,"priceUnit":"litre","roundTrip":true,"people":2}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/glassmorphism-generator":{"post":{"operationId":"glassmorphismGenerator","summary":"Glassmorphism Generator","description":"Generate frosted-glass (glassmorphism) CSS: translucent background, backdrop blur and saturation (with the -webkit- prefix), border, radius and shadow.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"blur":{"type":"number","description":"Backdrop blur in px.","default":12,"minimum":0,"maximum":50},"transparency":{"type":"number","description":"Background opacity of the glass in %.","default":20,"minimum":0,"maximum":100},"color":{"type":"string","description":"Glass tint colour: hex, rgb(), hsl() or hsv() (no colour names); its alpha is ignored.","default":"#ffffff","maxLength":100},"saturation":{"type":"number","description":"Backdrop saturation in %.","default":180,"minimum":100,"maximum":250},"borderOpacity":{"type":"number","description":"White border opacity in % (0 removes the border).","default":30,"minimum":0,"maximum":100},"radius":{"type":"number","description":"Corner radius in px.","default":16,"minimum":0,"maximum":64},"shadow":{"type":"number","description":"Shadow strength in % (0 removes the shadow).","default":30,"minimum":0,"maximum":100},"preset":{"type":"string","description":"A named look instead of the other fields.","enum":["Frosted","Clear","Dark glass","Tinted"],"maxLength":200000}}},"example":{"blur":16,"transparency":25,"color":"#ffffff"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/gpa-calculator":{"post":{"operationId":"gpaCalculator","summary":"GPA Calculator","description":"US-style GPA on a 4.0 scale from letter grades and credits, optionally weighted for honors/AP courses and combined with a previous cumulative GPA.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"courses":{"type":"string","description":"JSON array of courses, each {\"grade\": \"A+\"…\"F\" (A+, A, A-, B+, B, B-, C+, C, C-, D+, D, D-, F), \"credits\": number, \"level\": \"regular\" | \"honors\" | \"ap\" (optional), \"name\": string (optional)}. Up to 200 courses.","maxLength":50000},"weighted":{"type":"boolean","description":"Add +0.5 for honors and +1.0 for AP/IB courses (not for F).","default":false},"aPlusIs43":{"type":"boolean","description":"Count A+ as 4.3 instead of 4.0.","default":false},"priorGpa":{"type":"number","description":"Optional previous cumulative GPA, to also return the new cumulative GPA (give priorCredits too).","minimum":0,"maximum":5.3},"priorCredits":{"type":"number","description":"Credits behind priorGpa.","minimum":0}},"required":["courses"]},"example":{"courses":"[{\"name\":\"Calculus\",\"grade\":\"A\",\"credits\":4},{\"name\":\"History\",\"grade\":\"B+\",\"credits\":3},{\"name\":\"Chemistry\",\"grade\":\"A-\",\"credits\":4,\"level\":\"honors\"}]"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/grade-calculator":{"post":{"operationId":"gradeCalculator","summary":"Final Grade Calculator","description":"Score needed on a final exam to reach a target grade, or the weighted average of graded categories (percentages or points like 43/50).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"final: score needed on the final. weighted: weighted average of categories.","default":"final","enum":["final","weighted"],"maxLength":200000},"current":{"type":"number","description":"final mode: current grade before the final, in percent.","minimum":0},"target":{"type":"number","description":"final mode: overall grade wanted, in percent.","minimum":0},"finalWeight":{"type":"number","description":"final mode: the final's share of the overall grade, in percent (more than 0, up to 100).","minimum":0,"maximum":100},"categories":{"type":"string","description":"weighted mode: JSON array of {\"name\": string (optional), \"weight\": percent, \"score\": \"87\" | \"87%\" | \"43/50\"}. Weights need not add up to 100; each is scaled to its share.","maxLength":20000}}},"example":{"mode":"final","current":82,"target":85,"finalWeight":30}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/hash-generator":{"post":{"operationId":"hashGenerator","summary":"Hash Generator","description":"MD5, SHA-1, SHA-256, SHA-384 and SHA-512 hashes of text (UTF-8).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text to hash.","maxLength":200000},"uppercase":{"type":"boolean","description":"Uppercase hex.","default":false}},"required":["input"]},"example":{"input":"hello"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/hmac-generator":{"post":{"operationId":"hmacGenerator","summary":"HMAC Generator","description":"Compute an HMAC (SHA-1, SHA-256, SHA-384 or SHA-512) of a message with a secret key, e.g. to sign or check webhook payloads.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"message":{"type":"string","description":"The message to authenticate, e.g. a webhook body.","maxLength":200000},"key":{"type":"string","description":"The secret key.","maxLength":10000},"algorithm":{"type":"string","description":"Hash function.","default":"SHA-256","enum":["SHA-1","SHA-256","SHA-384","SHA-512"],"maxLength":200000},"keyFormat":{"type":"string","description":"How the key is written: text (UTF-8), hex or base64.","default":"text","enum":["text","hex","base64"],"maxLength":200000},"messageFormat":{"type":"string","description":"How the message is written: text (UTF-8), hex or base64.","default":"text","enum":["text","hex","base64"],"maxLength":200000},"outputFormat":{"type":"string","description":"Encoding of the result.","default":"hex","enum":["hex","base64"],"maxLength":200000}},"required":["message","key"]},"example":{"message":"{\"event\":\"payment.succeeded\",\"id\":\"evt_123\"}","key":"whsec_test_secret","algorithm":"SHA-256"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/hourly-rate-calculator":{"post":{"operationId":"hourlyRateCalculator","summary":"Freelance Hourly Rate Calculator","description":"Freelance hourly and day rate needed to reach a take-home income after tax, business expenses, non-billable time and weeks off.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"takeHome":{"type":"number","description":"Desired yearly take-home pay after tax and expenses.","minimum":0},"expenses":{"type":"number","description":"Yearly business expenses (software, equipment, insurance, accountant).","default":0,"minimum":0},"taxRate":{"type":"number","description":"Effective tax rate on profit, in percent (0 to 95).","default":0,"minimum":0,"maximum":95},"hoursPerWeek":{"type":"number","description":"Hours worked per week, billable or not.","default":40,"minimum":0,"maximum":168},"nonBillable":{"type":"number","description":"Share of working time that can't be billed (admin, sales, learning), in percent.","default":0,"minimum":0,"maximum":95},"weeksOff":{"type":"number","description":"Weeks a year without work (holidays, public holidays, sick days).","default":0,"minimum":0,"maximum":51},"hoursPerDay":{"type":"number","description":"Hours in a billed day, for the day rate.","default":8,"minimum":0,"maximum":24}},"required":["takeHome"]},"example":{"takeHome":60000,"expenses":6000,"taxRate":25,"hoursPerWeek":40,"nonBillable":25,"weeksOff":6,"hoursPerDay":8}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/htaccess-redirect-generator":{"post":{"operationId":"htaccessRedirectGenerator","summary":"Htaccess Redirect Generator","description":"Generate Apache .htaccess and Nginx redirect rules: single page, bulk list, domain move, force HTTPS, add or remove www, add or remove trailing slashes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"page: one old path to one new URL (from, to). bulk: many pairs (pairs). domain: move oldDomain to newDomain. https: force HTTPS (domain optional). www-add / www-remove: canonical host (domain). slash-add / slash-remove: trailing slashes.","default":"page","enum":["page","bulk","domain","https","www-add","www-remove","slash-add","slash-remove"],"maxLength":200000},"code":{"type":"integer","description":"HTTP status: 301 (permanent) or 302 (temporary).","default":301,"minimum":301,"maximum":302},"apacheStyle":{"type":"string","description":"Apache module for page and bulk modes: rewrite (mod_rewrite) or alias (mod_alias Redirect lines).","default":"rewrite","enum":["rewrite","alias"],"maxLength":200000},"from":{"type":"string","description":"page mode: the old path or URL, e.g. /old-page.html.","maxLength":2048},"to":{"type":"string","description":"page mode: the new path or absolute URL.","maxLength":2048},"pairs":{"type":"string","description":"bulk mode: one \"old new\" pair per line, separated by whitespace or a comma.","maxLength":100000},"oldDomain":{"type":"string","description":"domain mode: the old domain, e.g. old-site.com.","maxLength":253},"newDomain":{"type":"string","description":"domain mode: the new domain, e.g. new-site.com.","maxLength":253},"domain":{"type":"string","description":"https, www-add and www-remove modes: the site's domain, e.g. example.com.","maxLength":253},"https":{"type":"boolean","description":"Use https:// in redirect targets for domain and www modes.","default":true}}},"example":{"mode":"bulk","pairs":"/old-page.html /new-page\n/blog/2019/hello /blog/hello"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/html-entity-encoder-decoder":{"post":{"operationId":"htmlEntityEncoderDecoder","summary":"HTML Entity Encoder/Decoder","description":"Escape text as HTML entities, or decode named (&amp;), decimal (&#38;) and hex (&#x26;) character references back to text.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"Text to encode, or HTML with entities to decode.","maxLength":200000},"mode":{"type":"string","description":"encode or decode.","enum":["encode","decode"],"maxLength":200000},"encoding":{"type":"string","description":"When encoding: basic (only & < > \" '), named (also every non-ASCII character, as a named entity where one exists) or numeric (also every non-ASCII character as &#xHEX;).","default":"basic","enum":["basic","named","numeric"],"maxLength":200000}},"required":["input","mode"]},"example":{"input":"<a href=\"/\">Café & Co</a>","mode":"encode","encoding":"named"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/html-formatter":{"post":{"operationId":"htmlFormatter","summary":"HTML Formatter","description":"Pretty-print HTML with consistent indentation, or minify it (collapse whitespace, drop comments). <pre>, <textarea>, <script> and <style> contents are kept as written when minifying.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The HTML.","maxLength":200000},"mode":{"type":"string","description":"format (pretty-print) or minify.","default":"format","enum":["format","minify"],"maxLength":200000},"indent":{"type":"integer","description":"Spaces per indent level when formatting.","default":2,"minimum":1,"maximum":8},"tabs":{"type":"boolean","description":"Indent with tabs instead of spaces when formatting.","default":false},"wrapLength":{"type":"integer","description":"Wrap lines longer than this many characters when formatting; 0 disables wrapping.","default":0,"minimum":0,"maximum":1000},"wrapAttributes":{"type":"string","description":"Attribute layout when formatting: auto, force (each on its own line), force-aligned or force-expand-multiline.","default":"auto","enum":["auto","force","force-aligned","force-expand-multiline"],"maxLength":200000},"removeComments":{"type":"boolean","description":"When minifying, remove <!-- comments --> (conditional comments are kept).","default":true},"removeWhitespaceBetweenTags":{"type":"boolean","description":"When minifying, remove all whitespace-only text between tags, not just next to block elements. Can join inline elements together.","default":false}},"required":["input"]},"example":{"input":"<ul><li><a href=\"/\">Home</a></li><li>About</li></ul>"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/htpasswd-generator":{"post":{"operationId":"htpasswdGenerator","summary":"Htpasswd Generator","description":"Build an Apache/nginx .htpasswd file from username:password lines, hashed with bcrypt ($2y$), APR1-MD5 ($apr1$) or SHA-1 ({SHA}).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"users":{"type":"string","description":"One user per line as username:password (the first colon splits; passwords may contain colons). Up to 50 users, or 10 with bcrypt.","maxLength":20000},"algorithm":{"type":"string","description":"bcrypt (recommended), apr1 (Apache MD5, widely supported) or sha1 (legacy, unsalted).","default":"bcrypt","enum":["bcrypt","apr1","sha1"],"maxLength":200000},"cost":{"type":"integer","description":"bcrypt cost factor, 4 to 12.","default":10,"minimum":4,"maximum":12},"apr1Salt":{"type":"string","description":"Fixed APR1 salt (up to 8 characters from ./0-9A-Za-z) for reproducible output. Random when omitted.","maxLength":8}},"required":["users"]},"example":{"users":"admin:s3cret-Pass\nstaging:preview-2026","algorithm":"apr1"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/http-header-checker":{"post":{"operationId":"httpHeaderChecker","summary":"HTTP Header Checker","description":"Fetch a public URL once (redirects not followed, body not read) and return the status line, response headers, resolved address and timing.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","description":"A public http(s) URL; https:// is added if missing. Ports 80, 443, 8080 and 8443 only.","maxLength":2048},"method":{"type":"string","description":"HTTP method to send.","default":"GET","enum":["GET","HEAD"],"maxLength":200000}},"required":["url"]},"example":{"url":"https://example.com"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/http-status-codes":{"post":{"operationId":"httpStatusCodes","summary":"HTTP Status Codes","description":"Look up HTTP status codes: the reason phrase, what it means, the defining specification and usage notes. Search by code (404), code prefix (40), class (4xx) or words (rate limit).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"query":{"type":"string","description":"A code (\"418\"), a code prefix (\"50\"), a class (\"4xx\") or words to match in the phrase and description (\"too many requests\"). Empty lists every code.","default":"","maxLength":200}}},"example":{"query":"429"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/inflation-calculator":{"post":{"operationId":"inflationCalculator","summary":"Inflation Calculator","description":"Inflation at a steady annual rate: what an amount will cost in the future, or what a future amount is worth in today's money, plus purchasing power lost and doubling time.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"future: amount is today's money. present: amount is a future sum to convert to today's money.","default":"future","enum":["future","present"],"maxLength":200000},"amount":{"type":"number","description":"The amount of money.","minimum":0},"rate":{"type":"number","description":"Average annual inflation in percent, e.g. 3 (above −50, up to 100).","minimum":-49.99,"maximum":100},"years":{"type":"number","description":"Number of years, 0 to 200.","minimum":0,"maximum":200}},"required":["amount","rate","years"]},"example":{"mode":"future","amount":1000,"rate":3,"years":10}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/ip-address-converter":{"post":{"operationId":"ipAddressConverter","summary":"IP Address Converter","description":"Convert an IP address between dotted decimal, decimal integer, hex, binary, octal and IPv6 forms (IPv4-mapped included).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"An IPv4 or IPv6 address, or a number such as 3232235777, 0xC0A80101 or 0b1100….","maxLength":200},"format":{"type":"string","description":"How to read the input; auto detects it.","default":"auto","enum":["auto","dotted","integer","hex","binary","octal","ipv6"],"maxLength":200000}},"required":["input"]},"example":{"input":"192.168.1.1"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/ipv6-address-tool":{"post":{"operationId":"ipv6AddressTool","summary":"IPv6 Expand and Compress","description":"Validate an IPv6 address and return its expanded and compressed forms, address type, reverse DNS name, embedded IPv4, integer value and, with a prefix, the network range.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"address":{"type":"string","description":"An IPv6 address, optionally with a /prefix or %zone, e.g. 2001:db8::1/64.","maxLength":200}},"required":["address"]},"example":{"address":"2001:db8:0:0:8:800:200c:417a/64"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/javascript-minifier":{"post":{"operationId":"javascriptMinifier","summary":"JavaScript Minifier","description":"Minify JavaScript with terser (mangle names, compress, drop comments) or pretty-print it. Syntax errors come back with line and column.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The JavaScript source (up to 100,000 characters).","maxLength":100000},"mode":{"type":"string","description":"minify or format (pretty-print).","default":"minify","enum":["minify","format"],"maxLength":200000},"mangle":{"type":"boolean","description":"Shorten local variable and function names when minifying.","default":true},"compress":{"type":"boolean","description":"Apply compressions such as dead-code removal and constant folding when minifying.","default":true},"keepLicenseComments":{"type":"boolean","description":"Keep /*! and @license comments when minifying; all other comments are removed.","default":false},"ecma":{"type":"integer","description":"Highest ECMAScript version the minified output may use: 5, 2015, 2016, 2017, 2018, 2019 or 2020.","default":2020,"minimum":5,"maximum":2020},"module":{"type":"boolean","description":"Parse as an ES module (allows import/export and top-level mangling).","default":false},"indent":{"type":"integer","description":"Spaces per indent level when formatting.","default":2,"minimum":1,"maximum":8}},"required":["input"]},"example":{"input":"function add(first, second) {\n  // Sum two numbers\n  return first + second;\n}\nconsole.log(add(2, 3));"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/json-diff":{"post":{"operationId":"jsonDiff","summary":"JSON Diff","description":"Compare two JSON documents structurally: lists added, removed, changed and moved values with JSONPath-style paths, plus an RFC 6902 JSON Patch that turns the original into the changed document.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"original":{"type":"string","description":"The original JSON document.","maxLength":200000},"changed":{"type":"string","description":"The changed JSON document.","maxLength":200000},"arrayKey":{"type":"string","description":"Match arrays of objects by this field (e.g. \"id\") instead of by position, so reordered items show as moved, not changed.","default":"","maxLength":100},"ignorePaths":{"type":"string","description":"Paths to leave out of the comparison, one per line or comma-separated, e.g. $.meta.updatedAt, $.items[*].etag or $..timestamp.","default":"","maxLength":5000}},"required":["original","changed"]},"example":{"original":"{\"name\":\"Ada\",\"roles\":[\"admin\"],\"meta\":{\"updatedAt\":\"2026-01-01\"}}","changed":"{\"name\":\"Ada Lovelace\",\"roles\":[\"admin\",\"editor\"],\"meta\":{\"updatedAt\":\"2026-02-01\"}}","ignorePaths":"$.meta.updatedAt"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/json-formatter":{"post":{"operationId":"jsonFormatter","summary":"JSON Formatter","description":"Validate and pretty-print or minify JSON.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The JSON text.","maxLength":200000},"mode":{"type":"string","description":"format or minify.","default":"format","enum":["format","minify"],"maxLength":200000},"indent":{"type":"integer","description":"Spaces per level when formatting: 2 or 4.","default":2,"minimum":2,"maximum":4},"sortKeys":{"type":"boolean","description":"Sort object keys alphabetically.","default":false}},"required":["input"]},"example":{"input":"{\"b\":1,\"a\":[true,null]}","sortKeys":true}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/json-schema-validator":{"post":{"operationId":"jsonSchemaValidator","summary":"JSON Schema Validator","description":"Validate a JSON document against a JSON Schema (draft 2020-12 or draft-07). Returns valid, every error with its JSON Pointer path and schema keyword, and warnings about unsupported keywords.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"schema":{"type":"string","description":"The JSON Schema, as JSON text.","maxLength":200000},"data":{"type":"string","description":"The JSON document to validate, as JSON text.","maxLength":200000},"draft":{"type":"string","description":"Schema draft; auto reads $schema and defaults to 2020-12.","default":"auto","enum":["auto","2020-12","draft-07"],"maxLength":200000}},"required":["schema","data"]},"example":{"schema":"{\"type\":\"object\",\"required\":[\"name\",\"age\"],\"properties\":{\"name\":{\"type\":\"string\"},\"age\":{\"type\":\"integer\",\"minimum\":0}}}","data":"{\"name\":\"Ada\",\"age\":-1}"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/json-to-csv":{"post":{"operationId":"jsonToCsv","summary":"JSON to CSV Converter","description":"Convert a JSON array of objects to CSV.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"A JSON array of objects.","maxLength":200000}},"required":["input"]},"example":{"input":"[{\"name\":\"Ada\",\"age\":36},{\"name\":\"Alan\",\"age\":41}]"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/json-to-go":{"post":{"operationId":"jsonToGo","summary":"JSON to Go","description":"Generate Go struct types with json tags from a sample JSON document. Integers and floats are kept apart; arrays of objects are merged into one struct.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"A sample JSON document (object or array).","maxLength":200000},"rootName":{"type":"string","description":"Name of the top-level struct.","default":"Root","maxLength":100},"omitEmpty":{"type":"string","description":"Which fields get ,omitempty: none, optional (fields missing from some samples) or all.","default":"none","enum":["none","optional","all"],"maxLength":200000},"inline":{"type":"boolean","description":"Nest object types as anonymous structs instead of separate named types.","default":false},"pointers":{"type":"boolean","description":"Use pointer types (*T) for values that are null in the sample.","default":false},"anyType":{"type":"string","description":"Spelling of the empty interface for unknown or mixed values.","default":"any","enum":["any","interface{}"],"maxLength":200000}},"required":["input"]},"example":{"input":"{\"id\":42,\"name\":\"Ada\",\"score\":9.5,\"tags\":[\"admin\"],\"address\":{\"city\":\"London\"}}","rootName":"User"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/json-to-python":{"post":{"operationId":"jsonToPython","summary":"JSON to Python","description":"Generate Python classes (dataclasses, Pydantic v2 models or TypedDicts) with type hints from a sample JSON document. Keys become snake_case fields, with aliases where needed.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"A sample JSON document (object or array).","maxLength":200000},"rootName":{"type":"string","description":"Name of the top-level class; must be a valid Python identifier.","default":"Root","maxLength":100},"style":{"type":"string","description":"Output style.","default":"dataclass","enum":["dataclass","pydantic","typeddict"],"maxLength":200000}},"required":["input"]},"example":{"input":"{\"userId\":42,\"name\":\"Ada\",\"isActive\":true,\"tags\":[\"admin\"]}","rootName":"User","style":"pydantic"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/json-to-typescript":{"post":{"operationId":"jsonToTypescript","summary":"JSON to TypeScript","description":"Generate TypeScript interfaces or type aliases from a sample JSON document. Keys missing from some array items become optional.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"A sample JSON document (object or array).","maxLength":200000},"rootName":{"type":"string","description":"Name of the top-level type.","default":"Root","maxLength":100},"style":{"type":"string","description":"interface emits `interface X {}`; type emits `type X = {}`.","default":"interface","enum":["interface","type"],"maxLength":200000},"exportKeyword":{"type":"boolean","description":"Prefix each declaration with export.","default":true}},"required":["input"]},"example":{"input":"{\"id\":1,\"title\":\"Hello\",\"author\":{\"name\":\"Ada\"},\"tags\":[\"intro\"]}","rootName":"Post"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/json-to-xml":{"post":{"operationId":"jsonToXml","summary":"JSON to XML","description":"Convert JSON to XML. Keys with the attribute prefix (default @_) become attributes; arrays become repeated elements.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The JSON text.","maxLength":200000},"rootName":{"type":"string","description":"Element that wraps the data when it has no single top-level key.","default":"root","maxLength":100},"attributePrefix":{"type":"string","description":"Keys starting with this prefix become XML attributes.","default":"@_","maxLength":10},"indent":{"type":"string","description":"Indentation: \"0\" for a single line, \"2\", \"4\" or \"tab\".","default":"2","enum":["0","2","4","tab"],"maxLength":200000},"declaration":{"type":"boolean","description":"Start with <?xml version=\"1.0\" encoding=\"UTF-8\"?>.","default":false}},"required":["input"]},"example":{"input":"{\"book\":{\"@_id\":\"1\",\"title\":\"Dune\",\"authors\":[\"Frank Herbert\"]}}"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/json-to-zod":{"post":{"operationId":"jsonToZod","summary":"JSON to Zod","description":"Generate Zod schemas (and inferred TypeScript types) from a sample JSON document, optionally detecting string formats such as email, URL, UUID and dates.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"A sample JSON document (object or array).","maxLength":200000},"rootName":{"type":"string","description":"Name of the top-level type; the schema is named <rootName>Schema in camelCase.","default":"Root","maxLength":100},"detectFormats":{"type":"boolean","description":"Add .datetime(), .date(), .email(), .url() and .uuid() when every sample value matches.","default":false},"exportTypes":{"type":"boolean","description":"Add `export type X = z.infer<typeof xSchema>` for each schema.","default":true}},"required":["input"]},"example":{"input":"{\"id\":\"3f2b8c1e-4d5a-4b6c-9e7f-1a2b3c4d5e6f\",\"email\":\"ada@example.com\",\"age\":36}","rootName":"User","detectFormats":true}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/json-yaml-converter":{"post":{"operationId":"jsonYamlConverter","summary":"JSON to YAML Converter","description":"Convert JSON to YAML or YAML to JSON.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"JSON or YAML text.","maxLength":200000},"to":{"type":"string","description":"Target format.","enum":["yaml","json"],"maxLength":200000}},"required":["input","to"]},"example":{"input":"{\"service\":\"billing\",\"replicas\":3,\"enabled\":\"yes\"}","to":"yaml"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/jsonpath-tester":{"post":{"operationId":"jsonpathTester","summary":"JSONPath Tester","description":"Evaluate a JSONPath expression against JSON and return every match with its normalised path, JSON Pointer and value. Filters such as [?(@.price < 10)] run in a safe interpreter (no eval).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The JSON document to query.","maxLength":200000},"path":{"type":"string","description":"The JSONPath expression, starting with $, e.g. $.store.book[?(@.price < 10)].title or $..author.","maxLength":1000}},"required":["input","path"]},"example":{"input":"{\"store\":{\"book\":[{\"title\":\"Dune\",\"price\":9.99},{\"title\":\"Emma\",\"price\":12.5}]}}","path":"$.store.book[?(@.price < 10)].title"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/julian-date-converter":{"post":{"operationId":"julianDateConverter","summary":"Julian Date Converter","description":"Convert between calendar dates (UTC), Julian Date (JD), Modified Julian Date (MJD) and ordinal dates (YYDDD / YYYYDDD).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"from":{"type":"string","description":"What the input is: calendar (YYYY-MM-DD date plus optional time), jd, mjd or ordinal (YYDDD or YYYYDDD).","enum":["calendar","jd","mjd","ordinal"],"maxLength":200000},"value":{"type":"string","description":"The input: \"2026-10-20\" for calendar, \"2451545.0\" for jd, \"51544.5\" for mjd, \"26293\" or \"2026293\" for ordinal.","maxLength":40},"time":{"type":"string","description":"calendar only: UTC time as HH:MM or HH:MM:SS. Defaults to midnight.","maxLength":8}},"required":["from","value"]},"example":{"from":"calendar","value":"2000-01-01","time":"12:00"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/jwt-decoder":{"post":{"operationId":"jwtDecoder","summary":"JWT Decoder","description":"Decode a JWT's header and payload. Does not verify the signature.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"token":{"type":"string","description":"The JWT.","maxLength":200000}},"required":["token"]},"example":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFkYSIsImlhdCI6MTcwMDAwMDAwMH0.signature"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/jwt-encoder":{"post":{"operationId":"jwtEncoder","summary":"JWT Encoder","description":"Sign a JWT (HS256/384/512 with a shared secret, or RS/PS/ES with a PEM private key), or verify a token's signature and exp/nbf/iat claims.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"sign: build and sign a token from header and payload. verify: check token's signature and time claims.","default":"sign","enum":["sign","verify"],"maxLength":200000},"alg":{"type":"string","description":"Signing algorithm. HS* use a shared secret; RS*/PS* need an RSA key; ES256/ES384 an EC P-256/P-384 key.","default":"HS256","enum":["HS256","HS384","HS512","RS256","RS384","RS512","PS256","ES256","ES384"],"maxLength":200000},"key":{"type":"string","description":"HS*: the shared secret. Otherwise a PEM key: PKCS#8 PRIVATE KEY to sign, SPKI PUBLIC KEY to verify.","maxLength":20000},"keyEncoding":{"type":"string","description":"How an HS* secret is written: text (UTF-8) or base64.","default":"text","enum":["text","base64"],"maxLength":200000},"payload":{"type":"string","description":"Sign: the claims as a JSON object, e.g. {\"sub\":\"123\",\"iat\":1700000000}.","default":"{}","maxLength":200000},"header":{"type":"string","description":"Sign: extra header fields as a JSON object; alg is always set from \"alg\".","default":"{\"typ\":\"JWT\"}","maxLength":200000},"token":{"type":"string","description":"Verify: the compact JWT to check.","maxLength":20000},"now":{"type":"number","description":"Verify: Unix time in seconds to check exp/nbf/iat against. Defaults to now.","minimum":0},"skew":{"type":"integer","description":"Verify: allowed clock difference in seconds.","default":0,"minimum":0,"maximum":86400}},"required":["key"]},"example":{"mode":"sign","alg":"HS256","key":"a-string-secret-at-least-256-bits-long","payload":"{\"sub\":\"1234567890\",\"name\":\"Ada\",\"iat\":1700000000}"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/key-pair-generator":{"post":{"operationId":"keyPairGenerator","summary":"Key Pair Generator","description":"Generate one new signing key pair (ECDSA, Ed25519 or RSA up to 4096 bits): PKCS#8 private key PEM, SPKI public key PEM, OpenSSH public key line and SHA-256 fingerprint. The key is created on PithLab's server and not stored; generate locally for production secrets.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"algorithm":{"type":"string","description":"Key type. ed25519 or ecdsa-p256 for modern SSH/JWT use; rsa-pkcs1-* for RS256 and older systems; rsa-pss-* for PS256.","default":"ed25519","enum":["ecdsa-p256","ecdsa-p384","ecdsa-p521","ed25519","rsa-pss-2048","rsa-pss-3072","rsa-pss-4096","rsa-pkcs1-2048","rsa-pkcs1-3072","rsa-pkcs1-4096"],"maxLength":200000},"comment":{"type":"string","description":"Comment appended to the OpenSSH public key line, e.g. ada@laptop.","default":"","maxLength":200}}},"example":{"algorithm":"ed25519","comment":"deploy@ci"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/leap-year-checker":{"post":{"operationId":"leapYearChecker","summary":"Leap Year Checker","description":"Check whether a year is a leap year under Gregorian rules (with the rule that applies and the previous/next leap years), or list the leap years in a range.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"year":{"type":"integer","description":"The year to check (1 to 99999).","minimum":1,"maximum":99999},"toYear":{"type":"integer","description":"Optional end year: list every leap year from year to toYear (at most 10,000 years apart) instead.","minimum":1,"maximum":99999}},"required":["year"]},"example":{"year":2100}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/llm-text-cleaner":{"post":{"operationId":"llmTextCleaner","summary":"AI Text Cleaner","description":"Remove hidden characters, smart punctuation and other artefacts from AI-generated text.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text to clean.","maxLength":200000}},"required":["input"]},"example":{"input":"Here’s the plan​ — simple, clear."}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/loan-calculator":{"post":{"operationId":"loanCalculator","summary":"Loan Calculator","description":"Fixed-rate loan or mortgage repayment: monthly payment, total interest, total repaid, a yearly amortisation summary and optionally the full monthly schedule.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"amount":{"type":"number","description":"Amount borrowed.","minimum":0},"rate":{"type":"number","description":"Annual interest rate in percent, e.g. 6 for 6%. Interest is charged monthly at rate ÷ 12.","minimum":0,"maximum":100},"term":{"type":"number","description":"Loan term in termUnit; must come to a whole number of months, at most 600.","minimum":0},"termUnit":{"type":"string","description":"years or months.","default":"years","enum":["years","months"],"maxLength":200000},"schedule":{"type":"boolean","description":"Include the month-by-month schedule (payment, principal, interest, balance).","default":false}},"required":["amount","rate","term"]},"example":{"amount":200000,"rate":6,"term":30,"termUnit":"years"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/lorem-ipsum-generator":{"post":{"operationId":"loremIpsumGenerator","summary":"Lorem Ipsum Generator","description":"Generate lorem ipsum placeholder text by paragraphs, sentences or words, as plain text or HTML paragraphs. Pass a seed for repeatable output.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"unit":{"type":"string","description":"What count measures.","default":"paragraphs","enum":["paragraphs","sentences","words"],"maxLength":200000},"count":{"type":"integer","description":"How many units: at most 100 paragraphs, 500 sentences or 5000 words.","default":3,"minimum":1,"maximum":5000},"startWithLorem":{"type":"boolean","description":"Begin with the classic \"Lorem ipsum dolor sit amet, consectetur adipiscing elit.\"","default":true},"html":{"type":"boolean","description":"Wrap each paragraph in <p> tags (paragraph unit only).","default":false},"seed":{"type":"integer","description":"Optional seed; the same seed and options always give the same text. Random when omitted.","minimum":0,"maximum":4294967295}}},"example":{"unit":"sentences","count":2,"seed":42}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/mac-address-generator":{"post":{"operationId":"macAddressGenerator","summary":"MAC Address Generator","description":"Generate random MAC addresses (locally administered unicast by default, optional vendor OUI prefix), or inspect and reformat an existing one.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"generate: random addresses. inspect: reformat and describe the address in input.","default":"generate","enum":["generate","inspect"],"maxLength":200000},"count":{"type":"integer","description":"How many to generate (1 to 1000).","default":1,"minimum":1,"maximum":1000},"format":{"type":"string","description":"colon (aa:bb:cc:dd:ee:ff), hyphen (aa-bb-…), dot (aabb.ccdd.eeff, Cisco) or none.","default":"colon","enum":["colon","hyphen","dot","none"],"maxLength":200000},"uppercase":{"type":"boolean","description":"Uppercase hex digits.","default":false},"local":{"type":"boolean","description":"Generate: set the locally administered bit (safe for VMs and testing).","default":true},"multicast":{"type":"boolean","description":"Generate: set the multicast (group) bit.","default":false},"oui":{"type":"string","description":"Generate: fixed 3-byte vendor prefix, e.g. 00:1A:2B. Its bits are kept as written.","default":"","maxLength":20},"input":{"type":"string","description":"Inspect: the MAC address to describe, in any common format.","maxLength":40}}},"example":{"count":3,"format":"colon"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/magic-decoder":{"post":{"operationId":"magicDecoder","summary":"Magic Decoder","description":"Identify and decode an unknown string: Base64, Base32, hex, URL/percent encoding, JWTs, Unix timestamps, UUIDs, HTML entities, binary, Morse, ROT13, punycode, IP addresses and more. Returns matches ranked by confidence.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The mystery string to identify.","maxLength":50000},"limit":{"type":"integer","description":"Return at most this many matches.","default":5,"minimum":1,"maximum":50}},"required":["input"]},"example":{"input":"SGVsbG8sIFdvcmxkIQ=="}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/markdown-table-generator":{"post":{"operationId":"markdownTableGenerator","summary":"Markdown Table Generator","description":"Turn CSV, TSV or an existing Markdown table into a tidy GitHub-flavoured Markdown table, with column alignment and padded columns. The first row is the header.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"CSV or TSV (delimiter detected), or a Markdown table to reformat.","maxLength":200000},"delimiter":{"type":"string","description":"Delimiter for CSV input: \"auto\" to detect, or a single character.","default":"auto","maxLength":4},"align":{"type":"string","description":"Comma-separated alignment per column: none, left, center or right, e.g. \"left,right\". Missing columns keep the alignment read from a Markdown input (or none).","default":"","maxLength":2000},"pretty":{"type":"boolean","description":"Pad cells so the columns line up in plain text.","default":true},"escapePipes":{"type":"boolean","description":"Escape | inside cells as \\| so it doesn't split the cell.","default":true}},"required":["input"]},"example":{"input":"Plan,Price,Requests\nFree,0,100\nPro,9,10000","align":"left,right,right"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/meeting-cost-calculator":{"post":{"operationId":"meetingCostCalculator","summary":"Meeting Cost Calculator","description":"What a meeting costs from its length and attendees' pay. Annual salaries are converted at 2,080 working hours a year.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"minutes":{"type":"number","description":"Meeting length in minutes, up to 1440.","minimum":1,"maximum":1440},"attendees":{"type":"integer","description":"Number of attendees, all on the same rate. Ignored when groups is given.","minimum":1,"maximum":10000},"rate":{"type":"number","description":"Pay per attendee, per rateUnit. Ignored when groups is given.","minimum":0},"rateUnit":{"type":"string","description":"hour (hourly rate) or year (annual salary).","default":"hour","enum":["hour","year"],"maxLength":200000},"groups":{"type":"string","description":"Optional JSON array of up to 20 attendee groups with different pay, each {\"count\": number, \"rate\": number, \"unit\": \"hour\" | \"year\"}. Overrides attendees and rate.","maxLength":5000}},"required":["minutes"]},"example":{"minutes":60,"groups":"[{\"count\":5,\"rate\":45,\"unit\":\"hour\"},{\"count\":2,\"rate\":120000,\"unit\":\"year\"}]"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/meeting-planner":{"post":{"operationId":"meetingPlanner","summary":"Meeting Planner","description":"Find the hours on a date when working hours overlap across 2 to 6 time zones (DST-aware), with each overlap in UTC and every zone's local time.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"date":{"type":"string","description":"The meeting date as YYYY-MM-DD; the day runs midnight to midnight in the first zone.","maxLength":10},"zones":{"type":"string","description":"Comma-separated IANA time zones, 2 to 6, e.g. \"America/New_York,Europe/London,Asia/Kolkata\".","maxLength":500},"workStart":{"type":"string","description":"Start of working hours in every zone, HH:MM 24-hour.","default":"09:00","maxLength":5},"workEnd":{"type":"string","description":"End of working hours in every zone, HH:MM 24-hour (24:00 allowed).","default":"17:00","maxLength":5},"includeGrid":{"type":"boolean","description":"Also return the full hour-by-hour grid of local times for each zone.","default":false}},"required":["date","zones"]},"example":{"date":"2026-10-20","zones":"America/New_York,Europe/London","workStart":"09:00","workEnd":"17:00"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/meta-tag-checker":{"post":{"operationId":"metaTagChecker","summary":"Meta Tag Checker","description":"Fetch a page (first 1 MB) and report its title, description, canonical, robots, Open Graph and Twitter tags, hreflang, H1s and JSON-LD types, with fixes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","description":"The page URL, such as https://example.com.","maxLength":2048}},"required":["url"]},"example":{"url":"https://example.com"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/meta-tag-generator":{"post":{"operationId":"metaTagGenerator","summary":"Meta Tag Generator","description":"Generate HTML <head> tags for SEO and social sharing (title, description, canonical, robots, Open Graph, Twitter card), with length advice.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"title":{"type":"string","description":"Page title; 50 to 60 characters is ideal.","maxLength":300},"description":{"type":"string","description":"Meta description; 120 to 160 characters is ideal.","maxLength":1000},"canonicalUrl":{"type":"string","description":"Absolute canonical URL of the page.","maxLength":2048},"imageUrl":{"type":"string","description":"Absolute URL of the social share image (1200×630 recommended).","maxLength":2048},"siteName":{"type":"string","description":"Site name for og:site_name.","maxLength":200},"type":{"type":"string","description":"Open Graph type.","default":"website","enum":["website","article","product","profile","video.other","book"],"maxLength":200000},"twitterHandle":{"type":"string","description":"X/Twitter handle for twitter:site, with or without @.","maxLength":16},"index":{"type":"boolean","description":"Allow search engines to index the page (false adds noindex).","default":true},"follow":{"type":"boolean","description":"Allow search engines to follow links (false adds nofollow).","default":true},"themeColour":{"type":"string","description":"Browser theme colour as hex, e.g. #0f766e.","maxLength":9},"author":{"type":"string","description":"Author name.","maxLength":200},"language":{"type":"string","description":"Language tag such as en-GB, used for og:locale.","maxLength":10}},"required":["title"]},"example":{"title":"Handmade Oak Furniture | Northwood Studio","description":"Solid oak tables, chairs and shelving, made to order in our Yorkshire workshop and delivered across the UK.","canonicalUrl":"https://northwood.example/","imageUrl":"https://northwood.example/og.jpg","siteName":"Northwood Studio"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/mime-type-lookup":{"post":{"operationId":"mimeTypeLookup","summary":"MIME Type Lookup","description":"Find the MIME type and Content-Type header for a file extension or filename, the extensions for a MIME type, or search the table. Optionally detect a file's real type from its first bytes (magic numbers).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"query":{"type":"string","description":"An extension (\"webp\", \".PNG\"), a filename (\"report.pdf\"), a MIME type (\"application/json\") or words to search. Empty is allowed when only fileBase64 is given.","default":"","maxLength":500},"fileBase64":{"type":"string","description":"Optional: the first bytes of a file (up to 4 KB), Base64-encoded, to detect its real type from magic numbers. When query is a filename, the result also says whether the extension matches the content.","maxLength":8192}}},"example":{"query":"photo.webp"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/morse-code-translator":{"post":{"operationId":"morseCodeTranslator","summary":"Morse Code Translator","description":"Translate text to International Morse code or Morse back to text, with the playback duration at a given speed.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"Text to encode, or Morse to decode (dots and dashes, letters separated by spaces, words by / or a line break).","maxLength":200000},"direction":{"type":"string","description":"encode (text → Morse), decode (Morse → text) or auto (decode if the input is only dots, dashes, spaces and slashes).","default":"auto","enum":["auto","encode","decode"],"maxLength":200000},"wpm":{"type":"integer","description":"Speed in words per minute, used for durationMs.","default":20,"minimum":5,"maximum":60}},"required":["input"]},"example":{"input":"SOS help","direction":"encode"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/mortgage-affordability-calculator":{"post":{"operationId":"mortgageAffordabilityCalculator","summary":"Mortgage Affordability Calculator","description":"Maximum home price you can afford from income, debts, down payment and mortgage rate, using front-end and back-end debt-to-income (DTI) limits including property tax, insurance and HOA.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"income":{"type":"number","description":"Gross (before tax) annual household income.","minimum":0},"debts":{"type":"number","description":"Other monthly debt payments (car, student loans, card minimums).","default":0,"minimum":0},"downPayment":{"type":"number","description":"Down payment available.","default":0,"minimum":0},"rate":{"type":"number","description":"Mortgage interest rate in percent (0 to 30).","minimum":0,"maximum":30},"termYears":{"type":"integer","description":"Mortgage term in whole years (1 to 50).","default":30,"minimum":1,"maximum":50},"taxPercent":{"type":"number","description":"Annual property tax as a percentage of the home price (0 to 10).","default":0,"minimum":0,"maximum":10},"insurance":{"type":"number","description":"Annual homeowners insurance.","default":0,"minimum":0},"hoa":{"type":"number","description":"Monthly HOA or service charge.","default":0,"minimum":0},"frontDti":{"type":"number","description":"Front-end limit: housing cost as a % of gross monthly income.","default":28,"minimum":0.01,"maximum":100},"backDti":{"type":"number","description":"Back-end limit: housing cost plus other debts as a % of gross monthly income.","default":36,"minimum":0.01,"maximum":100}},"required":["income","rate"]},"example":{"income":90000,"debts":400,"downPayment":40000,"rate":6.5,"termYears":30,"taxPercent":1.1,"insurance":1500,"hoa":0}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/nato-phonetic-alphabet":{"post":{"operationId":"natoPhoneticAlphabet","summary":"NATO Phonetic Alphabet Translator","description":"Spell text with the NATO/ICAO phonetic alphabet (Alfa, Bravo, Charlie…), or turn phonetic words back into text.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"Text to spell out, or phonetic words to decode (e.g. Hotel Echo Lima Lima Oscar).","maxLength":200000},"direction":{"type":"string","description":"encode (text → code words) or decode (code words → text).","default":"encode","enum":["encode","decode"],"maxLength":200000},"digits":{"type":"string","description":"Digit words: standard (Three, Four, Five, Nine) or icao (Tree, Fower, Fife, Niner).","default":"standard","enum":["standard","icao"],"maxLength":200000},"format":{"type":"string","description":"Encode output: inline (words separated by spaces, \" / \" between words) or lines (one \"H - Hotel\" per line).","default":"inline","enum":["inline","lines"],"maxLength":200000}},"required":["input"]},"example":{"input":"AB12","direction":"encode"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/number-base-converter":{"post":{"operationId":"numberBaseConverter","summary":"Number Base Converter","description":"Convert a whole number of any size between binary, octal, decimal, hexadecimal and any base from 2 to 36.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The number. Spaces, underscores and (in decimal) commas are ignored; 0x, 0b and 0o prefixes are understood.","maxLength":10000},"from":{"type":"integer","description":"Base of the input, 2 to 36. With 10, a 0x/0b/0o prefix switches to that base.","default":10,"minimum":2,"maximum":36},"to":{"type":"integer","description":"An extra target base (2 to 36) besides 2, 8, 10 and 16.","minimum":2,"maximum":36},"group":{"type":"boolean","description":"Separate digit groups (4 for binary/hex, 3 for octal/decimal).","default":false},"uppercase":{"type":"boolean","description":"Uppercase letter digits (A–Z).","default":false}},"required":["input"]},"example":{"input":"255","from":10,"to":36}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/palette-contrast-fixer":{"post":{"operationId":"paletteContrastFixer","summary":"Accessible Palette Checker","description":"Adjust the lightness of palette colours as little as possible (in OKLCH, hue kept) until chosen foreground/background pairs meet a WCAG contrast target.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"colors":{"type":"string","description":"2 to 10 colours, one per line or comma-separated (hex, rgb(), hsl() or names). They are numbered from 1 in this order.","maxLength":2000},"pairs":{"type":"string","description":"Pairs to fix as 1-based colour numbers, comma-separated, e.g. \"1-2, 1-3\" (text colour 1 on background 2 and 3).","maxLength":500},"adjustable":{"type":"string","description":"Colour numbers allowed to change, comma-separated, e.g. \"1\". Default: every colour.","maxLength":100},"target":{"type":"string","description":"aa: AA, normal text (4.5:1); aa-large: AA, large text and UI (3:1); aaa: AAA, normal text (7:1).","default":"aa","enum":["aa","aa-large","aaa"],"maxLength":200000}},"required":["colors","pairs"]},"example":{"colors":"#777777, #ffffff, #f1f5f9","pairs":"1-2, 1-3","adjustable":"1","target":"aa"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/passphrase-generator":{"post":{"operationId":"passphraseGenerator","summary":"Passphrase Generator","description":"Random diceware-style passphrases from the EFF large word list (7,776 words), chosen with a cryptographic random source, with their entropy in bits.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"words":{"type":"integer","description":"Words per passphrase (3 to 12); each adds about 12.9 bits. 6 is a good default.","default":6,"minimum":3,"maximum":12},"separator":{"type":"string","description":"Character between words.","default":"hyphen","enum":["space","hyphen","dot","underscore","none"],"maxLength":200000},"capitalise":{"type":"boolean","description":"Capitalise the first letter of every word.","default":false},"addDigit":{"type":"boolean","description":"Append one random digit to one random word (for sites that demand a number).","default":false},"count":{"type":"integer","description":"How many passphrases (1 to 50).","default":1,"minimum":1,"maximum":50}}},"example":{"words":5,"separator":"hyphen","count":2}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/password-generator":{"post":{"operationId":"passwordGenerator","summary":"Password Generator","description":"Random passwords from a cryptographic random source.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"length":{"type":"integer","description":"Characters per password (8 to 128).","default":20,"minimum":8,"maximum":128},"count":{"type":"integer","description":"How many (1 to 50).","default":1,"minimum":1,"maximum":50},"lowercase":{"type":"boolean","description":"Include a–z.","default":true},"uppercase":{"type":"boolean","description":"Include A–Z.","default":true},"digits":{"type":"boolean","description":"Include 0–9.","default":true},"symbols":{"type":"boolean","description":"Include symbols.","default":true},"excludeAmbiguous":{"type":"boolean","description":"Leave out look-alike characters such as l, 1, O and 0.","default":false}}},"example":{"length":20,"count":2}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/password-strength-checker":{"post":{"operationId":"passwordStrengthChecker","summary":"Password Strength Checker","description":"Estimate a password's strength like zxcvbn: entropy in bits, a 0–4 score, detected weak patterns (common passwords, sequences, keyboard runs, dates, repeats), estimated crack times and suggestions.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"password":{"type":"string","description":"The password to analyse. Avoid sending passwords that are in real use.","maxLength":1000}},"required":["password"]},"example":{"password":"Summer2024!"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/pem-der-converter":{"post":{"operationId":"pemDerConverter","summary":"PEM to DER Converter","description":"Convert PEM to DER (as Base64 or hex, with an optional ASN.1 structure dump), or wrap Base64/hex DER in PEM armour with a detected or chosen label.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"pem-to-der: one or more PEM blocks. der-to-pem: the DER bytes as Base64 or hex.","maxLength":100000},"direction":{"type":"string","description":"Which way to convert.","default":"pem-to-der","enum":["pem-to-der","der-to-pem"],"maxLength":200000},"label":{"type":"string","description":"der-to-pem: the PEM label, or auto to detect it from the structure.","default":"auto","enum":["auto","CERTIFICATE","CERTIFICATE REQUEST","PUBLIC KEY","PRIVATE KEY","ENCRYPTED PRIVATE KEY","RSA PRIVATE KEY","RSA PUBLIC KEY","EC PRIVATE KEY","X509 CRL","PKCS7"],"maxLength":200000},"tree":{"type":"boolean","description":"pem-to-der: include an ASN.1 structure dump (like openssl asn1parse) of each block.","default":false}},"required":["input"]},"example":{"input":"-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWIxfVoyp0KgIZ3n+X+yyE91ZT/rm\npCkycrF/J+R5JFfYL0+3tnlR9wE9ZyHH1jQhY6vkSOw0wd/aUHga4HN3/g==\n-----END PUBLIC KEY-----\n","direction":"pem-to-der"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/percentage-calculator":{"post":{"operationId":"percentageCalculator","summary":"Percentage Calculator","description":"Percentages: X% of Y, X as a percentage of Y, change from X to Y, increase or decrease X by Y%.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"percentOf, whatPercent, change, increase or decrease.","enum":["percentOf","whatPercent","change","increase","decrease"],"maxLength":200000},"a":{"type":"number","description":"First number."},"b":{"type":"number","description":"Second number."}},"required":["mode","a","b"]},"example":{"mode":"percentOf","a":15,"b":80}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/port-number-lookup":{"post":{"operationId":"portNumberLookup","summary":"Port Number Lookup","description":"Look up TCP and UDP port numbers: the service, what it's for, and security notes for ports that are risky to expose. Search by port, list, range or service name.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"query":{"type":"string","description":"A port (\"5432\"), a list (\"22, 80, 443\"), a range (\"8000-8100\") or a service name or words (\"redis\", \"remote desktop\").","maxLength":200},"protocol":{"type":"string","description":"Only ports used over this protocol.","default":"all","enum":["all","tcp","udp"],"maxLength":200000},"sensitiveOnly":{"type":"boolean","description":"Only ports with a security note (risky to expose to the internet).","default":false}},"required":["query"]},"example":{"query":"6379"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/profit-margin-calculator":{"post":{"operationId":"profitMarginCalculator","summary":"Profit Margin Calculator","description":"Profit, margin (profit ÷ price) and markup (profit ÷ cost) from cost and price, or the selling price for a target margin or markup.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"costPrice: value is the selling price. targetMargin: value is the desired margin %. targetMarkup: value is the desired markup %.","default":"costPrice","enum":["costPrice","targetMargin","targetMarkup"],"maxLength":200000},"cost":{"type":"number","description":"Cost per unit, in currency units.","minimum":0},"value":{"type":"number","description":"Selling price (costPrice), target margin in % below 100 (targetMargin), or markup in % (targetMarkup)."}},"required":["cost","value"]},"example":{"mode":"costPrice","cost":60,"value":100}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/px-to-rem-converter":{"post":{"operationId":"pxToRemConverter","summary":"PX to REM Converter","description":"Convert CSS pixels to rem or rem to pixels for a given root font size (16px by default).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"value":{"type":"number","description":"The length to convert: pixels for pxToRem, rem for remToPx."},"direction":{"type":"string","description":"pxToRem or remToPx.","default":"pxToRem","enum":["pxToRem","remToPx"],"maxLength":200000},"rootFontSize":{"type":"number","description":"Root (html) font size in pixels; browsers default to 16.","default":16,"minimum":0.01,"maximum":1000}},"required":["value"]},"example":{"value":24,"direction":"pxToRem"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/qr-code-generator":{"post":{"operationId":"qrCodeGenerator","summary":"QR Code Generator","description":"Generate a QR code as an SVG image for a URL, text, email, phone number, SMS, vCard contact or map location.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"type":{"type":"string","description":"What the code holds; decides which other fields are used.","default":"url","enum":["url","text","email","phone","sms","vcard","geo"],"maxLength":200000},"url":{"type":"string","description":"type url: the link; https:// is added if missing.","maxLength":2000},"text":{"type":"string","description":"type text: any text.","maxLength":2953},"email":{"type":"string","description":"type email or vcard: email address.","maxLength":254},"subject":{"type":"string","description":"type email: subject line.","maxLength":500},"body":{"type":"string","description":"type email: message body.","maxLength":2000},"phone":{"type":"string","description":"type phone, sms or vcard: phone number, digits with an optional leading +.","maxLength":30},"message":{"type":"string","description":"type sms: message text.","maxLength":1000},"firstName":{"type":"string","description":"type vcard: first name.","maxLength":100},"lastName":{"type":"string","description":"type vcard: last name.","maxLength":100},"org":{"type":"string","description":"type vcard: organisation.","maxLength":200},"website":{"type":"string","description":"type vcard: website URL.","maxLength":2000},"latitude":{"type":"string","description":"type geo: latitude in decimal degrees, e.g. 51.5074.","maxLength":20},"longitude":{"type":"string","description":"type geo: longitude in decimal degrees, e.g. -0.1278.","maxLength":20},"errorCorrection":{"type":"string","description":"Error correction level: L (7%), M (15%), Q (25%) or H (30%). Higher survives damage but holds less data.","default":"M","enum":["L","M","Q","H"],"maxLength":200000},"size":{"type":"integer","description":"SVG width and height in pixels.","default":512,"minimum":64,"maximum":4096},"margin":{"type":"integer","description":"Quiet zone around the code, in modules (4 is the standard).","default":4,"minimum":0,"maximum":16},"foreground":{"type":"string","description":"Dark module colour as #rrggbb.","default":"#000000","maxLength":7},"background":{"type":"string","description":"Background colour as #rrggbb.","default":"#ffffff","maxLength":7}}},"example":{"type":"url","url":"https://pithlab.com","size":256}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/random-name-picker":{"post":{"operationId":"randomNamePicker","summary":"Random Name Picker","description":"Fairly pick random winners from a list of names (no repeats), or shuffle the names into balanced random teams. Uses a cryptographic random source.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"names":{"type":"string","description":"One name per line; blank lines are ignored.","maxLength":200000},"mode":{"type":"string","description":"pick: choose winners. teams-by-count: make exactly n teams. teams-by-size: teams of at most n people.","default":"pick","enum":["pick","teams-by-count","teams-by-size"],"maxLength":200000},"n":{"type":"integer","description":"pick: number of winners. teams-by-count: number of teams. teams-by-size: people per team.","default":1,"minimum":1,"maximum":10000},"dedupe":{"type":"boolean","description":"Remove duplicate names (case-insensitive) first.","default":false}},"required":["names"]},"example":{"names":"Ada\nAlan\nGrace\nLinus\nMargaret\nTim","mode":"pick","n":2}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/random-number-generator":{"post":{"operationId":"randomNumberGenerator","summary":"Random Number Generator","description":"Random integers or decimals in an inclusive range from a cryptographic random source, with or without duplicates (unbiased at any range size), optionally sorted.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"min":{"type":"number","description":"Lowest possible value (inclusive).","default":1,"minimum":-9007199254740991,"maximum":9007199254740991},"max":{"type":"number","description":"Highest possible value (inclusive).","default":100,"minimum":-9007199254740991,"maximum":9007199254740991},"count":{"type":"integer","description":"How many numbers (1 to 1000).","default":1,"minimum":1,"maximum":1000},"mode":{"type":"string","description":"integer or decimal.","default":"integer","enum":["integer","decimal"],"maxLength":200000},"places":{"type":"integer","description":"Decimal places in decimal mode (1 to 10).","default":2,"minimum":1,"maximum":10},"allowDuplicates":{"type":"boolean","description":"Allow the same number more than once. false draws without replacement, like a lottery.","default":true},"sort":{"type":"string","description":"Order of the results.","default":"none","enum":["none","asc","desc"],"maxLength":200000}}},"example":{"min":1,"max":49,"count":6,"allowDuplicates":false,"sort":"asc"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/random-string-generator":{"post":{"operationId":"randomStringGenerator","summary":"Random String Generator","description":"Random strings from chosen character sets (or a custom alphabet), each character drawn uniformly with a cryptographic random source.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"length":{"type":"integer","description":"Characters per string (1 to 1024).","default":16,"minimum":1,"maximum":1024},"count":{"type":"integer","description":"How many strings (1 to 1000); length × count may not exceed 100,000.","default":1,"minimum":1,"maximum":1000},"lowercase":{"type":"boolean","description":"Include a–z.","default":true},"uppercase":{"type":"boolean","description":"Include A–Z.","default":true},"digits":{"type":"boolean","description":"Include 0–9.","default":true},"symbols":{"type":"boolean","description":"Include ASCII punctuation symbols.","default":false},"custom":{"type":"string","description":"Extra characters to add to the pool, e.g. äöü; with every set switched off this is the whole alphabet (e.g. ACGT). Whitespace is ignored.","default":"","maxLength":1000}}},"example":{"length":12,"count":3,"symbols":false}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/random-token-generator":{"post":{"operationId":"randomTokenGenerator","summary":"Random Token Generator","description":"Cryptographically random tokens for API keys, session secrets and webhooks, as hex, Base64, Base64url or Base62, with an optional prefix such as sk_live_.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"bytes":{"type":"integer","description":"Bytes of randomness per token (8 to 256); 32 bytes = 256 bits.","default":32,"minimum":8,"maximum":256},"encoding":{"type":"string","description":"Output alphabet.","default":"hex","enum":["hex","base64","base64url","base62"],"maxLength":200000},"prefix":{"type":"string","description":"Text put before every token, e.g. sk_live_ (no spaces).","default":"","maxLength":64},"count":{"type":"integer","description":"How many tokens (1 to 100).","default":1,"minimum":1,"maximum":100}}},"example":{"bytes":24,"encoding":"base62","prefix":"pk_test_","count":2}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/ratio-calculator":{"post":{"operationId":"ratioCalculator","summary":"Ratio Calculator","description":"Simplify a ratio (4:6 → 2:3, with percentages), solve a proportion A:B = C:D for the missing value, or split an amount in a ratio.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"simplify: reduce ratio. solve: find the blank in A:B = C:D. split: divide total in ratio.","default":"simplify","enum":["simplify","solve","split"],"maxLength":200000},"ratio":{"type":"string","description":"simplify and split: the ratio with 2 to 10 non-negative terms, e.g. \"4:6\", \"2:3:5\", \"1.5 to 2\".","maxLength":400},"total":{"type":"number","description":"split: the amount to divide."},"a":{"type":"string","description":"solve: A in A:B = C:D. Exactly one of a, b, c, d must be \"?\" (or omitted).","maxLength":40},"b":{"type":"string","description":"solve: B in A:B = C:D.","maxLength":40},"c":{"type":"string","description":"solve: C in A:B = C:D.","maxLength":40},"d":{"type":"string","description":"solve: D in A:B = C:D.","maxLength":40}}},"example":{"mode":"split","ratio":"2:3:5","total":1000}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/readability-checker":{"post":{"operationId":"readabilityChecker","summary":"Readability Checker","description":"Readability scores for English text (Flesch reading ease, Flesch–Kincaid grade, Gunning fog, SMOG, Coleman–Liau, ARI) plus counts of long sentences, passive voice, adverbs and complex words.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The English text to analyse.","maxLength":200000},"segments":{"type":"boolean","description":"Also return each sentence with flags (long, passive, adverb, complex) for highlighting.","default":false}},"required":["input"]},"example":{"input":"The cat sat on the mat. It was a sunny day, and the birds were singing loudly in the tall trees."}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/recipe-builder":{"post":{"operationId":"recipeBuilder","summary":"Recipe Builder","description":"Run text through a chain of PithLab operations in order (decode, format, convert, change case, sort, dedupe, hash…) and return each step's output.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The starting text.","maxLength":200000},"steps":{"type":"string","description":"Comma-separated steps, each an operation id with an optional \":option\" (the first choice is the default), e.g. \"base64-decode,json-format,hash:SHA-256\". Up to 20 steps. Operations: base64-encode, base64-decode, url-encode:<component|full>, url-decode, html-encode, html-decode, json-format:<2|4|tab>, json-minify, json-to-yaml, yaml-to-json, json-to-csv, csv-to-json, case:<upper|lower|title|sentence|camel|pascal|snake|kebab|constant|dot>, reverse:<characters|words|lines>, sort-lines:<az|za>, dedupe-lines, remove-empty-lines, clean-whitespace, slugify, to-bytes:<hex|binary>, from-bytes:<hex|binary>, hash:<SHA-256|SHA-512|SHA-384|SHA-1|MD5>.","maxLength":2000}},"required":["input","steps"]},"example":{"input":"eyJiIjoxLCJhIjoyfQ==","steps":"base64-decode,json-format,hash:SHA-256"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/redirect-checker":{"post":{"operationId":"redirectChecker","summary":"Redirect Checker","description":"Follow a public URL's redirect chain hop by hop (up to 10 hops), returning each status, Location and headers, the final URL, and whether it loops.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","description":"A public http(s) URL; https:// is added if missing. Ports 80, 443, 8080 and 8443 only.","maxLength":2048}},"required":["url"]},"example":{"url":"http://example.com"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/regex-tester":{"post":{"operationId":"regexTester","summary":"Regex Tester","description":"Run a JavaScript regular expression against text: every match with its position and capture groups, an optional replacement result, and a plain-English explanation of the pattern. Runs are time-limited.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"pattern":{"type":"string","description":"The pattern without slashes, e.g. (\\d{4})-(\\d{2})-(\\d{2}). JavaScript (ECMAScript) syntax.","maxLength":2000},"flags":{"type":"string","description":"Flags from \"dgimsuvy\", each at most once; g lists every match, without g only the first.","default":"g","maxLength":8},"text":{"type":"string","description":"The text to search (up to 50,000 characters).","default":"","maxLength":50000},"replacement":{"type":"string","description":"Optional replacement string ($1, $<name>, $& supported). When given, the replaced text is returned as replaced.","maxLength":10000},"maxMatches":{"type":"integer","description":"Most matches to return (1 to 1000).","default":100,"minimum":1,"maximum":1000},"explain":{"type":"boolean","description":"Include a plain-English explanation of each part of the pattern.","default":true}},"required":["pattern"]},"example":{"pattern":"(?<year>\\d{4})-(?<month>\\d{2})","flags":"g","text":"Released 2024-03, updated 2025-11.","replacement":"$<month>/$<year>"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/remove-duplicate-lines":{"post":{"operationId":"removeDuplicateLines","summary":"Remove Duplicate Lines","description":"Remove repeated lines from text, keeping the first occurrence of each and the original order.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text, one item per line.","maxLength":200000},"caseInsensitive":{"type":"boolean","description":"Treat \"Apple\" and \"apple\" as the same line.","default":false},"trim":{"type":"boolean","description":"Ignore leading and trailing whitespace when comparing lines.","default":true},"keepBlankLines":{"type":"boolean","description":"Never remove blank lines, so paragraph spacing survives.","default":false}},"required":["input"]},"example":{"input":"apple\nbanana\nApple\napple\ncherry","caseInsensitive":true}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/remove-empty-lines":{"post":{"operationId":"removeEmptyLines","summary":"Remove Empty Lines","description":"Remove blank lines from text, or collapse runs of blank lines into one.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text.","maxLength":200000},"whitespaceOnly":{"type":"boolean","description":"Count lines containing only spaces or tabs as empty.","default":true},"collapse":{"type":"boolean","description":"Keep a single blank line where several were (and drop blank lines at the start and end) instead of removing them all.","default":false}},"required":["input"]},"example":{"input":"First line\n\n\nSecond line\n   \nThird line"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/rent-vs-buy-calculator":{"post":{"operationId":"rentVsBuyCalculator","summary":"Rent vs Buy Calculator","description":"Compare buying a home with renting and investing the difference, year by year: net worth of each, the break-even year and who is ahead at the end. Ignores taxes on gains, tax relief and PMI.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"price":{"type":"number","description":"Home price.","minimum":0},"downPayment":{"type":"number","description":"Down payment (at most the price).","default":0,"minimum":0},"rate":{"type":"number","description":"Mortgage interest rate in percent (0 to 30).","minimum":0,"maximum":30},"termYears":{"type":"integer","description":"Mortgage term in whole years (1 to 50).","default":30,"minimum":1,"maximum":50},"taxPercent":{"type":"number","description":"Annual property tax as a % of the home's value (0 to 10).","default":0,"minimum":0,"maximum":10},"maintenancePercent":{"type":"number","description":"Annual maintenance as a % of the home's value (0 to 20).","default":1,"minimum":0,"maximum":20},"insurance":{"type":"number","description":"Annual home insurance amount.","default":0,"minimum":0},"appreciation":{"type":"number","description":"Annual home price growth in percent (−50 to 50).","default":3,"minimum":-50,"maximum":50},"closingPercent":{"type":"number","description":"Buying costs paid up front, as a % of the price (0 to 50).","default":3,"minimum":0,"maximum":50},"sellingPercent":{"type":"number","description":"Selling costs, as a % of the sale price, deducted from the buyer's equity (0 to 50).","default":6,"minimum":0,"maximum":50},"rent":{"type":"number","description":"Monthly rent for an equivalent home.","minimum":0},"rentIncrease":{"type":"number","description":"Annual rent increase in percent (−50 to 50).","default":3,"minimum":-50,"maximum":50},"investReturn":{"type":"number","description":"Annual return on invested savings in percent (−50 to 50).","default":5,"minimum":-50,"maximum":50},"years":{"type":"integer","description":"Years to compare (1 to 50).","default":10,"minimum":1,"maximum":50},"breakdown":{"type":"boolean","description":"Include the year-by-year rows (costs, home value, loan balance, both net worths).","default":false}},"required":["price","rate","rent"]},"example":{"price":400000,"downPayment":80000,"rate":6,"termYears":30,"taxPercent":1,"insurance":1200,"rent":1800,"years":10}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/retirement-calculator":{"post":{"operationId":"retirementCalculator","summary":"Retirement Calculator","description":"Project retirement savings from current savings, monthly contributions (optionally rising each year) and an expected return, in nominal and today's money, with the monthly income from a safe-withdrawal rate.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"currentAge":{"type":"integer","description":"Current age in whole years.","minimum":0,"maximum":120},"retirementAge":{"type":"integer","description":"Retirement age in whole years (later than currentAge).","minimum":1,"maximum":120},"savings":{"type":"number","description":"Current retirement savings.","default":0,"minimum":0},"monthly":{"type":"number","description":"Monthly contribution.","default":0,"minimum":0},"returnRate":{"type":"number","description":"Expected annual return in percent (−50 to 50).","minimum":-50,"maximum":50},"increase":{"type":"number","description":"Yearly raise in the monthly contribution, in percent (0 to 50).","default":0,"minimum":0,"maximum":50},"inflation":{"type":"number","description":"Expected annual inflation in percent (−10 to 50), for today's-money figures.","default":0,"minimum":-10,"maximum":50},"withdrawal":{"type":"number","description":"Safe-withdrawal rate, % of the balance per year (above 0, up to 20).","default":4,"minimum":0.01,"maximum":20},"breakdown":{"type":"boolean","description":"Include the year-by-year rows (age, contributions, growth, balance, real balance).","default":false}},"required":["currentAge","retirementAge","returnRate"]},"example":{"currentAge":30,"retirementAge":65,"savings":20000,"monthly":500,"returnRate":6,"increase":2,"inflation":2.5,"withdrawal":4}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/reverse-dns-lookup":{"post":{"operationId":"reverseDnsLookup","summary":"Reverse DNS Lookup","description":"PTR (reverse DNS) names for a public IPv4 or IPv6 address, with a forward-confirmed (FCrDNS) check.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"ip":{"type":"string","description":"A public IPv4 or IPv6 address, such as 8.8.8.8.","maxLength":100}},"required":["ip"]},"example":{"ip":"8.8.8.8"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/reverse-text":{"post":{"operationId":"reverseText","summary":"Reverse Text","description":"Reverse text by characters (keeping emoji and accents intact), by word order, or by line order.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text to reverse.","maxLength":200000},"mode":{"type":"string","description":"characters, words (reverse word order on each line) or lines (reverse line order).","default":"characters","enum":["characters","words","lines"],"maxLength":200000},"perLine":{"type":"boolean","description":"In characters mode, reverse each line on its own instead of the whole text.","default":false}},"required":["input"]},"example":{"input":"Hello, world!","mode":"characters"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/robots-txt-generator":{"post":{"operationId":"robotsTxtGenerator","summary":"Robots.txt Generator","description":"Generate a robots.txt (default rules, per-crawler groups, AI crawler blocking, sitemaps), or test whether a crawler may fetch a URL under a robots.txt.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"generate: build a robots.txt. test: check `url` for `userAgent` against `robotsTxt` (RFC 9309 and Google matching).","default":"generate","enum":["generate","test"],"maxLength":200000},"defaultPolicy":{"type":"string","description":"generate: allow or disallow everything for all crawlers (User-agent: *) before the path rules.","default":"allow","enum":["allow","disallow"],"maxLength":200000},"disallow":{"type":"string","description":"generate: paths to disallow for all crawlers, one per line, each starting with / or *.","maxLength":20000},"allow":{"type":"string","description":"generate: paths to allow for all crawlers, one per line.","maxLength":20000},"crawlDelay":{"type":"number","description":"generate: Crawl-delay in seconds for all crawlers (ignored by Google).","minimum":0,"maximum":86400},"blockAiCrawlers":{"type":"boolean","description":"generate: block all known AI crawlers (GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, Claude-User, Claude-SearchBot, anthropic-ai, Google-Extended, Applebot-Extended, CCBot, PerplexityBot, Perplexity-User, Bytespider, meta-externalagent, FacebookBot, Amazonbot, cohere-ai, Diffbot, omgili, Timpibot).","default":false},"groups":{"type":"string","description":"generate: extra per-crawler groups as a JSON array, e.g. [{\"userAgents\":[\"Googlebot-Image\"],\"disallow\":[\"/private/\"],\"allow\":[],\"crawlDelay\":\"\"}].","maxLength":50000},"sitemaps":{"type":"string","description":"generate: absolute sitemap URLs, one per line.","maxLength":20000},"robotsTxt":{"type":"string","description":"test: the robots.txt content to test against.","maxLength":200000},"userAgent":{"type":"string","description":"test: crawler user-agent or product token, e.g. Googlebot.","maxLength":500},"url":{"type":"string","description":"test: the URL or path to check, e.g. https://example.com/admin/login.","maxLength":2048}}},"example":{"mode":"generate","disallow":"/admin/\n/cart","sitemaps":"https://example.com/sitemap.xml"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/robots-txt-tester":{"post":{"operationId":"robotsTxtTester","summary":"Robots.txt Tester","description":"Test whether a URL path is allowed for a crawler under a site's robots.txt (fetched, or passed in), using Google's longest-match rules.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"site":{"type":"string","description":"Site whose /robots.txt to fetch, such as example.com. Leave out to test robotsTxt instead.","maxLength":2048},"robotsTxt":{"type":"string","description":"robots.txt content to test instead of fetching one.","maxLength":512000},"path":{"type":"string","description":"The URL or path to test.","default":"/","maxLength":2048},"userAgent":{"type":"string","description":"Crawler user-agent token, such as Googlebot, Bingbot, GPTBot, ClaudeBot or *.","default":"Googlebot","maxLength":100}}},"example":{"robotsTxt":"User-agent: *\nDisallow: /admin/\nAllow: /admin/help","path":"/admin/help","userAgent":"Googlebot"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/roi-calculator":{"post":{"operationId":"roiCalculator","summary":"ROI Calculator","description":"Return on investment: gain or loss and ROI in percent, plus the annualised return (CAGR) when a holding period is given.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"initial":{"type":"number","description":"Amount invested (greater than 0).","minimum":0},"final":{"type":"number","description":"Final value of the investment.","minimum":0},"duration":{"type":"number","description":"Optional holding period, in durationUnit, for the annualised return.","minimum":0},"durationUnit":{"type":"string","description":"years, months or days (days use 365.25 a year).","default":"years","enum":["years","months","days"],"maxLength":200000}},"required":["initial","final"]},"example":{"initial":5000,"final":7200,"duration":3,"durationUnit":"years"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/roman-numeral-converter":{"post":{"operationId":"romanNumeralConverter","summary":"Roman Numeral Converter","description":"Convert a whole number to Roman numerals (1 to 3999, or up to 3,999,999 with vinculum overlines) or Roman numerals to a number. The direction is detected from the input.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"A whole number such as 2026, or Roman numerals such as MMXXVI.","maxLength":100},"vinculum":{"type":"boolean","description":"Allow numbers above 3999 using overlined numerals (×1000).","default":false}},"required":["input"]},"example":{"input":"2026"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/salary-calculator":{"post":{"operationId":"salaryCalculator","summary":"Salary to Hourly Calculator","description":"Convert pay between hourly, daily, weekly, biweekly, semi-monthly, monthly and annual figures for a given work schedule (gross, before tax).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"amount":{"type":"number","description":"The pay amount, per period.","minimum":0},"period":{"type":"string","description":"What the amount is per.","default":"annual","enum":["hourly","daily","weekly","biweekly","semimonthly","monthly","annual"],"maxLength":200000},"hoursPerWeek":{"type":"number","description":"Hours worked per week (above 0, up to 168).","default":40,"minimum":0.01,"maximum":168},"daysPerWeek":{"type":"number","description":"Days worked per week (1 to 7).","default":5,"minimum":0.01,"maximum":7},"weeksPerYear":{"type":"number","description":"Paid weeks per year (1 to 52.18).","default":52,"minimum":0.01,"maximum":52.18},"unpaidDays":{"type":"number","description":"Unpaid days off per year on top of the weeks above.","default":0,"minimum":0,"maximum":366}},"required":["amount"]},"example":{"amount":52000,"period":"annual"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/savings-goal-calculator":{"post":{"operationId":"savingsGoalCalculator","summary":"Savings Goal Calculator","description":"Savings goal planner: the monthly deposit needed to reach a target by a deadline, or how long a given monthly deposit takes, with monthly interest.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"deadline: find the monthly deposit to reach target in `months`. deposit: find how many months `deposit` a month takes.","default":"deadline","enum":["deadline","deposit"],"maxLength":200000},"target":{"type":"number","description":"Savings goal (greater than 0).","minimum":0},"current":{"type":"number","description":"Amount already saved.","default":0,"minimum":0},"rate":{"type":"number","description":"Annual interest rate in percent (0 to 100), compounded monthly.","default":0,"minimum":0,"maximum":100},"months":{"type":"integer","description":"deadline mode: months until the goal date (1 to 1200).","minimum":1,"maximum":1200},"deposit":{"type":"number","description":"deposit mode: amount saved at the end of each month.","minimum":0},"breakdown":{"type":"boolean","description":"Include the year-by-year rows (deposits, interest, balance).","default":false}},"required":["target"]},"example":{"mode":"deadline","target":10000,"current":1000,"rate":4,"months":24}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/schema-markup-generator":{"post":{"operationId":"schemaMarkupGenerator","summary":"Schema Markup Generator","description":"Generate schema.org JSON-LD structured data (Article, FAQ, HowTo, Product, LocalBusiness, Organization, Person, Event, Breadcrumbs, WebSite, Recipe), checked against Google's required and recommended properties.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"type":{"type":"string","description":"The schema.org type to build.","enum":["Article","FAQPage","HowTo","Product","LocalBusiness","Organization","Person","Event","BreadcrumbList","WebSite","Recipe"],"maxLength":200000},"values":{"type":"string","description":"A JSON object of string values keyed by property path. Keys per type: Article: @type, headline, image, datePublished, dateModified, author.name, author.url, publisher.name, publisher.logo. FAQPage: mainEntity. HowTo: name, description, image, totalTime, estimatedCost.value, estimatedCost.currency, supply, tool, step. Product: name, image, description, brand, sku, gtin, offers.price, offers.priceCurrency, offers.availability, offers.itemCondition, offers.url, offers.priceValidUntil, aggregateRating.ratingValue, aggregateRating.reviewCount, aggregateRating.bestRating. LocalBusiness: @type, name, address.streetAddress, address.addressLocality, address.addressRegion, address.postalCode, address.addressCountry, url, telephone, image, priceRange, geo.latitude, geo.longitude, openingHoursSpecification, servesCuisine. Organization: name, url, logo, description, email, telephone, sameAs, address.streetAddress, address.addressLocality, address.addressRegion, address.postalCode, address.addressCountry. Person: name, url, image, jobTitle, worksFor.name, sameAs. Event: name, startDate, endDate, eventAttendanceMode, eventStatus, location.name, location.address.streetAddress, location.address.addressLocality, location.address.addressRegion, location.address.postalCode, location.address.addressCountry, location.url, description, image, offers.price, offers.priceCurrency, offers.url, offers.availability, offers.validFrom, organizer.name, organizer.url, performer.name. BreadcrumbList: itemListElement. WebSite: name, alternateName, url, search. Recipe: name, image, description, author.name, datePublished, prepTime, cookTime, totalTime, recipeYield, recipeCategory, recipeCuisine, keywords, nutrition.calories, recipeIngredient, recipeInstructions, aggregateRating.ratingValue, aggregateRating.reviewCount, aggregateRating.bestRating. Lists (image, supply, tool, recipeIngredient…) are one item per line; FAQ mainEntity is \"Question | Answer\" per line; steps are \"Name | Text\" or plain text per line; breadcrumbs are \"Name | URL\" per line; dates are ISO 8601; durations are ISO 8601 such as PT20M.","maxLength":200000}},"required":["type","values"]},"example":{"type":"FAQPage","values":"{\"mainEntity\":\"How long does delivery take? | Two to three working days in the UK.\\nCan I return an item? | Yes, within 30 days of delivery.\"}"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/scientific-calculator":{"post":{"operationId":"scientificCalculator","summary":"Scientific Calculator","description":"Evaluate a maths expression safely (no eval): + − × ÷ ^, brackets, factorial (!), percent, trig and inverse trig, hyperbolic, logs, roots, exp, abs, rounding, and the constants pi, e and tau.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"expression":{"type":"string","description":"The expression, up to 1,000 characters, e.g. \"2^10 + sqrt(144) * sin(30)\". Functions: sin cos tan asin acos atan sinh cosh tanh sqrt cbrt ln log (base 10) log2 exp abs floor ceil round. Implicit multiplication works (2pi, 3(4+5)). x! is factorial (up to 170!).","maxLength":1000},"angle":{"type":"string","description":"Angle unit for trig functions: deg (degrees) or rad (radians).","default":"deg","enum":["deg","rad"],"maxLength":200000},"ans":{"type":"number","description":"Value to use for `ans` (the previous result) in the expression.","default":0}},"required":["expression"]},"example":{"expression":"2^10 + sqrt(144) * sin(30)","angle":"deg"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/secret-scanner":{"post":{"operationId":"secretScanner","summary":"Secret Scanner","description":"Scan text (code, config, logs, .env files) for leaked secrets such as AWS keys, GitHub and Stripe tokens, private keys, JWTs and passwords in URLs. Findings carry line, column, severity and a masked preview, never the raw secret.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text to scan.","maxLength":200000},"includeLow":{"type":"boolean","description":"Include low-severity findings such as publishable keys and account IDs.","default":true},"masked":{"type":"boolean","description":"Also return the whole input with every secret replaced by its masked preview.","default":false}},"required":["input"]},"example":{"input":"AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE\nDATABASE_URL=postgres://app:Xk9#mQ2vLp7w@db.internal:5432/app\nDEBUG=false"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/security-headers-checker":{"post":{"operationId":"securityHeadersChecker","summary":"Security Headers Checker","description":"Grade pasted HTTP response headers (A+ to F) for security: CSP, HSTS, framing, nosniff, Referrer-Policy, Permissions-Policy, cross-origin policies, cookies and information leaks. Nothing is fetched.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"headers":{"type":"string","description":"Raw response headers, e.g. the output of curl -I https://example.com or a copy from browser devtools. If several responses are pasted (curl -IL), the last is graded.","maxLength":200000},"server":{"type":"string","description":"Also return a recommended header config for this server: nginx, apache, or none.","default":"none","enum":["none","nginx","apache"],"maxLength":200000}},"required":["headers"]},"example":{"headers":"HTTP/2 200\ncontent-type: text/html; charset=utf-8\nstrict-transport-security: max-age=31536000; includeSubDomains\nx-content-type-options: nosniff\nx-frame-options: SAMEORIGIN\nreferrer-policy: strict-origin-when-cross-origin\nserver: nginx/1.25.3"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/security-txt-checker":{"post":{"operationId":"securityTxtChecker","summary":"Security.txt Checker","description":"Find a site's security.txt (/.well-known/security.txt, then /security.txt) and validate it against RFC 9116, or validate content you pass in.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"site":{"type":"string","description":"Site to check, such as example.com. Leave out to validate content instead.","maxLength":2048},"content":{"type":"string","description":"security.txt content to validate instead of fetching one.","maxLength":65536}}},"example":{"content":"Contact: mailto:security@example.com\nExpires: 2030-01-01T00:00:00.000Z"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/sitemap-checker":{"post":{"operationId":"sitemapChecker","summary":"Sitemap Checker","description":"Fetch an XML sitemap or sitemap index (up to 5 MB each, 50 child sitemaps), count URLs and report invalid XML, lastmod, http, off-host and duplicate URLs.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","description":"The sitemap URL, or a site to try /sitemap.xml.","maxLength":2048}},"required":["url"]},"example":{"url":"https://www.sitemaps.org/sitemap.xml"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/sitemap-generator":{"post":{"operationId":"sitemapGenerator","summary":"XML Sitemap Generator","description":"Generate sitemap.xml from a list of URLs (with optional lastmod, changefreq and priority), validated against the sitemaps.org protocol.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"urls":{"type":"string","description":"One absolute URL per line. A line may add a lastmod date (W3C format, e.g. 2026-01-31), a changefreq and a priority (0.0 to 1.0), in any order, separated by commas or spaces, e.g. \"https://example.com/, 2026-01-01, weekly, 0.8\".","maxLength":200000},"lastmod":{"type":"string","description":"Default lastmod for lines without one, e.g. 2026-10-20.","maxLength":40},"changefreq":{"type":"string","description":"Default changefreq for lines without one.","enum":["always","hourly","daily","weekly","monthly","yearly","never"],"maxLength":200000},"priority":{"type":"number","description":"Default priority for lines without one.","minimum":0,"maximum":1}},"required":["urls"]},"example":{"urls":"https://example.com/, 2026-10-01, daily, 1.0\nhttps://example.com/about\nhttps://example.com/blog/first-post","changefreq":"monthly"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/sleep-calculator":{"post":{"operationId":"sleepCalculator","summary":"Sleep Calculator","description":"Bedtimes for a wake-up time, or wake-up times for a bedtime, timed to whole 90-minute sleep cycles (6, 5, 4 or 3 cycles).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"wake: time is when you want to wake up; returns bedtimes. bed: time is when you go to bed; returns wake-up times.","enum":["wake","bed"],"maxLength":200000},"time":{"type":"string","description":"Time of day as \"HH:MM\" (24-hour) or \"h:mm am/pm\", e.g. \"07:00\" or \"6:30 AM\".","maxLength":12},"fallAsleepMinutes":{"type":"integer","description":"Minutes it takes to fall asleep.","default":15,"minimum":0,"maximum":120},"clock":{"type":"string","description":"Output time format.","default":"24h","enum":["24h","12h"],"maxLength":200000}},"required":["mode","time"]},"example":{"mode":"wake","time":"07:00"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/slug-generator":{"post":{"operationId":"slugGenerator","summary":"Slug Generator","description":"Turn a title into a URL slug.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The title or text.","maxLength":200000}},"required":["input"]},"example":{"input":"Crème Brûlée: 10 Tips & Tricks!"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/sort-lines":{"post":{"operationId":"sortLines","summary":"Sort Lines","description":"Sort lines alphabetically, naturally (1, 2, 10), by length, or shuffle them, with options to reverse, de-duplicate and drop blank lines.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text, one item per line.","maxLength":200000},"mode":{"type":"string","description":"alphabetical, natural (numbers in order), length, or shuffle (random order, different every call).","default":"alphabetical","enum":["alphabetical","natural","length","shuffle"],"maxLength":200000},"reverse":{"type":"boolean","description":"Reverse the sorted order (Z–A, longest first). Ignored when shuffling.","default":false},"unique":{"type":"boolean","description":"Drop repeated lines, keeping the first.","default":false},"caseSensitive":{"type":"boolean","description":"Distinguish upper and lower case when comparing and de-duplicating.","default":false},"removeBlank":{"type":"boolean","description":"Drop empty and whitespace-only lines.","default":false},"locale":{"type":"string","description":"BCP 47 locale for alphabetical comparison, e.g. en, de, sv.","default":"en","maxLength":35}},"required":["input"]},"example":{"input":"file10.txt\nfile2.txt\nfile1.txt","mode":"natural"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/sql-formatter":{"post":{"operationId":"sqlFormatter","summary":"SQL Formatter","description":"Format or minify SQL.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The SQL.","maxLength":200000},"mode":{"type":"string","description":"format or minify.","default":"format","enum":["format","minify"],"maxLength":200000}},"required":["input"]},"example":{"input":"select id, name from users where active = true order by name"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/ssl-checker":{"post":{"operationId":"sslChecker","summary":"SSL Certificate Checker","description":"Connect to a public host over TLS and report whether its certificate is trusted, the protocol and cipher, and the chain with expiry dates and days left.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"host":{"type":"string","description":"A hostname such as example.com, optionally with :443 or :8443, or a full https:// URL.","maxLength":2048}},"required":["host"]},"example":{"host":"example.com"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/string-escaper":{"post":{"operationId":"stringEscaper","summary":"String Escaper","description":"Escape or unescape a string for JSON, JavaScript, Java/C#, Python, regular expressions, CSV, SQL, POSIX shell or HTML attributes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The raw string to escape, or the escaped string to unescape.","maxLength":200000},"format":{"type":"string","description":"Target syntax.","enum":["json","javascript","java","python","regex","csv","sql","shell","html"],"maxLength":200000},"mode":{"type":"string","description":"escape or unescape.","default":"escape","enum":["escape","unescape"],"maxLength":200000},"quote":{"type":"boolean","description":"When escaping, wrap the result in the format's usual quotes (json, javascript, java, python, sql, html).","default":false},"asciiOnly":{"type":"boolean","description":"When escaping, write every non-ASCII character as \\uXXXX (json, javascript, java, python).","default":false}},"required":["input","format"]},"example":{"input":"She said \"hi\"\nthen left.","format":"json","quote":true}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/subnet-calculator":{"post":{"operationId":"subnetCalculator","summary":"Subnet Calculator","description":"Network, broadcast, mask, host range and host count for an IPv4 CIDR.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"cidr":{"type":"string","description":"An IPv4 address with prefix, e.g. 192.168.1.10/24.","maxLength":200000}},"required":["cidr"]},"example":{"cidr":"10.0.5.70/26"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/subscription-cost-calculator":{"post":{"operationId":"subscriptionCostCalculator","summary":"Subscription Cost Calculator","description":"Total monthly and yearly cost of a list of subscriptions billed weekly, monthly, quarterly or yearly, with cost per use and the saving from cancelling some.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"subscriptions":{"type":"string","description":"JSON array of up to 100 subscriptions, each {\"name\": string, \"price\": number, \"period\": \"weekly\" | \"monthly\" | \"quarterly\" | \"yearly\" (default monthly), \"uses\": optional uses per month, \"cancel\": optional boolean to count towards savings}.","maxLength":50000}},"required":["subscriptions"]},"example":{"subscriptions":"[{\"name\":\"Video streaming\",\"price\":15.49,\"period\":\"monthly\",\"uses\":12},{\"name\":\"Gym\",\"price\":40,\"period\":\"monthly\",\"uses\":4,\"cancel\":true},{\"name\":\"Office software\",\"price\":99.99,\"period\":\"yearly\"}]"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/tdee-calculator":{"post":{"operationId":"tdeeCalculator","summary":"Calorie and TDEE Calculator","description":"Basal metabolic rate (Mifflin–St Jeor) and total daily energy expenditure for an adult, with calorie targets to lose, maintain or gain weight and macro grams.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"sex":{"type":"string","description":"male or female.","enum":["male","female"],"maxLength":200000},"age":{"type":"integer","description":"Age in whole years (18 to 100).","minimum":18,"maximum":100},"units":{"type":"string","description":"metric: kg and cm. imperial: lb, and height in feet plus inches.","default":"metric","enum":["metric","imperial"],"maxLength":200000},"weight":{"type":"number","description":"Weight in kg (metric) or lb (imperial); 30 to 300 kg.","minimum":0},"height":{"type":"number","description":"Height in cm (metric, 100 to 250) or whole feet (imperial).","minimum":0},"heightInches":{"type":"number","description":"Imperial only: inches on top of the feet.","minimum":0,"maximum":120},"activity":{"type":"string","description":"Activity level: sedentary = Sedentary (little or no exercise) (×1.2); light = Lightly active (exercise 1–3 days a week) (×1.375); moderate = Moderately active (exercise 3–5 days a week) (×1.55); very = Very active (hard exercise 6–7 days a week) (×1.725); extra = Extra active (physical job or training twice a day) (×1.9).","default":"moderate","enum":["sedentary","light","moderate","very","extra"],"maxLength":200000},"macroSplit":{"type":"string","description":"Macro split for the maintenance calories: balanced = Balanced (30% protein, 30% fat, 40% carbs); lower-carb = Lower carb (35% protein, 40% fat, 25% carbs); higher-carb = Higher carb (25% protein, 20% fat, 55% carbs).","default":"balanced","enum":["balanced","lower-carb","higher-carb"],"maxLength":200000}},"required":["sex","age","weight","height"]},"example":{"sex":"female","age":30,"units":"metric","weight":65,"height":168,"activity":"moderate"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/text-cleaner":{"post":{"operationId":"textCleaner","summary":"Text Cleaner","description":"Clean pasted text: strip HTML to plain text, straighten smart quotes, plain dashes and ellipses, remove emoji or non-ASCII characters, Unicode-normalise and fix line endings.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text to clean.","maxLength":200000},"stripHtml":{"type":"boolean","description":"Remove HTML tags, comments, scripts and styles, and decode common entities (regex-based; nothing is rendered).","default":false},"smartQuotes":{"type":"boolean","description":"Curly quotes and primes to straight ' and \".","default":true},"dashes":{"type":"boolean","description":"En dashes, em dashes, minus signs and other dashes to a plain hyphen.","default":false},"ellipsis":{"type":"boolean","description":"The single ellipsis character … to three full stops.","default":true},"removeEmoji":{"type":"boolean","description":"Remove emoji.","default":false},"removeNonAscii":{"type":"boolean","description":"Remove characters outside ASCII; accented letters become their plain forms first.","default":false},"normalize":{"type":"string","description":"Unicode normalisation form.","default":"none","enum":["none","NFC","NFKC"],"maxLength":200000},"lineEndings":{"type":"string","description":"keep, lf (Unix \\n) or crlf (Windows \\r\\n).","default":"keep","enum":["keep","lf","crlf"],"maxLength":200000}},"required":["input"]},"example":{"input":"<p>“Smart” quotes — and more…</p>","stripHtml":true,"dashes":true}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/text-diff":{"post":{"operationId":"textDiff","summary":"Text Diff Checker","description":"Compare two texts line by line (Myers diff) and return added, removed and unchanged lines, plus a unified-style text diff.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"original":{"type":"string","description":"The original (old) text.","maxLength":500000},"changed":{"type":"string","description":"The changed (new) text.","maxLength":500000},"ignoreCase":{"type":"boolean","description":"Treat upper and lower case as the same.","default":false},"ignoreWhitespace":{"type":"boolean","description":"Ignore leading/trailing whitespace and treat runs of whitespace as one space.","default":false},"ops":{"type":"boolean","description":"Also return the list of operations ({ type: equal|add|remove, text, oldLine, newLine }).","default":false}},"required":["original","changed"]},"example":{"original":"apples\nbananas\ncherries","changed":"apples\nblueberries\ncherries\ndates"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/text-encryption":{"post":{"operationId":"textEncryption","summary":"Text Encrypt and Decrypt","description":"Encrypt text with a password (AES-256-GCM, key from PBKDF2-HMAC-SHA256 with 600,000 iterations, random salt and IV) as one Base64 string, or decrypt such a string. Compatible with the PithLab Text Encryption tool.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"Plain text to encrypt, or the Base64 output of a previous encryption to decrypt.","maxLength":100000},"password":{"type":"string","description":"The password. Use a long, unique one; it is never stored.","maxLength":1000},"mode":{"type":"string","description":"encrypt or decrypt.","enum":["encrypt","decrypt"],"maxLength":200000}},"required":["input","password","mode"]},"example":{"input":"Meet at noon.","password":"correct horse battery staple","mode":"encrypt"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/text-to-binary":{"post":{"operationId":"textToBinary","summary":"Text to Binary","description":"Convert text to its UTF-8 bytes as space-separated binary (8-bit) or hex groups, or decode binary/hex bytes back to text.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"Text to encode, or binary/hex bytes to decode (spaces optional).","maxLength":200000},"direction":{"type":"string","description":"encode (text → bytes) or decode (bytes → text).","default":"encode","enum":["encode","decode"],"maxLength":200000},"format":{"type":"string","description":"binary (01001000) or hex (48).","default":"binary","enum":["binary","hex"],"maxLength":200000},"uppercase":{"type":"boolean","description":"Uppercase hex digits when encoding to hex.","default":false}},"required":["input"]},"example":{"input":"Hi!","direction":"encode","format":"binary"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/time-duration-calculator":{"post":{"operationId":"timeDurationCalculator","summary":"Time Duration Calculator","description":"Hours worked between two clock times minus a break (crossing midnight if needed), or the total of a list of durations, as h/m, H:MM and decimal hours.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"between: time from start to end minus break. sum: add up a list of durations.","default":"between","enum":["between","sum"],"maxLength":200000},"start":{"type":"string","description":"between: start time, e.g. \"09:15\" or \"9:15 am\".","maxLength":12},"end":{"type":"string","description":"between: end time; if earlier than start it is taken as the next day, e.g. \"17:45\".","maxLength":12},"break":{"type":"string","description":"between: optional unpaid break, e.g. \"30m\", \"0:30\" or \"1h 15m\".","maxLength":40},"durations":{"type":"string","description":"sum: one duration per line, e.g. \"7:30\", \"1h 15m\", \"45 min\", \"7.5h\"; prefix a line with \"-\" to subtract. A bare number is rejected (hours or minutes is ambiguous).","maxLength":50000}}},"example":{"mode":"between","start":"09:15","end":"17:45","break":"30m"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/time-zone-converter":{"post":{"operationId":"timeZoneConverter","summary":"Time Zone Converter","description":"Convert a wall-clock date and time in one IANA time zone to other zones, DST-aware, with offsets and day shifts.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"dateTime":{"type":"string","description":"Local date and time in the source zone: \"YYYY-MM-DDTHH:MM\" or \"YYYY-MM-DD HH:MM[:SS]\", e.g. \"2026-10-20T09:00\".","maxLength":30},"from":{"type":"string","description":"Source IANA time zone, e.g. America/New_York, or UTC.","maxLength":64},"to":{"type":"string","description":"Comma-separated target IANA time zones (up to 24), e.g. \"Europe/London,Asia/Tokyo\".","maxLength":2000}},"required":["dateTime","from","to"]},"example":{"dateTime":"2026-10-20T09:00","from":"America/New_York","to":"Europe/London,Asia/Tokyo"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/tip-calculator":{"post":{"operationId":"tipCalculator","summary":"Tip Calculator","description":"Tip and total for a bill, split between people, optionally rounding each share up to a whole currency unit.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"bill":{"type":"number","description":"Bill amount before tip (greater than 0).","minimum":0},"tipPercent":{"type":"number","description":"Tip in percent (0 to 100).","default":15,"minimum":0,"maximum":100},"people":{"type":"integer","description":"People splitting the bill (1 to 100).","default":1,"minimum":1,"maximum":100},"roundUp":{"type":"boolean","description":"Round each person's share up to the next whole unit; the extra goes to the tip.","default":false}},"required":["bill"]},"example":{"bill":84.5,"tipPercent":18,"people":3,"roundUp":true}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/toml-json-converter":{"post":{"operationId":"tomlJsonConverter","summary":"TOML to JSON Converter","description":"Convert TOML to JSON or JSON to TOML (TOML 1.0). TOML dates become ISO 8601 strings in JSON; notes explain anything that can't be represented exactly.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The TOML or JSON text.","maxLength":200000},"to":{"type":"string","description":"Target format.","enum":["json","toml"],"maxLength":200000},"indent":{"type":"integer","description":"Spaces per indent level for JSON output (0 for a single line).","default":2,"minimum":0,"maximum":8},"convertDates":{"type":"boolean","description":"When converting to TOML, turn ISO 8601 date strings into TOML dates.","default":false}},"required":["input","to"]},"example":{"input":"[server]\nhost = \"0.0.0.0\"\nport = 8080\n\n[database]\nurl = \"postgres://localhost/app\"\npool = 5","to":"json"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/totp-generator":{"post":{"operationId":"totpGenerator","summary":"TOTP Code Generator","description":"Generate the current and next TOTP (RFC 6238) codes for a Base32 secret, as an authenticator app would, plus an otpauth:// URI.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"secret":{"type":"string","description":"The shared secret in Base32 (spaces and lowercase are fine), e.g. JBSWY3DPEHPK3PXP.","maxLength":1000},"time":{"type":"number","description":"Unix time in seconds to generate codes for. Defaults to now.","minimum":0,"maximum":253402300799},"digits":{"type":"integer","description":"Code length.","default":6,"minimum":6,"maximum":8},"period":{"type":"integer","description":"Seconds each code is valid for.","default":30,"minimum":1,"maximum":3600},"algorithm":{"type":"string","description":"HMAC hash. Almost every service uses SHA-1.","default":"SHA-1","enum":["SHA-1","SHA-256","SHA-512"],"maxLength":200000},"issuer":{"type":"string","description":"Service name for the otpauth:// URI, e.g. GitHub.","default":"","maxLength":200},"account":{"type":"string","description":"Account name for the otpauth:// URI, e.g. ada@example.com.","default":"","maxLength":200}},"required":["secret"]},"example":{"secret":"JBSWY3DPEHPK3PXP","time":1700000000}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/unicode-character-inspector":{"post":{"operationId":"unicodeCharacterInspector","summary":"Unicode Character Inspector","description":"Inspect every character in text: code point, name, category, script, UTF-8/UTF-16 bytes, escapes, and warnings for invisible, bidi-control and look-alike (homoglyph) characters. Can also escape the text or strip invisible characters.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text to inspect.","maxLength":20000},"action":{"type":"string","description":"inspect (per-character details and a summary; up to 1000 code points), escape (the whole text in the chosen escape format), or clean (remove invisible and bidi control characters, normalise odd spaces).","default":"inspect","enum":["inspect","escape","clean"],"maxLength":200000},"format":{"type":"string","description":"Escape format for action=escape: js, python, html, css, or codepoints (U+XXXX list).","default":"js","enum":["js","python","html","css","codepoints"],"maxLength":200000}},"required":["input"]},"example":{"input":"Pаy​","action":"inspect"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/unit-converter":{"post":{"operationId":"unitConverter","summary":"Unit Converter","description":"Convert a value between units of length, mass, temperature, volume, area, speed, data, time, energy, pressure or fuel economy. Leave out `to` to get every unit in the category.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"value":{"type":"number","description":"The value to convert."},"from":{"type":"string","description":"Unit id to convert from. Length: nm, um, mm, cm, m, km, in, ft, yd, mi, nmi. Mass and weight: mg, g, kg, t, oz, lb, st, us-ton, uk-ton. Temperature: celsius, fahrenheit, kelvin, rankine. Volume: ml, l, m3, metric-tsp, metric-tbsp, metric-cup, us-tsp, us-tbsp, us-fl-oz, us-cup, us-pint, us-quart, us-gallon, imp-fl-oz, imp-cup, imp-pint, imp-quart, imp-gallon, in3, ft3. Area: mm2, cm2, m2, ha, km2, in2, ft2, yd2, acre, mi2. Speed: mps, kph, mph, knot, fps. Data size: bit, kbit, mbit, gbit, byte, kb, mb, gb, tb, pb, kib, mib, gib, tib, pib. Time: ns, us, ms, s, min, h, day, week, month, year. Energy: j, kj, cal, kcal, wh, kwh, btu, ev, ft-lbf. Pressure: pa, hpa, kpa, mpa, mbar, bar, atm, psi, torr, mmhg, inhg. Fuel economy: l-per-100km, km-per-l, mpg-us, mpg-uk.","enum":["nm","um","mm","cm","m","km","in","ft","yd","mi","nmi","mg","g","kg","t","oz","lb","st","us-ton","uk-ton","celsius","fahrenheit","kelvin","rankine","ml","l","m3","metric-tsp","metric-tbsp","metric-cup","us-tsp","us-tbsp","us-fl-oz","us-cup","us-pint","us-quart","us-gallon","imp-fl-oz","imp-cup","imp-pint","imp-quart","imp-gallon","in3","ft3","mm2","cm2","m2","ha","km2","in2","ft2","yd2","acre","mi2","mps","kph","mph","knot","fps","bit","kbit","mbit","gbit","byte","kb","mb","gb","tb","pb","kib","mib","gib","tib","pib","ns","us","ms","s","min","h","day","week","month","year","j","kj","cal","kcal","wh","kwh","btu","ev","ft-lbf","pa","hpa","kpa","mpa","mbar","bar","atm","psi","torr","mmhg","inhg","l-per-100km","km-per-l","mpg-us","mpg-uk"],"maxLength":200000},"to":{"type":"string","description":"Unit id to convert to, in the same category as from. Omit to convert to every unit in the category.","enum":["nm","um","mm","cm","m","km","in","ft","yd","mi","nmi","mg","g","kg","t","oz","lb","st","us-ton","uk-ton","celsius","fahrenheit","kelvin","rankine","ml","l","m3","metric-tsp","metric-tbsp","metric-cup","us-tsp","us-tbsp","us-fl-oz","us-cup","us-pint","us-quart","us-gallon","imp-fl-oz","imp-cup","imp-pint","imp-quart","imp-gallon","in3","ft3","mm2","cm2","m2","ha","km2","in2","ft2","yd2","acre","mi2","mps","kph","mph","knot","fps","bit","kbit","mbit","gbit","byte","kb","mb","gb","tb","pb","kib","mib","gib","tib","pib","ns","us","ms","s","min","h","day","week","month","year","j","kj","cal","kcal","wh","kwh","btu","ev","ft-lbf","pa","hpa","kpa","mpa","mbar","bar","atm","psi","torr","mmhg","inhg","l-per-100km","km-per-l","mpg-us","mpg-uk"],"maxLength":200000}},"required":["value","from"]},"example":{"value":5,"from":"km","to":"mi"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/unix-timestamp-converter":{"post":{"operationId":"unixTimestampConverter","summary":"Unix Timestamp Converter","description":"Convert a Unix timestamp (seconds or milliseconds, detected automatically) to a date.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"timestamp":{"type":"string","description":"The timestamp, e.g. 1700000000.","maxLength":200000},"unit":{"type":"string","description":"auto, s or ms.","default":"auto","enum":["auto","s","ms"],"maxLength":200000}},"required":["timestamp"]},"example":{"timestamp":"1700000000"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/url-encoder-decoder":{"post":{"operationId":"urlEncoderDecoder","summary":"URL Encoder/Decoder","description":"Percent-encode or decode text for URLs.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"Text to encode or decode.","maxLength":200000},"mode":{"type":"string","description":"encode or decode.","enum":["encode","decode"],"maxLength":200000},"scope":{"type":"string","description":"component (a single value) or full (a whole URL), when encoding.","default":"component","enum":["component","full"],"maxLength":200000}},"required":["input","mode"]},"example":{"input":"running shoes & socks","mode":"encode"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/url-parser":{"post":{"operationId":"urlParser","summary":"URL Parser","description":"Split a URL into its parts with the WHATWG URL parser: protocol, credentials, host, port (explicit, default and effective), path segments, decoded query parameters and fragment. Nothing is fetched.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","description":"An absolute URL including its scheme, e.g. https://example.com:8443/a/b?q=1#top.","maxLength":10000}},"required":["url"]},"example":{"url":"https://shop.example.com:8443/products/red%20shoes?size=42&utm_source=newsletter#reviews"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/url-safety-checker":{"post":{"operationId":"urlSafetyChecker","summary":"Suspicious Link Checker","description":"Check a link for phishing red flags without visiting it: lookalike and punycode domains, brand names in subdomains, IP hosts, shorteners, risky TLDs and schemes, credentials in URLs. Returns a 0–100 score and a verdict. Offline heuristics, not a blocklist lookup.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"A URL, or (with mode message) any text such as an email or SMS; every link in it is checked.","maxLength":50000},"mode":{"type":"string","description":"url: check input as one link. message: extract and check up to 50 links found in the text.","default":"url","enum":["url","message"],"maxLength":200000}},"required":["input"]},"example":{"input":"https://paypal.com.account-verify.example.xyz/login?session=1"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/user-agent-parser":{"post":{"operationId":"userAgentParser","summary":"User Agent Parser","description":"Browser, engine, operating system, device and bot detection from a User-Agent string.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"userAgent":{"type":"string","description":"The User-Agent header value.","maxLength":200000}},"required":["userAgent"]},"example":{"userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/utm-builder":{"post":{"operationId":"utmBuilder","summary":"UTM Builder","description":"Add UTM campaign parameters to a URL (replacing any existing ones, keeping other parameters and the #fragment), or parse the UTM parameters out of a tagged URL.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","description":"The landing page URL, or in parse mode a URL with UTM parameters.","maxLength":4096},"mode":{"type":"string","description":"build: add the utm_* fields to url. parse: split url into its UTM and other parameters.","default":"build","enum":["build","parse"],"maxLength":200000},"utm_source":{"type":"string","description":"build: where the traffic comes from, e.g. newsletter or google. Required in build mode.","maxLength":500},"utm_medium":{"type":"string","description":"build: marketing medium, e.g. email, cpc or social.","maxLength":500},"utm_campaign":{"type":"string","description":"build: campaign name, e.g. spring_sale.","maxLength":500},"utm_term":{"type":"string","description":"build: paid search keyword.","maxLength":500},"utm_content":{"type":"string","description":"build: distinguishes ads or links in the same campaign, e.g. header_button.","maxLength":500},"utm_id":{"type":"string","description":"build: campaign ID.","maxLength":500}},"required":["url"]},"example":{"url":"https://shop.example.com/sale?ref=home#top","utm_source":"newsletter","utm_medium":"email","utm_campaign":"spring_sale"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/uuid-generator":{"post":{"operationId":"uuidGenerator","summary":"UUID Generator","description":"Random version 4 UUIDs.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"count":{"type":"integer","description":"How many (1 to 100).","default":1,"minimum":1,"maximum":100}}},"example":{"count":2}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/vat-calculator":{"post":{"operationId":"vatCalculator","summary":"VAT Calculator","description":"Add VAT (or sales tax/GST) to a net price, or remove it from a gross, tax-inclusive price.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","description":"add: amount is net, tax goes on top. remove: amount is gross (tax included), tax is taken out.","default":"add","enum":["add","remove"],"maxLength":200000},"amount":{"type":"number","description":"The price, in currency units.","minimum":0},"rate":{"type":"number","description":"Tax rate in percent (0 to 100), e.g. 20.","minimum":0,"maximum":100}},"required":["amount","rate"]},"example":{"mode":"remove","amount":120,"rate":20}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/week-number-calculator":{"post":{"operationId":"weekNumberCalculator","summary":"Week Number Calculator","description":"ISO 8601 week number, ISO week date, day of year and quarter for a date, or the Monday–Sunday dates of a given ISO week.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"date":{"type":"string","description":"A date as YYYY-MM-DD to get its ISO week. Give this, or year and week.","maxLength":10},"year":{"type":"integer","description":"ISO week-numbering year, to get the dates of a week (with week).","minimum":1,"maximum":9999},"week":{"type":"integer","description":"ISO week number 1 to 52 (or 53 in long years), with year.","minimum":1,"maximum":53}}},"example":{"date":"2026-10-20"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/wheel-spinner":{"post":{"operationId":"wheelSpinner","summary":"Spin the Wheel","description":"Spin a wheel of 2 to 200 entries: picks one entry uniformly at random with a cryptographic random source (the API returns the result, without the animation).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"entries":{"type":"string","description":"One entry per line, up to 200 entries of at most 100 characters.","maxLength":30000}},"required":["entries"]},"example":{"entries":"Pizza\nSushi\nTacos\nCurry"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/whitespace-remover":{"post":{"operationId":"whitespaceRemover","summary":"Whitespace Remover","description":"Trim lines, collapse repeated spaces, expand tabs, join lines or remove all whitespace from text.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text.","maxLength":200000},"trimLines":{"type":"boolean","description":"Remove spaces and tabs from the start and end of every line.","default":true},"collapseSpaces":{"type":"boolean","description":"Replace runs of two or more spaces or tabs with a single space.","default":true},"removeLineBreaks":{"type":"boolean","description":"Join all lines into one, separated by single spaces.","default":false},"tabsToSpaces":{"type":"boolean","description":"Expand tabs to spaces, aligned to tab stops.","default":false},"tabSize":{"type":"integer","description":"Tab stop width used when expanding tabs.","default":4,"minimum":1,"maximum":16},"removeAll":{"type":"boolean","description":"Delete every whitespace character. Overrides the other options.","default":false}},"required":["input"]},"example":{"input":"  Too    many   spaces  \n\tand a tab  "}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/wifi-qr-code-generator":{"post":{"operationId":"wifiQrCodeGenerator","summary":"Wi-Fi QR Code Generator","description":"Generate a Wi-Fi QR code (SVG) that phones scan to join a network, plus the WIFI: payload text.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"ssid":{"type":"string","description":"Network name (SSID), up to 32 bytes.","maxLength":64},"password":{"type":"string","description":"Network password. WPA/SAE: 8 to 63 characters or a 64-digit hex key. WEP: 5 or 13 characters, or 10 or 26 hex digits. Ignored for nopass.","default":"","maxLength":64},"security":{"type":"string","description":"WPA (WPA/WPA2 and mixed WPA3), SAE (WPA3 only), WEP (legacy) or nopass (open network).","default":"WPA","enum":["WPA","SAE","WEP","nopass"],"maxLength":200000},"hidden":{"type":"boolean","description":"The network does not broadcast its name.","default":false},"size":{"type":"integer","description":"SVG width and height in pixels.","default":512,"minimum":64,"maximum":4096}},"required":["ssid"]},"example":{"ssid":"Cafe Guest","password":"espresso-2026","security":"WPA"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/word-counter":{"post":{"operationId":"wordCounter","summary":"Word Counter","description":"Count words, characters, sentences and paragraphs, with reading time.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text.","maxLength":200000}},"required":["input"]},"example":{"input":"PithLab has small tools. Each one does one job well."}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/word-frequency-counter":{"post":{"operationId":"wordFrequencyCounter","summary":"Word Frequency Counter","description":"Count how often each word (or two- and three-word phrase) appears in text, with optional English stop-word removal. Returns the top terms with counts and percentages.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The text to analyse.","maxLength":200000},"n":{"type":"integer","description":"Term size: 1 for single words, 2 for two-word phrases, 3 for three-word phrases.","default":1,"minimum":1,"maximum":3},"caseSensitive":{"type":"boolean","description":"Count \"Apple\" and \"apple\" separately.","default":false},"removeStopWords":{"type":"boolean","description":"Leave out common English function words (the, and, of…).","default":false},"minLength":{"type":"integer","description":"Ignore words shorter than this many characters.","default":1,"minimum":1,"maximum":50},"ignoreNumbers":{"type":"boolean","description":"Leave out terms made only of digits.","default":false},"sort":{"type":"string","description":"count (most frequent first) or alpha (A–Z).","default":"count","enum":["count","alpha"],"maxLength":200000},"limit":{"type":"integer","description":"Return at most this many terms.","default":50,"minimum":1,"maximum":1000}},"required":["input"]},"example":{"input":"The quick fox and the lazy dog. The fox runs.","removeStopWords":true,"limit":3}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/world-clock":{"post":{"operationId":"worldClock","summary":"World Clock","description":"Current (or given) time in several IANA time zones, with date, UTC offset, day/night and the difference from a reference zone.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"zones":{"type":"string","description":"Comma-separated IANA time zones, up to 24, e.g. \"America/New_York,Europe/London,Asia/Tokyo\". Defaults to America/New_York, Europe/London, Europe/Paris, Asia/Kolkata, Asia/Tokyo, Australia/Sydney.","default":"America/New_York,Europe/London,Europe/Paris,Asia/Kolkata,Asia/Tokyo,Australia/Sydney","maxLength":2000},"reference":{"type":"string","description":"IANA zone the differences are measured from.","default":"UTC","maxLength":64},"at":{"type":"string","description":"ISO 8601 instant to show, e.g. 2026-10-20T12:00:00Z. Defaults to now.","maxLength":40}}},"example":{"zones":"America/New_York,Europe/London,Asia/Tokyo","reference":"Europe/London","at":"2026-10-20T12:00:00Z"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/xml-formatter":{"post":{"operationId":"xmlFormatter","summary":"XML Formatter","description":"Validate XML, then pretty-print it with consistent indentation or minify it. Errors report the line and column.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The XML.","maxLength":200000},"mode":{"type":"string","description":"format (pretty-print) or minify.","default":"format","enum":["format","minify"],"maxLength":200000},"indent":{"type":"string","description":"Indentation when formatting: \"2\", \"4\" or \"tab\".","default":"2","enum":["2","4","tab"],"maxLength":200000},"stripComments":{"type":"boolean","description":"Remove <!-- comments -->.","default":false}},"required":["input"]},"example":{"input":"<catalog><book id=\"1\"><title>Dune</title><year>1965</year></book></catalog>"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/xml-to-json":{"post":{"operationId":"xmlToJson","summary":"XML to JSON","description":"Convert XML to JSON.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"input":{"type":"string","description":"The XML text.","maxLength":200000}},"required":["input"]},"example":{"input":"<book id=\"1\"><title>Dune</title></book>"}}}},"responses":{"200":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"result":{}}}}}},"400":{"description":"Invalid JSON or input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The tool needs a Pro plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown or switched-off tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota used up. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/batch":{"post":{"operationId":"batch","summary":"Run several tools","description":"Up to 20 tool calls in one request. The key is checked once; each call counts against the quota and succeeds or fails on its own. Results are in the order of the calls.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["calls"],"properties":{"calls":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"object","additionalProperties":false,"required":["tool"],"properties":{"tool":{"type":"string","description":"A tool slug."},"input":{"type":"object"}}}}}},"example":{"calls":[{"tool":"slug-generator","input":{"input":"Hello World"}}]}}}},"responses":{"200":{"description":"Per-call results, in order.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"summary":{"type":"object"},"results":{"type":"array"}}}}}},"400":{"description":"Invalid JSON or batch shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Body larger than 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}