{"openapi":"3.1.0","info":{"title":"Botoi API","version":"1.0.0","description":"Developer utility APIs: IP geolocation, WHOIS, SSL checks, email validation, DNS lookup, URL metadata, text analysis, JWT signing, encryption, TOTP, math evaluation, unit conversion, barcode/avatar generation, and more. 62+ endpoints, free tier available.\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/23539181-55102ec9-761c-4bd3-8598-7a1a6036cddc?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D23539181-55102ec9-761c-4bd3-8598-7a1a6036cddc%26entityType%3Dcollection%26workspaceId%3D1e4f1e92-bb0b-458a-8678-72eda6320d01)","contact":{"name":"Botoi","url":"https://botoi.com","email":"api@botoi.com"},"x-logo":{"url":"https://botoi.com/favicon.svg"}},"externalDocs":{"description":"Run in Postman","url":"https://app.getpostman.com/run-collection/23539181-55102ec9-761c-4bd3-8598-7a1a6036cddc?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D23539181-55102ec9-761c-4bd3-8598-7a1a6036cddc%26entityType%3Dcollection%26workspaceId%3D1e4f1e92-bb0b-458a-8678-72eda6320d01"},"servers":[{"url":"https://api.botoi.com","description":"Production"},{"url":"http://localhost:8787","description":"Local development"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Your Botoi API key. Get one free at https://botoi.com/api"}},"schemas":{"ApiResponse":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}},"paths":{"/v1/base64/encode":{"post":{"operationId":"base64Encode","tags":["Text & Data"],"summary":"Base64 encode a string","description":"Encodes a UTF-8 string to Base64. Supports standard and URL-safe encoding.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"The string to encode","example":"Hello, World!"},"urlSafe":{"type":"boolean","description":"Use URL-safe alphabet (- instead of +, _ instead of /, no padding)","default":false}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"encoded":{"type":"string"}},"example":{"encoded":"SGVsbG8sIFdvcmxkIQ=="}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/base64/decode":{"post":{"operationId":"base64Decode","tags":["Text & Data"],"summary":"Decode a Base64 string","description":"Decodes a Base64-encoded string back to UTF-8. Supports standard and URL-safe encoding.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["encoded"],"properties":{"encoded":{"type":"string","description":"The Base64 string to decode","example":"SGVsbG8sIFdvcmxkIQ=="},"urlSafe":{"type":"boolean","description":"Input uses URL-safe alphabet","default":false}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"decoded":{"type":"string"}},"example":{"decoded":"Hello, World!"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/json/format":{"post":{"operationId":"jsonFormat","tags":["Text & Data"],"summary":"Format (pretty-print) JSON","description":"Parses a JSON string and returns it formatted with configurable indentation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["json"],"properties":{"json":{"type":"string","description":"Raw JSON string to format","example":"{\"name\":\"botoi\",\"version\":1}"},"indent":{"type":"integer","description":"Number of spaces for indentation (0-8)","default":2,"minimum":0,"maximum":8}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"formatted":{"type":"string"},"valid":{"type":"boolean"}},"example":{"formatted":"{\n  \"name\": \"botoi\",\n  \"version\": 1\n}","valid":true}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/json/minify":{"post":{"operationId":"jsonMinify","tags":["Text & Data"],"summary":"Minify JSON","description":"Strips all whitespace from a JSON string and reports size savings.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["json"],"properties":{"json":{"type":"string","description":"JSON string to minify","example":"{\n  \"name\": \"botoi\",\n  \"version\": 1\n}"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"minified":{"type":"string"},"originalSize":{"type":"integer"},"minifiedSize":{"type":"integer"},"savings":{"type":"string"}},"example":{"minified":"{\"name\":\"botoi\",\"version\":1}","originalSize":42,"minifiedSize":27,"savings":"35.7%"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/json/validate":{"post":{"operationId":"jsonValidate","tags":["Text & Data"],"summary":"Validate JSON syntax","description":"Checks whether a string is valid JSON and reports the error position on failure.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["json"],"properties":{"json":{"type":"string","description":"JSON string to validate","example":"{\"valid\": true}"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"valid":{"type":"boolean"},"error":{"type":"object","properties":{"message":{"type":"string"},"position":{"type":"integer"}}}},"example":{"valid":true}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/json/diff":{"post":{"operationId":"jsonDiff","tags":["Text & Data"],"summary":"Diff two JSON documents","description":"Deep-compares two JSON values and returns a list of added, removed, and changed paths.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["a","b"],"properties":{"a":{"type":"string","description":"First JSON string","example":"{\"name\":\"botoi\",\"version\":1}"},"b":{"type":"string","description":"Second JSON string","example":"{\"name\":\"botoi\",\"version\":2}"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"equal":{"type":"boolean"},"differences":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"type":{"type":"string","enum":["added","removed","changed"]},"oldValue":{},"newValue":{}}}}},"example":{"equal":false,"differences":[{"path":"$.version","type":"changed","oldValue":1,"newValue":2}]}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/markdown/to-html":{"post":{"operationId":"markdownToHtml","tags":["Text & Data"],"summary":"Convert Markdown to HTML","description":"Renders Markdown to HTML using the Marked library. Supports GFM and optional script/event sanitization.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["markdown"],"properties":{"markdown":{"type":"string","description":"Markdown source text","example":"# Hello\n\nThis is **bold** text."},"gfm":{"type":"boolean","description":"Enable GitHub Flavored Markdown","default":true},"sanitize":{"type":"boolean","description":"Strip script tags, event handlers, iframes, objects, and embeds","default":false}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"html":{"type":"string"}},"example":{"html":"<h1>Hello</h1>\n<p>This is <strong>bold</strong> text.</p>\n"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/markdown/to-text":{"post":{"operationId":"markdownToText","tags":["Text & Data"],"summary":"Convert Markdown to plain text","description":"Strips all Markdown syntax (headings, bold, links, code blocks, etc.) and returns plain text.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["markdown"],"properties":{"markdown":{"type":"string","description":"Markdown source text","example":"# Hello\n\nThis is **bold** text."}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"text":{"type":"string"}},"example":{"text":"Hello\n\nThis is bold text."}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/html-to-text/convert":{"post":{"operationId":"htmlToTextConvert","tags":["Text & Data"],"summary":"Convert HTML to plain text","description":"Strips HTML tags and decodes entities. Optionally preserves links and images as Markdown-style references.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["html"],"properties":{"html":{"type":"string","description":"HTML string to convert","example":"<h1>Hello</h1><p>This is <b>bold</b> text.</p>"},"preserveLinks":{"type":"boolean","description":"Keep links as [text](url)","default":false},"preserveImages":{"type":"boolean","description":"Keep images as [alt](src)","default":false}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"text":{"type":"string"},"wordCount":{"type":"integer"}},"example":{"text":"Hello\nThis is bold text.","wordCount":5}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/lorem/generate":{"post":{"operationId":"loremGenerate","tags":["Text & Data"],"summary":"Generate lorem ipsum text","description":"Generates placeholder text as paragraphs, sentences, or individual words.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["paragraphs","sentences","words"],"description":"The unit of text to generate","example":"paragraphs"},"count":{"type":"integer","description":"How many units to generate (1-100)","default":3,"minimum":1,"maximum":100}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"text":{"type":"string"},"count":{"type":"integer"},"type":{"type":"string"}},"example":{"text":"Lorem ipsum dolor sit amet, consectetur adipiscing elit...","count":3,"type":"paragraphs"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/regex/test":{"post":{"operationId":"regexTest","tags":["Text & Data"],"summary":"Test a regex pattern against a string","description":"Executes a regular expression against a test string and returns all matches with indices and named groups.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["pattern","testString"],"properties":{"pattern":{"type":"string","description":"Regular expression pattern (without delimiters)","example":"(\\d{4})-(\\d{2})-(\\d{2})"},"flags":{"type":"string","description":"Regex flags (e.g. \"gi\")","default":""},"testString":{"type":"string","description":"String to test against","example":"Date: 2025-01-15 and 2025-06-30"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"matches":{"type":"array","items":{"type":"object","properties":{"match":{"type":"string"},"index":{"type":"integer"},"groups":{"type":"object"}}}},"matched":{"type":"boolean"},"matchCount":{"type":"integer"}},"example":{"matches":[{"match":"2025-01-15","index":6},{"match":"2025-06-30","index":21}],"matched":true,"matchCount":2}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/regex/replace":{"post":{"operationId":"regexReplace","tags":["Text & Data"],"summary":"Find and replace with regex","description":"Applies a regex-based find-and-replace on a string and returns the result with a replacement count.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["pattern","testString","replacement"],"properties":{"pattern":{"type":"string","description":"Regular expression pattern","example":"\\d+"},"flags":{"type":"string","description":"Regex flags","default":""},"testString":{"type":"string","description":"Input string","example":"Order 123 has 5 items"},"replacement":{"type":"string","description":"Replacement string (supports $1, $2, etc.)","example":"#"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"result":{"type":"string"},"replacements":{"type":"integer"}},"example":{"result":"Order # has # items","replacements":2}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/hash/":{"post":{"operationId":"hashGenerate","tags":["Developer Utilities"],"summary":"Generate a hash","description":"Computes a cryptographic hash of the input text using the specified algorithm.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text","algorithm"],"properties":{"text":{"type":"string","description":"Text to hash","example":"Hello, World!"},"algorithm":{"type":"string","enum":["md5","sha1","sha256","sha384","sha512"],"description":"Hash algorithm","example":"sha256"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"hash":{"type":"string"},"algorithm":{"type":"string"}},"example":{"hash":"dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f","algorithm":"sha256"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/hash/batch":{"post":{"operationId":"hashBatch","tags":["Developer Utilities"],"summary":"Generate multiple hashes at once","description":"Computes hashes for the same input across multiple algorithms in a single request. Defaults to all supported algorithms if none specified.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"Text to hash","example":"Hello, World!"},"algorithms":{"type":"array","items":{"type":"string","enum":["md5","sha1","sha256","sha384","sha512"]},"description":"Algorithms to use. Omit for all supported algorithms.","example":["sha256","md5"]}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"hashes":{"type":"object","additionalProperties":{"type":"string"}}},"example":{"hashes":{"sha256":"dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f","md5":"65a8e27d8879283831b664bd8b7f0ad4"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/uuid/v4":{"post":{"operationId":"uuidGenerateV4","tags":["Developer Utilities"],"summary":"Generate a UUID v4","description":"Returns a single cryptographically random UUID v4.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid"}},"example":{"uuid":"f47ac10b-58cc-4372-a567-0e02b2c3d479"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/uuid/batch":{"post":{"operationId":"uuidBatch","tags":["Developer Utilities"],"summary":"Generate multiple UUIDs","description":"Returns up to 100 UUID v4 values in a single request.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer","description":"Number of UUIDs to generate (1-100)","default":1,"minimum":1,"maximum":100,"example":5}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"uuids":{"type":"array","items":{"type":"string","format":"uuid"}}},"example":{"uuids":["f47ac10b-58cc-4372-a567-0e02b2c3d479","a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d"]}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/uuid/ulid":{"post":{"operationId":"uuidGenerateUlid","tags":["Developer Utilities"],"summary":"Generate a ULID","description":"Returns a Universally Unique Lexicographically Sortable Identifier (ULID). Contains a 48-bit timestamp and 80 bits of randomness.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ulid":{"type":"string"}},"example":{"ulid":"01ARZ3NDEKTSV4RRFFQ69G5FAV"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/uuid/validate":{"post":{"operationId":"uuidValidate","tags":["Developer Utilities"],"summary":"Validate a UUID","description":"Checks whether a string is a valid UUID and detects its version.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["uuid"],"properties":{"uuid":{"type":"string","description":"UUID string to validate","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"valid":{"type":"boolean"},"version":{"type":"integer"}},"example":{"valid":true,"version":4}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/url/encode":{"post":{"operationId":"urlEncode","tags":["Developer Utilities"],"summary":"URL-encode a string","description":"Encodes a string for safe use in URLs. Uses encodeURIComponent by default or encodeURI when component is false.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"String to encode","example":"hello world & foo=bar"},"component":{"type":"boolean","description":"Use encodeURIComponent (true) or encodeURI (false)","default":true}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"encoded":{"type":"string"}},"example":{"encoded":"hello%20world%20%26%20foo%3Dbar"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/url/decode":{"post":{"operationId":"urlDecode","tags":["Developer Utilities"],"summary":"URL-decode a string","description":"Decodes a percent-encoded URL string.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"URL-encoded string to decode","example":"hello%20world%20%26%20foo%3Dbar"},"component":{"type":"boolean","description":"Use decodeURIComponent (true) or decodeURI (false)","default":true}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"decoded":{"type":"string"}},"example":{"decoded":"hello world & foo=bar"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/url/parse":{"post":{"operationId":"urlParse","tags":["Developer Utilities"],"summary":"Parse a URL into its components","description":"Breaks a URL into protocol, host, pathname, query parameters, hash, and more.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Full URL to parse","example":"https://botoi.com/tools?q=json&lang=en#results"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"protocol":{"type":"string"},"host":{"type":"string"},"hostname":{"type":"string"},"port":{"type":"string","nullable":true},"pathname":{"type":"string"},"search":{"type":"string","nullable":true},"queryParams":{"type":"object","additionalProperties":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"hash":{"type":"string","nullable":true},"origin":{"type":"string"},"username":{"type":"string","nullable":true},"password":{"type":"string","nullable":true}},"example":{"protocol":"https:","host":"botoi.com","hostname":"botoi.com","port":null,"pathname":"/tools","search":"?q=json&lang=en","queryParams":{"q":"json","lang":"en"},"hash":"#results","origin":"https://botoi.com","username":null,"password":null}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/password/generate":{"post":{"operationId":"passwordGenerate","tags":["Developer Utilities"],"summary":"Generate secure passwords","description":"Generates one or more cryptographically random passwords with configurable length, character sets, and ambiguous character exclusion.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"length":{"type":"integer","description":"Password length (4-256)","default":16,"minimum":4,"maximum":256},"count":{"type":"integer","description":"Number of passwords to generate (1-50)","default":1,"minimum":1,"maximum":50},"uppercase":{"type":"boolean","description":"Include uppercase letters","default":true},"lowercase":{"type":"boolean","description":"Include lowercase letters","default":true},"numbers":{"type":"boolean","description":"Include digits","default":true},"symbols":{"type":"boolean","description":"Include special characters","default":false},"excludeAmbiguous":{"type":"boolean","description":"Exclude ambiguous characters (0, O, I, l, 1, |)","default":false}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"passwords":{"type":"array","items":{"type":"string"}}},"example":{"passwords":["xK9mB2nPqR4tW7yZ"]}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/password/strength":{"post":{"operationId":"passwordStrength","tags":["Developer Utilities"],"summary":"Check password strength","description":"Analyzes a password and returns a strength score (0-4), entropy bits, and human-readable feedback.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["password"],"properties":{"password":{"type":"string","description":"Password to analyze","example":"MyS3cure!Pass"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"score":{"type":"integer","minimum":0,"maximum":4},"feedback":{"type":"string"},"entropy":{"type":"number"}},"example":{"score":3,"feedback":"Strong. Good length and character diversity.","entropy":77.55}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/cron/parse":{"post":{"operationId":"cronParse","tags":["Developer Utilities"],"summary":"Parse and describe a cron expression","description":"Validates a standard 5-field cron expression, returns a human-readable description, the next 5 scheduled runs, and the parsed field breakdown.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["expression"],"properties":{"expression":{"type":"string","description":"Five-field cron expression","example":"*/15 9-17 * * 1-5"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"isValid":{"type":"boolean"},"description":{"type":"string"},"nextRuns":{"type":"array","items":{"type":"string","format":"date-time"}},"parts":{"type":"object","nullable":true,"properties":{"minute":{"type":"string"},"hour":{"type":"string"},"dayOfMonth":{"type":"string"},"dayOfWeek":{"type":"string"},"month":{"type":"string"}}}},"example":{"isValid":true,"description":"Every 15 minutes past 9AM on Monday","nextRuns":["2026-03-24T09:00:00.000Z"],"parts":{"minute":"*/15","hour":"9-17","dayOfMonth":"*","month":"*","dayOfWeek":"1-5"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/cron/next":{"post":{"operationId":"cronNext","tags":["Developer Utilities"],"summary":"Get next scheduled runs for a cron expression","description":"Returns the next N scheduled execution times for a cron expression, optionally starting from a custom date.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["expression"],"properties":{"expression":{"type":"string","description":"Five-field cron expression","example":"0 0 * * *"},"count":{"type":"integer","description":"Number of runs to return (1-25)","default":5,"minimum":1,"maximum":25},"from":{"type":"string","format":"date-time","description":"Start date for calculation (defaults to now)","example":"2026-01-01T00:00:00Z"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"nextRuns":{"type":"array","items":{"type":"string","format":"date-time"}}},"example":{"nextRuns":["2026-01-02T00:00:00.000Z","2026-01-03T00:00:00.000Z","2026-01-04T00:00:00.000Z"]}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/og/generate":{"post":{"operationId":"ogGenerate","tags":["Image Generation"],"summary":"Generate an Open Graph image","description":"Creates a customizable OG image as SVG using Satori. Choose from three templates (default, minimal, bold), light/dark themes, and custom colors.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"title":{"type":"string","description":"Main heading text","example":"Build APIs faster with Botoi"},"description":{"type":"string","description":"Subtitle text (optional)","example":"Free developer utility APIs"},"template":{"type":"string","enum":["default","minimal","bold"],"description":"Layout template","default":"default"},"theme":{"type":"string","enum":["dark","light"],"description":"Color theme","default":"dark"},"format":{"type":"string","enum":["svg"],"description":"Output format (only SVG is supported)","default":"svg"},"bgColor":{"type":"string","description":"Custom background color (hex)","example":"#111114"},"textColor":{"type":"string","description":"Custom text color (hex)","example":"#E8E6E1"},"accentColor":{"type":"string","description":"Custom accent color (hex)","example":"#3EC997"},"width":{"type":"integer","description":"Image width in pixels (200-4096)","default":1200},"height":{"type":"integer","description":"Image height in pixels (200-4096)","default":630}}}}}},"responses":{"200":{"description":"SVG image","content":{"image/svg+xml":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/qr/generate":{"post":{"operationId":"qrGeneratePost","tags":["Image Generation"],"summary":"Generate a QR code (POST)","description":"Generates a QR code from the given text. Returns SVG by default. Supports custom colors, error correction levels, and margins.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"Content to encode in the QR code","example":"https://botoi.com"},"size":{"type":"integer","description":"Image size in pixels (50-2000)","default":300,"minimum":50,"maximum":2000},"format":{"type":"string","enum":["svg","png","base64"],"description":"Output format. PNG falls back to SVG in this environment.","default":"svg"},"darkColor":{"type":"string","description":"Foreground color (hex)","default":"#000000"},"lightColor":{"type":"string","description":"Background color (hex)","default":"#ffffff"},"errorCorrectionLevel":{"type":"string","enum":["L","M","Q","H"],"description":"Error correction level: L (7%), M (15%), Q (25%), H (30%)","default":"M"},"margin":{"type":"integer","description":"Quiet zone margin (0-20 modules)","default":4,"minimum":0,"maximum":20}}}}}},"responses":{"200":{"description":"QR code image (SVG)","content":{"image/svg+xml":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}},"get":{"operationId":"qrGenerateGet","tags":["Image Generation"],"summary":"Generate a QR code (GET)","description":"Generates a QR code via query parameters. Useful for embedding in <img> tags.","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string"},"description":"Content to encode","example":"https://botoi.com"},{"name":"size","in":"query","schema":{"type":"integer","default":300},"description":"Image size in pixels (50-2000)"},{"name":"format","in":"query","schema":{"type":"string","enum":["svg","png","base64"],"default":"svg"},"description":"Output format"},{"name":"darkColor","in":"query","schema":{"type":"string","default":"#000000"},"description":"Foreground color (hex)"},{"name":"lightColor","in":"query","schema":{"type":"string","default":"#ffffff"},"description":"Background color (hex)"},{"name":"errorCorrectionLevel","in":"query","schema":{"type":"string","enum":["L","M","Q","H"],"default":"M"},"description":"Error correction level"},{"name":"margin","in":"query","schema":{"type":"integer","default":4,"minimum":0,"maximum":20},"description":"Quiet zone margin in modules"}],"responses":{"200":{"description":"QR code image (SVG)","content":{"image/svg+xml":{"schema":{"type":"string"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/ip/lookup":{"post":{"operationId":"ipLookup","tags":["Lookup"],"summary":"Geolocate an IP address","description":"Returns geolocation data for the caller's IP address, including country, city, region, coordinates, timezone, ASN, and Cloudflare data center. Powered by Cloudflare's edge network.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"ip":{"type":"string","description":"IP address to look up. If omitted, the caller's IP is used.","example":"203.0.113.1"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ip":{"type":"string"},"country":{"type":"string"},"country_name":{"type":"string"},"city":{"type":"string","nullable":true},"region":{"type":"string","nullable":true},"region_code":{"type":"string","nullable":true},"continent":{"type":"string"},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"timezone":{"type":"string"},"postal_code":{"type":"string","nullable":true},"asn":{"type":"integer","nullable":true},"as_organization":{"type":"string","nullable":true},"connection":{"type":"object","properties":{"colo":{"type":"string"}}}},"example":{"ip":"203.0.113.1","country":"US","country_name":"United States","city":"San Francisco","region":"California","region_code":"CA","continent":"NA","latitude":37.7749,"longitude":-122.4194,"timezone":"America/Los_Angeles","postal_code":"94105","asn":13335,"as_organization":"Cloudflare Inc","connection":{"colo":"SFO"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/email/validate":{"post":{"operationId":"emailValidate","tags":["Lookup"],"summary":"Validate an email address","description":"Validates an email address with format checking, MX record verification, disposable domain detection, free provider detection, role-based address detection, and typo suggestions.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","description":"Email address to validate","example":"user@gmail.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"email":{"type":"string"},"is_valid":{"type":"boolean"},"format_valid":{"type":"boolean"},"mx_found":{"type":"boolean","nullable":true},"mx_records":{"type":"array","items":{"type":"string"}},"is_disposable":{"type":"boolean"},"is_free_provider":{"type":"boolean"},"is_role_based":{"type":"boolean"},"domain":{"type":"string","nullable":true},"local_part":{"type":"string","nullable":true},"suggestion":{"type":"string","nullable":true}},"example":{"email":"user@gmail.com","is_valid":true,"format_valid":true,"mx_found":true,"mx_records":["gmail-smtp-in.l.google.com"],"is_disposable":false,"is_free_provider":true,"is_role_based":false,"domain":"gmail.com","local_part":"user","suggestion":null}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/useragent/parse":{"post":{"operationId":"useragentParse","tags":["Lookup"],"summary":"Parse a user agent string","description":"Parses a user agent string into browser, engine, OS, and device components. Detects bots, crawlers, and headless browsers. If no user_agent field is provided, the caller's User-Agent header is used.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"user_agent":{"type":"string","description":"User agent string to parse. Defaults to the caller's User-Agent header.","example":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"user_agent":{"type":"string"},"browser":{"type":"object","properties":{"name":{"type":"string","nullable":true},"version":{"type":"string","nullable":true},"major":{"type":"string","nullable":true}}},"engine":{"type":"object","properties":{"name":{"type":"string","nullable":true},"version":{"type":"string","nullable":true}}},"os":{"type":"object","properties":{"name":{"type":"string","nullable":true},"version":{"type":"string","nullable":true}}},"device":{"type":"object","properties":{"type":{"type":"string"},"vendor":{"type":"string","nullable":true},"model":{"type":"string","nullable":true}}},"is_bot":{"type":"boolean"}},"example":{"user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/120.0.0.0","browser":{"name":"Chrome","version":"120.0.0.0","major":"120"},"engine":{"name":"Blink","version":"120.0.0.0"},"os":{"name":"macOS","version":"10.15.7"},"device":{"type":"desktop","vendor":"Apple","model":"Macintosh"},"is_bot":false}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/timezone/":{"post":{"operationId":"timezoneGet","tags":["Lookup"],"summary":"Get current time in a timezone","description":"Returns the current time, UTC offset, abbreviation, and DST status for a given IANA timezone. Defaults to UTC if no timezone is specified.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"timezone":{"type":"string","description":"IANA timezone name","default":"UTC","example":"America/New_York"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"timezone":{"type":"string"},"abbreviation":{"type":"string"},"utc_offset":{"type":"string"},"is_dst":{"type":"boolean"},"current_time":{"type":"string"},"unix_timestamp":{"type":"integer"}},"example":{"timezone":"America/New_York","abbreviation":"EDT","utc_offset":"-04:00","is_dst":true,"current_time":"2026-03-24T10:30:00-04:00","unix_timestamp":1774620600}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/timezone/convert":{"post":{"operationId":"timezoneConvert","tags":["Lookup"],"summary":"Convert time between timezones","description":"Converts a datetime from one IANA timezone to another. Returns both formatted datetimes and the offset difference.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["datetime","from","to"],"properties":{"datetime":{"type":"string","description":"ISO 8601 datetime (YYYY-MM-DDTHH:mm:ss)","example":"2026-03-24T10:30:00"},"from":{"type":"string","description":"Source IANA timezone","example":"America/New_York"},"to":{"type":"string","description":"Target IANA timezone","example":"Asia/Tokyo"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"from":{"type":"object","properties":{"timezone":{"type":"string"},"datetime":{"type":"string"},"abbreviation":{"type":"string"}}},"to":{"type":"object","properties":{"timezone":{"type":"string"},"datetime":{"type":"string"},"abbreviation":{"type":"string"}}},"offset_diff":{"type":"string"}},"example":{"from":{"timezone":"America/New_York","datetime":"2026-03-24T10:30:00-04:00","abbreviation":"EDT"},"to":{"timezone":"Asia/Tokyo","datetime":"2026-03-24T23:30:00+09:00","abbreviation":"JST"},"offset_diff":"+13:00"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/dns/lookup":{"post":{"operationId":"dnsLookup","tags":["Lookup"],"summary":"Look up DNS records for a domain","description":"Queries DNS records for a domain using Cloudflare DNS-over-HTTPS. Supports A, AAAA, MX, TXT, CNAME, NS, SOA, and PTR record types.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Domain name to look up","example":"github.com"},"type":{"type":"string","enum":["A","AAAA","MX","TXT","CNAME","NS","SOA","PTR"],"description":"DNS record type","default":"A"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"type":{"type":"string"},"records":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"string"},"ttl":{"type":"integer"},"priority":{"type":"integer"}}}},"query_time_ms":{"type":"number"}},"example":{"domain":"github.com","type":"A","records":[{"type":"A","value":"140.82.121.3","ttl":60}],"query_time_ms":12}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/dns/batch":{"post":{"operationId":"dnsBatch","tags":["Lookup"],"summary":"Look up multiple DNS record types at once","description":"Queries multiple DNS record types for a domain in parallel. Defaults to A, AAAA, MX, TXT, and NS if no types specified.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Domain name to look up","example":"github.com"},"types":{"type":"array","items":{"type":"string","enum":["A","AAAA","MX","TXT","CNAME","NS","SOA","PTR"]},"description":"Record types to query (defaults to A, AAAA, MX, TXT, NS)","example":["A","MX","TXT"]}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"results":{"type":"object","additionalProperties":{"type":"array","items":{"type":"object"}}}},"example":{"domain":"github.com","results":{"A":[{"type":"A","value":"140.82.121.3","ttl":60}],"MX":[{"type":"MX","value":"aspmx.l.google.com","priority":1,"ttl":3600}]}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/url-metadata/":{"post":{"operationId":"urlMetadataExtract","tags":["Lookup"],"summary":"Extract metadata and Open Graph tags from a URL","description":"Fetches a URL and extracts title, description, Open Graph tags, Twitter Card tags, favicon, canonical URL, language, author, keywords, and theme color. Useful for link previews and social sharing.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"URL to fetch and extract metadata from","example":"https://github.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string"},"status":{"type":"integer"},"content_type":{"type":"string"},"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"og":{"type":"object","properties":{"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"image":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"site_name":{"type":"string","nullable":true}}},"twitter":{"type":"object","properties":{"card":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"image":{"type":"string","nullable":true}}},"favicon":{"type":"string","nullable":true},"canonical":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"author":{"type":"string","nullable":true},"keywords":{"type":"array","items":{"type":"string"}},"theme_color":{"type":"string","nullable":true}},"example":{"url":"https://github.com","status":200,"content_type":"text/html","title":"GitHub","description":"Where the world builds software","og":{"title":"GitHub","description":"Where the world builds software","image":"https://github.githubassets.com/images/modules/site/social-cards/campaign-social.png","type":"website","url":"https://github.com","site_name":"GitHub"},"twitter":{"card":"summary_large_image","title":"GitHub","description":"Where the world builds software","image":null},"favicon":"https://github.com/favicon.ico","canonical":"https://github.com","language":"en","author":null,"keywords":[],"theme_color":null}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/random/data":{"post":{"operationId":"randomData","tags":["Developer Utilities"],"summary":"Generate random test data (fake identities)","description":"Generates realistic-looking fake person data for testing, seeding databases, or prototyping. Includes names, emails, phone numbers, addresses, and more. Uses cryptographic randomness.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer","description":"Number of records to generate (1-50)","default":1,"minimum":1,"maximum":50},"locale":{"type":"string","description":"Locale for name generation","default":"en","example":"en"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"integer"},"data":{"type":"array","items":{"type":"object","properties":{"first_name":{"type":"string"},"last_name":{"type":"string"},"full_name":{"type":"string"},"email":{"type":"string"},"username":{"type":"string"},"phone":{"type":"string"},"date_of_birth":{"type":"string"},"age":{"type":"integer"},"address":{"type":"object","properties":{"street":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"zip":{"type":"string"},"country":{"type":"string"}}},"company":{"type":"string"},"avatar_url":{"type":"string"},"uuid":{"type":"string","format":"uuid"}}}}},"example":{"count":1,"data":[{"first_name":"Sarah","last_name":"Johnson","full_name":"Sarah Johnson","email":"sarah.johnson@gmail.com","username":"sarah482","phone":"(415) 555-1234","date_of_birth":"1992-07-15","age":33,"address":{"street":"742 Oak Ave","city":"San Francisco","state":"CA","zip":"94102","country":"US"},"company":"Acme Corp","avatar_url":"https://api.dicebear.com/7.x/initials/svg?seed=Sarah%20Johnson","uuid":"f47ac10b-58cc-4372-a567-0e02b2c3d479"}]}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/color/convert":{"post":{"operationId":"colorConvert","tags":["Developer Utilities"],"summary":"Convert a color between HEX, RGB, and HSL","description":"Auto-detects the input color format (HEX, RGB, HSL, or CSS named color) and converts to all formats. Includes luminance, contrast ratios against white and black, and light/dark classification.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["color"],"properties":{"color":{"type":"string","description":"Color in any format: HEX (#3EC997), RGB (rgb(62,201,151)), HSL (hsl(158,55%,52%)), or CSS name (coral)","example":"#3EC997"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"string"},"format_detected":{"type":"string"},"hex":{"type":"string"},"rgb":{"type":"object","properties":{"r":{"type":"integer"},"g":{"type":"integer"},"b":{"type":"integer"}}},"hsl":{"type":"object","properties":{"h":{"type":"integer"},"s":{"type":"integer"},"l":{"type":"integer"}}},"rgb_string":{"type":"string"},"hsl_string":{"type":"string"},"is_light":{"type":"boolean"},"luminance":{"type":"number"},"contrast_white":{"type":"number"},"contrast_black":{"type":"number"}},"example":{"input":"#3EC997","format_detected":"hex","hex":"#3EC997","rgb":{"r":62,"g":201,"b":151},"hsl":{"h":158,"s":55,"l":52},"rgb_string":"rgb(62, 201, 151)","hsl_string":"hsl(158, 55%, 52%)","is_light":true,"luminance":0.48,"contrast_white":1.8,"contrast_black":11.7}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/color/palette":{"post":{"operationId":"colorPalette","tags":["Developer Utilities"],"summary":"Generate a color palette from a base color","description":"Generates a harmonious color palette from a base color using color theory. Supports complementary, analogous, triadic, tetradic, split-complementary, and monochromatic palette types.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["color"],"properties":{"color":{"type":"string","description":"Base color in any format","example":"#3EC997"},"type":{"type":"string","enum":["complementary","analogous","triadic","tetradic","split-complementary","monochromatic"],"description":"Palette generation strategy","default":"complementary"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"base":{"type":"string"},"type":{"type":"string"},"palette":{"type":"array","items":{"type":"object","properties":{"hex":{"type":"string"},"rgb":{"type":"string"},"hsl":{"type":"string"},"is_light":{"type":"boolean"}}}}},"example":{"base":"#3EC997","type":"complementary","palette":[{"hex":"#3EC997","rgb":"rgb(62, 201, 151)","hsl":"hsl(158, 55%, 52%)","is_light":true},{"hex":"#C93E70","rgb":"rgb(201, 62, 112)","hsl":"hsl(338, 55%, 52%)","is_light":false}]}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/text/stats":{"post":{"operationId":"textStats","tags":["Text & Data"],"summary":"Analyze text and return statistics","description":"Computes word count, character count, sentence count, reading time, speaking time, average word length, and more.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"Text to analyze","example":"The quick brown fox jumps over the lazy dog."}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"characters":{"type":"integer"},"characters_no_spaces":{"type":"integer"},"words":{"type":"integer"},"sentences":{"type":"integer"},"paragraphs":{"type":"integer"},"lines":{"type":"integer"},"reading_time_seconds":{"type":"integer"},"speaking_time_seconds":{"type":"integer"},"avg_word_length":{"type":"number"},"longest_word":{"type":"string"},"unique_words":{"type":"integer"}},"example":{"characters":44,"words":9,"sentences":1,"reading_time_seconds":2,"avg_word_length":3.9}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/text/slugify":{"post":{"operationId":"textSlugify","tags":["Text & Data"],"summary":"Convert text to a URL-safe slug","description":"Converts text to a URL slug with accent transliteration, lowercase conversion, and configurable separator.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"Text to slugify","example":"Hello World! Über Cool"},"separator":{"type":"string","enum":["-","_"],"default":"-","description":"Separator character"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"original":{"type":"string"},"slug":{"type":"string"},"separator":{"type":"string"},"length":{"type":"integer"}},"example":{"original":"Hello World! Über Cool","slug":"hello-world-uber-cool","separator":"-","length":21}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/jwt/decode":{"post":{"operationId":"jwtDecode","tags":["Developer Utilities"],"summary":"Decode a JWT token","description":"Decodes a JSON Web Token into its header, payload, and signature without verifying the signature. Reports expiration status.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["token"],"properties":{"token":{"type":"string","description":"JWT token to decode","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"header":{"type":"object"},"payload":{"type":"object"},"signature":{"type":"string"},"is_expired":{"type":"boolean","nullable":true},"expires_in_seconds":{"type":"integer","nullable":true},"expires_at":{"type":"string","nullable":true}},"example":{"header":{"alg":"HS256","typ":"JWT"},"payload":{"sub":"1234567890","name":"John Doe","iat":1516239022},"signature":"SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c","is_expired":null,"expires_in_seconds":null,"expires_at":null}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/diff/":{"post":{"operationId":"diffText","tags":["Developer Utilities"],"summary":"Compare two texts line by line","description":"Computes a line-by-line diff between two texts using LCS and returns additions, removals, and unchanged lines.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["original","modified"],"properties":{"original":{"type":"string","description":"Original text","example":"hello\nworld"},"modified":{"type":"string","description":"Modified text","example":"hello\nthere"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"changes":{"type":"array","items":{"type":"object"}},"stats":{"type":"object","properties":{"additions":{"type":"integer"},"removals":{"type":"integer"},"unchanged":{"type":"integer"}}}},"example":{"changes":[{"type":"unchanged","value":"hello","line":1},{"type":"removed","value":"world","line":2},{"type":"added","value":"there","line":2}],"stats":{"additions":1,"removals":1,"unchanged":1}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/diff/json":{"post":{"operationId":"diffJson","tags":["Developer Utilities"],"summary":"Deep-compare two JSON objects","description":"Recursively compares two JSON objects and returns a list of changes with dot-notation paths.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["original","modified"],"properties":{"original":{"type":"object","description":"Original JSON object"},"modified":{"type":"object","description":"Modified JSON object"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"changes":{"type":"array","items":{"type":"object"}},"total_changes":{"type":"integer"},"is_equal":{"type":"boolean"}},"example":{"changes":[{"path":"name","type":"changed","old_value":"foo","new_value":"bar"}],"total_changes":1,"is_equal":false}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/number/format":{"post":{"operationId":"numberFormat","tags":["Developer Utilities"],"summary":"Format a number with locale and style options","description":"Formats a number using Intl.NumberFormat. Supports decimal, currency, percent, and unit styles with configurable locale and notation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["number"],"properties":{"number":{"type":"number","description":"Number to format","example":1234567.89},"locale":{"type":"string","default":"en-US","description":"BCP 47 locale","example":"en-US"},"style":{"type":"string","enum":["decimal","currency","percent","unit"],"default":"decimal"},"currency":{"type":"string","description":"ISO 4217 currency code (required for currency style)","example":"USD"},"unit":{"type":"string","description":"Unit identifier (required for unit style)","example":"kilometer"},"notation":{"type":"string","enum":["standard","compact","scientific","engineering"],"default":"standard"},"minimumFractionDigits":{"type":"integer"},"maximumFractionDigits":{"type":"integer"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"input":{"type":"number"},"formatted":{"type":"string"},"locale":{"type":"string"},"style":{"type":"string"}},"example":{"input":1234567.89,"formatted":"$1,234,567.89","locale":"en-US","style":"currency"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/ip/in-range":{"post":{"operationId":"ipInRange","tags":["Lookup"],"summary":"Check if an IP is within a CIDR range","description":"Checks whether an IPv4 address falls within a given CIDR range. Returns network address, broadcast address, and total hosts.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ip","range"],"properties":{"ip":{"type":"string","description":"IPv4 address to check","example":"192.168.1.50"},"range":{"type":"string","description":"CIDR range","example":"192.168.1.0/24"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ip":{"type":"string"},"range":{"type":"string"},"in_range":{"type":"boolean"},"network":{"type":"string"},"broadcast":{"type":"string"},"prefix_length":{"type":"integer"},"total_hosts":{"type":"integer"}},"example":{"ip":"192.168.1.50","range":"192.168.1.0/24","in_range":true,"network":"192.168.1.0","broadcast":"192.168.1.255","prefix_length":24,"total_hosts":256}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/whois/":{"post":{"operationId":"whoisLookup","tags":["Lookup & Enrichment"],"summary":"Domain WHOIS/RDAP lookup","description":"Queries WHOIS/RDAP data for a domain name. Returns registrar, status, creation date, expiry, and nameservers.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Domain name to look up","example":"example.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"registrar":{"type":"string","nullable":true},"status":{"type":"array","items":{"type":"string"}},"created":{"type":"string","nullable":true},"updated":{"type":"string","nullable":true},"expires":{"type":"string","nullable":true},"nameservers":{"type":"array","items":{"type":"string"}}},"example":{"domain":"example.com","registrar":"RESERVED-Internet Assigned Numbers Authority","status":["client delete prohibited"],"created":"1995-08-14T04:00:00Z","updated":"2024-08-14T07:01:38Z","expires":"2025-08-13T04:00:00Z","nameservers":["a.iana-servers.net","b.iana-servers.net"]}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/ssl/":{"post":{"operationId":"sslCheck","tags":["Lookup & Enrichment"],"summary":"SSL/Security headers check","description":"Checks whether a domain supports HTTPS and inspects security-related response headers such as Strict-Transport-Security, Content-Security-Policy, and X-Frame-Options.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Domain to check","example":"cloudflare.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"https_reachable":{"type":"boolean"},"headers":{"type":"object","additionalProperties":{"type":"string","nullable":true}},"note":{"type":"string","nullable":true}},"example":{"domain":"cloudflare.com","https_reachable":true,"headers":{"strict-transport-security":"max-age=31536000; includeSubDomains","content-security-policy":"default-src 'self'","x-frame-options":"SAMEORIGIN"},"note":null}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/dns/propagation":{"post":{"operationId":"dnsPropagation","tags":["Lookup & Enrichment"],"summary":"DNS propagation check","description":"Queries multiple public DNS resolvers (Google, Cloudflare, Quad9) for a domain and reports whether results are consistent.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Domain name to check","example":"botoi.com"},"type":{"type":"string","description":"DNS record type (A, AAAA, CNAME, MX, TXT, etc.)","default":"A"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"type":{"type":"string"},"resolvers":{"type":"object","properties":{"google":{"type":"object"},"cloudflare":{"type":"object"},"quad9":{"type":"object"}}},"consistent":{"type":"boolean"}},"example":{"domain":"botoi.com","type":"A","resolvers":{"google":{"records":["104.21.32.1"],"ttl":300},"cloudflare":{"records":["104.21.32.1"],"ttl":300},"quad9":{"records":["104.21.32.1"],"ttl":300}},"consistent":true}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/ip/reverse":{"post":{"operationId":"ipReverse","tags":["Lookup & Enrichment"],"summary":"Reverse DNS (PTR) lookup","description":"Performs a reverse DNS lookup on an IP address and returns PTR records.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ip"],"properties":{"ip":{"type":"string","description":"IP address to look up","example":"8.8.8.8"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ip":{"type":"string"},"ptr_records":{"type":"array","items":{"type":"string"}},"query_time_ms":{"type":"number"}},"example":{"ip":"8.8.8.8","ptr_records":["dns.google"],"query_time_ms":12.4}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/ip/bulk":{"post":{"operationId":"ipBulk","tags":["Lookup & Enrichment"],"summary":"Bulk IP geolocation lookup","description":"Returns geolocation data for multiple IP addresses in a single request. Includes the caller's own IP info alongside results for each requested IP.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ips"],"properties":{"ips":{"type":"array","items":{"type":"string"},"description":"Array of IP addresses to look up","example":["8.8.8.8","1.1.1.1"]}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"note":{"type":"string"},"caller_ip":{"type":"string"},"caller_geo":{"type":"object"},"requested_ips":{"type":"array","items":{"type":"object"}}},"example":{"note":"Bulk IP lookup results","caller_ip":"203.0.113.1","caller_geo":{"country":"US","city":"San Francisco"},"requested_ips":[{"ip":"8.8.8.8","country":"US","city":"Mountain View"},{"ip":"1.1.1.1","country":"AU","city":"Sydney"}]}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/headers/":{"post":{"operationId":"headersInspect","tags":["Lookup & Enrichment"],"summary":"Inspect request headers","description":"Returns all HTTP headers sent by the client in the current request. Useful for debugging proxies, CDNs, and middleware.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"headers":{"type":"object","additionalProperties":{"type":"string"}},"count":{"type":"integer"}},"example":{"headers":{"user-agent":"curl/8.1.0","accept":"*/*","host":"api.botoi.com"},"count":3}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/phone/":{"post":{"operationId":"phoneValidate","tags":["Lookup & Enrichment"],"summary":"Validate a phone number","description":"Parses and validates a phone number. Returns formatted versions (E.164, national), country code, and country name.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["phone"],"properties":{"phone":{"type":"string","description":"Phone number to validate","example":"+14155552671"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"phone":{"type":"string"},"valid":{"type":"boolean"},"country_code":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"e164_format":{"type":"string","nullable":true},"national_format":{"type":"string","nullable":true}},"example":{"phone":"+14155552671","valid":true,"country_code":"US","country":"United States","e164_format":"+14155552671","national_format":"(415) 555-2671"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/company/":{"post":{"operationId":"companyLookup","tags":["Lookup & Enrichment"],"summary":"Company/domain info lookup","description":"Fetches publicly available information about a company from its domain, including page title, meta description, Open Graph data, and favicon URL.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Company domain to look up","example":"stripe.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"og":{"type":"object","properties":{"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"image":{"type":"string","nullable":true}}},"favicon_url":{"type":"string","nullable":true}},"example":{"domain":"stripe.com","title":"Stripe | Financial Infrastructure for the Internet","description":"Stripe powers online and in-person payment processing.","og":{"title":"Stripe","description":"Financial infrastructure for the internet.","image":"https://stripe.com/img/v3/home/social.png"},"favicon_url":"https://stripe.com/favicon.ico"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/text/truncate":{"post":{"operationId":"textTruncate","tags":["Text & Data"],"summary":"Smart text truncation","description":"Truncates text to a given length, breaking at word or sentence boundaries to avoid cutting mid-word.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text","max_length"],"properties":{"text":{"type":"string","description":"Text to truncate","example":"The quick brown fox jumps over the lazy dog."},"max_length":{"type":"integer","description":"Maximum character length","example":20},"boundary":{"type":"string","enum":["word","sentence"],"description":"Where to break the text","default":"word"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"original_length":{"type":"integer"},"truncated_length":{"type":"integer"},"text":{"type":"string"},"boundary":{"type":"string"},"was_truncated":{"type":"boolean"}},"example":{"original_length":44,"truncated_length":19,"text":"The quick brown fox...","boundary":"word","was_truncated":true}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/text/extract-urls":{"post":{"operationId":"textExtractUrls","tags":["Text & Data"],"summary":"Extract URLs from text","description":"Scans input text and extracts all URLs found within it.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"Text to scan for URLs","example":"Visit https://botoi.com and https://github.com for more info."}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"urls":{"type":"array","items":{"type":"string"}},"count":{"type":"integer"}},"example":{"urls":["https://botoi.com","https://github.com"],"count":2}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/text/extract-emails":{"post":{"operationId":"textExtractEmails","tags":["Text & Data"],"summary":"Extract email addresses from text","description":"Scans input text and extracts all email addresses found within it.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"Text to scan for email addresses","example":"Contact us at hello@botoi.com or support@botoi.com."}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"emails":{"type":"array","items":{"type":"string"}},"count":{"type":"integer"}},"example":{"emails":["hello@botoi.com","support@botoi.com"],"count":2}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/text/language":{"post":{"operationId":"textLanguage","tags":["Text & Data"],"summary":"Detect text language","description":"Detects the language of the input text and returns a confidence score along with other candidate languages.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"Text to analyze","example":"Bonjour, comment allez-vous?"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"detected_language":{"type":"string"},"confidence":{"type":"number"},"languages":{"type":"array","items":{"type":"object","properties":{"language":{"type":"string"},"confidence":{"type":"number"}}}}},"example":{"detected_language":"fr","confidence":0.97,"languages":[{"language":"fr","confidence":0.97},{"language":"en","confidence":0.02}]}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/text/case":{"post":{"operationId":"textCase","tags":["Text & Data"],"summary":"Convert text case","description":"Converts text between camelCase, snake_case, kebab-case, PascalCase, and CONSTANT_CASE.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text","to"],"properties":{"text":{"type":"string","description":"Text to convert","example":"hello world example"},"to":{"type":"string","enum":["camel","snake","kebab","pascal","constant"],"description":"Target case format","example":"camel"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"original":{"type":"string"},"converted":{"type":"string"},"format":{"type":"string"}},"example":{"original":"hello world example","converted":"helloWorldExample","format":"camel"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/html-sanitize/":{"post":{"operationId":"htmlSanitize","tags":["Text & Data"],"summary":"Sanitize HTML","description":"Strips dangerous tags and attributes from HTML while preserving allowed elements. Useful for cleaning user-generated content.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["html"],"properties":{"html":{"type":"string","description":"HTML string to sanitize","example":"<p>Hello</p><script>alert(\"xss\")</script>"},"allowed_tags":{"type":"array","items":{"type":"string"},"description":"List of allowed HTML tags","example":["p","b","i","a"]}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sanitized":{"type":"string"},"removed_tags":{"type":"array","items":{"type":"string"}},"removed_attributes":{"type":"array","items":{"type":"string"}}},"example":{"sanitized":"<p>Hello</p>","removed_tags":["script"],"removed_attributes":[]}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/csv/to-json":{"post":{"operationId":"csvToJson","tags":["Text & Data"],"summary":"Convert CSV to JSON","description":"Parses a CSV string and returns an array of JSON objects. Supports custom delimiters and optional header row.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["csv"],"properties":{"csv":{"type":"string","description":"CSV data as a string","example":"name,age\nAlice,30\nBob,25"},"delimiter":{"type":"string","description":"Column delimiter character","default":","},"has_header":{"type":"boolean","description":"Whether the first row contains column headers","default":true}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}},"rows":{"type":"integer"},"columns":{"type":"integer"}},"example":{"data":[{"name":"Alice","age":"30"},{"name":"Bob","age":"25"}],"rows":2,"columns":2}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/csv/to-csv":{"post":{"operationId":"jsonToCsv","tags":["Text & Data"],"summary":"Convert JSON to CSV","description":"Converts an array of JSON objects to CSV format. Supports custom delimiters and optional header row.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object"},"description":"Array of JSON objects to convert","example":[{"name":"Alice","age":30},{"name":"Bob","age":25}]},"delimiter":{"type":"string","description":"Column delimiter character","default":","},"include_header":{"type":"boolean","description":"Include a header row from object keys","default":true}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"csv":{"type":"string"},"rows":{"type":"integer"},"columns":{"type":"integer"}},"example":{"csv":"name,age\nAlice,30\nBob,25","rows":2,"columns":2}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/xml/to-json":{"post":{"operationId":"xmlToJson","tags":["Text & Data"],"summary":"Convert XML to JSON","description":"Parses an XML string and returns a JSON representation of the document structure.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["xml"],"properties":{"xml":{"type":"string","description":"XML string to convert","example":"<root><name>Alice</name><age>30</age></root>"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"data":{"type":"object"}},"example":{"data":{"root":{"name":"Alice","age":"30"}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/jwt/generate":{"post":{"operationId":"jwtGenerate","tags":["Developer Utilities"],"summary":"Generate a signed JWT","description":"Signs a JSON payload into a JWT using HMAC-SHA256. Supports optional expiration time.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["payload","secret"],"properties":{"payload":{"type":"object","description":"JSON payload to encode in the token","example":{"sub":"user_123","role":"admin"}},"secret":{"type":"string","description":"HMAC secret key for signing","example":"my-secret-key"},"expires_in":{"type":"integer","description":"Token expiration time in seconds","example":3600}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"token":{"type":"string"},"expires_at":{"type":"string","nullable":true},"expires_in":{"type":"integer","nullable":true}},"example":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...","expires_at":"2026-03-24T13:00:00Z","expires_in":3600}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/hash/hmac":{"post":{"operationId":"hashHmac","tags":["Developer Utilities"],"summary":"Generate an HMAC signature","description":"Computes an HMAC digest of the input text using a secret key and the specified hash algorithm (SHA-256 or SHA-512).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text","key","algorithm"],"properties":{"text":{"type":"string","description":"Text to sign","example":"Hello, World!"},"key":{"type":"string","description":"Secret key","example":"my-secret"},"algorithm":{"type":"string","enum":["sha256","sha512"],"description":"Hash algorithm","example":"sha256"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"hmac":{"type":"string"},"algorithm":{"type":"string"}},"example":{"hmac":"a1b2c3d4e5f6...","algorithm":"sha256"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/totp/generate":{"post":{"operationId":"totpGenerate","tags":["Developer Utilities"],"summary":"Generate a TOTP code","description":"Generates a time-based one-time password (TOTP) from a shared secret. Compatible with Google Authenticator and similar apps.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["secret"],"properties":{"secret":{"type":"string","description":"Base32-encoded shared secret","example":"JBSWY3DPEHPK3PXP"},"period":{"type":"integer","description":"Time step in seconds","default":30},"digits":{"type":"integer","description":"Number of digits in the code","default":6}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"code":{"type":"string"},"remaining_seconds":{"type":"integer"},"period":{"type":"integer"}},"example":{"code":"284759","remaining_seconds":18,"period":30}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/totp/validate":{"post":{"operationId":"totpValidate","tags":["Developer Utilities"],"summary":"Validate a TOTP code","description":"Validates a TOTP code against a shared secret. Supports a configurable time window to account for clock drift.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["secret","code"],"properties":{"secret":{"type":"string","description":"Base32-encoded shared secret","example":"JBSWY3DPEHPK3PXP"},"code":{"type":"string","description":"TOTP code to validate","example":"284759"},"period":{"type":"integer","description":"Time step in seconds","default":30},"digits":{"type":"integer","description":"Number of digits expected","default":6},"window":{"type":"integer","description":"Number of time steps to check before and after current","default":1}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"valid":{"type":"boolean"},"drift":{"type":"integer"}},"example":{"valid":true,"drift":0}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/uuid/v7":{"post":{"operationId":"uuidV7","tags":["Developer Utilities"],"summary":"Generate a UUID v7","description":"Generates a UUID v7 (time-ordered, RFC 9562). Embeds a Unix timestamp for natural sortability.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"uuid":{"type":"string"},"timestamp":{"type":"string"},"version":{"type":"integer"}},"example":{"uuid":"019508a0-7b3c-7def-8a12-3456789abcde","timestamp":"2026-03-24T12:00:00.000Z","version":7}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/timestamp/convert":{"post":{"operationId":"timestampConvert","tags":["Developer Utilities"],"summary":"Convert between timestamp formats","description":"Converts a timestamp between Unix epoch (seconds/milliseconds), ISO 8601, and RFC 2822 formats. Also returns day of week and relative time.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["timestamp"],"properties":{"timestamp":{"oneOf":[{"type":"string"},{"type":"number"}],"description":"Timestamp to convert (Unix seconds, Unix ms, or ISO 8601 string)","example":1711281600},"from":{"type":"string","description":"Source format hint (unix, unix_ms, iso)"},"to":{"type":"string","description":"Target format hint"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"unix":{"type":"number"},"unix_ms":{"type":"number"},"iso":{"type":"string"},"rfc2822":{"type":"string"},"relative":{"type":"string"},"day_of_week":{"type":"string"},"is_past":{"type":"boolean"}},"example":{"unix":1711281600,"unix_ms":1711281600000,"iso":"2024-03-24T12:00:00.000Z","rfc2822":"Sun, 24 Mar 2024 12:00:00 +0000","relative":"2 years ago","day_of_week":"Sunday","is_past":true}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/semver/compare":{"post":{"operationId":"semverCompare","tags":["Developer Utilities"],"summary":"Compare two semantic versions","description":"Compares two semver strings and returns which is greater, lesser, or equal.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["version_a","version_b"],"properties":{"version_a":{"type":"string","description":"First version","example":"2.1.0"},"version_b":{"type":"string","description":"Second version","example":"2.0.5"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"version_a":{"type":"string"},"version_b":{"type":"string"},"result":{"type":"integer"},"description":{"type":"string"}},"example":{"version_a":"2.1.0","version_b":"2.0.5","result":1,"description":"2.1.0 is greater than 2.0.5"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/semver/validate":{"post":{"operationId":"semverValidate","tags":["Developer Utilities"],"summary":"Validate a semantic version string","description":"Checks whether a string is a valid semver and returns its parsed components (major, minor, patch, prerelease, build metadata).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["version"],"properties":{"version":{"type":"string","description":"Version string to validate","example":"3.2.1-beta.1+build.42"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"valid":{"type":"boolean"},"major":{"type":"integer","nullable":true},"minor":{"type":"integer","nullable":true},"patch":{"type":"integer","nullable":true},"prerelease":{"type":"string","nullable":true},"build_metadata":{"type":"string","nullable":true}},"example":{"valid":true,"major":3,"minor":2,"patch":1,"prerelease":"beta.1","build_metadata":"build.42"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/yaml/to-json":{"post":{"operationId":"yamlToJson","tags":["Developer Utilities"],"summary":"Convert YAML to JSON","description":"Parses a YAML string and returns the equivalent JSON object.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["yaml"],"properties":{"yaml":{"type":"string","description":"YAML string to convert","example":"name: Alice\nage: 30\n"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"data":{"type":"object"}},"example":{"data":{"name":"Alice","age":30}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/yaml/to-yaml":{"post":{"operationId":"jsonToYaml","tags":["Developer Utilities"],"summary":"Convert JSON to YAML","description":"Converts a JSON object to a YAML string with configurable indentation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","description":"JSON object to convert","example":{"name":"Alice","age":30}},"indent":{"type":"integer","description":"Number of spaces for indentation","default":2}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"yaml":{"type":"string"}},"example":{"yaml":"name: Alice\nage: 30\n"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/math/evaluate":{"post":{"operationId":"mathEvaluate","tags":["Developer Utilities"],"summary":"Evaluate a math expression","description":"Safely evaluates a mathematical expression string and returns the numeric result. Supports basic arithmetic, parentheses, and common math functions.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["expression"],"properties":{"expression":{"type":"string","description":"Mathematical expression to evaluate","example":"(2 + 3) * 4 / 2"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"expression":{"type":"string"},"result":{"type":"number"}},"example":{"expression":"(2 + 3) * 4 / 2","result":10}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/units/convert":{"post":{"operationId":"unitsConvert","tags":["Developer Utilities"],"summary":"Convert between units","description":"Converts a value from one unit to another. Supports length, weight, temperature, volume, data size, and more.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["value","from","to"],"properties":{"value":{"type":"number","description":"Numeric value to convert","example":100},"from":{"type":"string","description":"Source unit","example":"celsius"},"to":{"type":"string","description":"Target unit","example":"fahrenheit"},"category":{"type":"string","description":"Unit category hint (temperature, length, weight, etc.)"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"value":{"type":"number"},"from":{"type":"string"},"to":{"type":"string"},"result":{"type":"number"},"category":{"type":"string"},"formula":{"type":"string"}},"example":{"value":100,"from":"celsius","to":"fahrenheit","result":212,"category":"temperature","formula":"(C * 9/5) + 32"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/placeholder/":{"post":{"operationId":"placeholderImage","tags":["Image & Media"],"summary":"Generate a placeholder image","description":"Generates an SVG placeholder image with configurable dimensions, background color, text color, and overlay text.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["width"],"properties":{"width":{"type":"integer","description":"Image width in pixels","example":400},"height":{"type":"integer","description":"Image height in pixels (defaults to width)","example":300},"bg_color":{"type":"string","description":"Background color (hex)","default":"#cccccc"},"text_color":{"type":"string","description":"Text color (hex)","default":"#333333"},"text":{"type":"string","description":"Overlay text (defaults to WxH)"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"}},"example":{"svg":"<svg ...>...</svg>","width":400,"height":300}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}},"get":{"operationId":"placeholderImageGet","tags":["Image & Media"],"summary":"Generate a placeholder image (GET)","description":"Returns an SVG placeholder image at the requested dimensions. Intended for direct use in `<img src>` without JSON parsing.","parameters":[{"name":"width","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":4000}},{"name":"height","in":"query","schema":{"type":"integer","minimum":1,"maximum":4000}},{"name":"bg_color","in":"query","schema":{"type":"string","example":"#cccccc"}},{"name":"text_color","in":"query","schema":{"type":"string","example":"#666666"}},{"name":"text","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"SVG image with Content-Type image/svg+xml"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/avatar/":{"post":{"operationId":"avatarGenerate","tags":["Image & Media"],"summary":"Generate an avatar/identicon","description":"Generates a unique, deterministic SVG avatar (identicon) based on the provided seed string. Useful for default user avatars.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["seed"],"properties":{"seed":{"type":"string","description":"Seed string (email, username, etc.)","example":"user@example.com"},"size":{"type":"integer","description":"Image size in pixels","default":128},"bg_color":{"type":"string","description":"Background color override (hex)"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string"},"seed":{"type":"string"},"size":{"type":"integer"}},"example":{"svg":"<svg ...>...</svg>","seed":"user@example.com","size":128}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/favicon/":{"post":{"operationId":"faviconExtract","tags":["Image & Media"],"summary":"Extract favicons from a domain","description":"Fetches a domain's HTML and extracts all favicon and icon links. Returns the primary favicon URL along with all discovered icons.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Domain to extract favicons from","example":"github.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"favicons":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"type":{"type":"string","nullable":true},"sizes":{"type":"string","nullable":true}}}},"primary_favicon":{"type":"string","nullable":true}},"example":{"domain":"github.com","favicons":[{"url":"https://github.com/favicon.ico","type":"image/x-icon","sizes":null},{"url":"https://github.com/apple-touch-icon.png","type":"image/png","sizes":"180x180"}],"primary_favicon":"https://github.com/favicon.ico"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/barcode/":{"post":{"operationId":"barcodeGenerate","tags":["Image & Media"],"summary":"Generate a barcode","description":"Generates an SVG barcode (Code 128) from the provided data string. Supports configurable dimensions and optional text display.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"string","description":"Data to encode in the barcode","example":"1234567890"},"width":{"type":"integer","description":"Barcode width in pixels","default":200},"height":{"type":"integer","description":"Barcode height in pixels","default":100},"show_text":{"type":"boolean","description":"Display the data text below the barcode","default":true}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"svg":{"type":"string"},"data":{"type":"string"},"encoding":{"type":"string"}},"example":{"svg":"<svg ...>...</svg>","data":"1234567890","encoding":"CODE128"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/validate/credit-card":{"post":{"operationId":"validateCreditCard","tags":["Security & Validation"],"summary":"Validate a credit card number","description":"Validates a credit card number using the Luhn algorithm. Returns the card type (Visa, Mastercard, Amex, etc.) and a masked version of the number.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["number"],"properties":{"number":{"type":"string","description":"Credit card number to validate","example":"4111111111111111"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"valid":{"type":"boolean"},"card_type":{"type":"string","nullable":true},"masked":{"type":"string"}},"example":{"valid":true,"card_type":"Visa","masked":"****-****-****-1111"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/validate/iban":{"post":{"operationId":"validateIban","tags":["Security & Validation"],"summary":"Validate an IBAN","description":"Validates an International Bank Account Number (IBAN). Returns the country code, country name, and formatted IBAN.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["iban"],"properties":{"iban":{"type":"string","description":"IBAN to validate","example":"DE89370400440532013000"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"valid":{"type":"boolean"},"country_code":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"formatted":{"type":"string"}},"example":{"valid":true,"country_code":"DE","country":"Germany","formatted":"DE89 3704 0044 0532 0130 00"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/validate/vat":{"post":{"operationId":"validateVat","tags":["Security & Validation"],"summary":"Validate a VAT number","description":"Validates a European VAT identification number. Returns the country code, country name, and formatted VAT number.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["vat_number"],"properties":{"vat_number":{"type":"string","description":"VAT number to validate","example":"DE123456789"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"valid":{"type":"boolean"},"country_code":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"formatted":{"type":"string"}},"example":{"valid":true,"country_code":"DE","country":"Germany","formatted":"DE 123456789"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/encrypt/encrypt":{"post":{"operationId":"aesEncrypt","tags":["Security & Validation"],"summary":"Encrypt text with AES-256-GCM","description":"Encrypts plaintext using AES-256-GCM with a password-derived key. Returns a Base64-encoded ciphertext string.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["plaintext","password"],"properties":{"plaintext":{"type":"string","description":"Text to encrypt","example":"Hello, secret world!"},"password":{"type":"string","description":"Encryption password (used to derive the key)","example":"my-strong-password"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ciphertext":{"type":"string"},"algorithm":{"type":"string"},"note":{"type":"string"}},"example":{"ciphertext":"YWJjZGVmZzEyMzQ1Njc4OQ==...","algorithm":"AES-256-GCM","note":"Store the ciphertext securely. You need the same password to decrypt."}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/encrypt/decrypt":{"post":{"operationId":"aesDecrypt","tags":["Security & Validation"],"summary":"Decrypt AES-256-GCM ciphertext","description":"Decrypts a Base64-encoded AES-256-GCM ciphertext using the original password.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ciphertext","password"],"properties":{"ciphertext":{"type":"string","description":"Base64-encoded ciphertext to decrypt","example":"YWJjZGVmZzEyMzQ1Njc4OQ==..."},"password":{"type":"string","description":"Password used during encryption","example":"my-strong-password"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"plaintext":{"type":"string"}},"example":{"plaintext":"Hello, secret world!"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/otp/generate":{"post":{"operationId":"otpGenerate","tags":["Security & Validation"],"summary":"Generate a one-time password","description":"Generates a cryptographically random numeric OTP code with configurable length and purpose label.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"length":{"type":"integer","description":"Number of digits in the OTP (4-10)","default":6},"purpose":{"type":"string","description":"Label describing the OTP purpose","example":"email-verification"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"code":{"type":"string"},"length":{"type":"integer"},"expires_in":{"type":"integer"},"generated_at":{"type":"string"}},"example":{"code":"384729","length":6,"expires_in":300,"generated_at":"2026-03-24T12:00:00Z"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/mcp/tools.json":{"get":{"operationId":"mcpTools","tags":["Discovery"],"summary":"MCP tool manifest","description":"Returns all Botoi API endpoints as MCP-compatible tool definitions for AI agent discovery. No authentication required.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"server":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"description":{"type":"string"}}},"tools":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"inputSchema":{"type":"object"}}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}}}}},"/v1/address/validate":{"post":{"operationId":"addressValidate","tags":["Lookup"],"summary":"Validate and parse a freeform address","description":"Geocodes a freeform address via Nominatim and returns structured components, coordinates, and a confidence score.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["address"],"properties":{"address":{"type":"string","description":"Freeform address to validate","example":"1600 Amphitheatre Parkway, Mountain View, CA"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"valid":{"type":"boolean"},"formatted_address":{"type":"string"},"components":{"type":"object","properties":{"house_number":{"type":"string"},"road":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"postcode":{"type":"string"},"country":{"type":"string"},"country_code":{"type":"string"}}},"location":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}}},"confidence":{"type":"number"},"type":{"type":"string"}},"example":{"valid":true,"formatted_address":"1600 Amphitheatre Parkway, Mountain View, CA 94043, USA","components":{"house_number":"1600","road":"Amphitheatre Parkway","city":"Mountain View","state":"California","postcode":"94043","country":"United States","country_code":"us"},"location":{"lat":37.4224,"lng":-122.0842},"confidence":0.95,"type":"building"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Address not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/address/autocomplete":{"post":{"operationId":"addressAutocomplete","tags":["Lookup"],"summary":"Autocomplete address suggestions","description":"Returns up to 5 address suggestions for partial input using the Photon geocoder.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"Partial address to autocomplete","example":"1600 Amphithea"},"limit":{"type":"integer","description":"Max suggestions (1-10)","default":5},"lang":{"type":"string","description":"ISO 639-1 language code","default":"en"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"query":{"type":"string"},"suggestions":{"type":"array","items":{"type":"object","properties":{"formatted":{"type":"string"},"components":{"type":"object"},"location":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}}}}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/geo/batch":{"post":{"operationId":"geoBatch","tags":["Lookup"],"summary":"Batch geocode up to 10 addresses","description":"Geocodes multiple addresses in parallel. Individual failures do not fail the batch.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["addresses"],"properties":{"addresses":{"type":"array","items":{"type":"string"},"maxItems":10,"description":"Array of addresses to geocode (max 10)","example":["London, UK","Paris, France"]}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"lat":{"type":"number","nullable":true},"lng":{"type":"number","nullable":true},"display_name":{"type":"string"},"type":{"type":"string"},"error":{"type":"string"}}}},"total":{"type":"integer"},"resolved":{"type":"integer"},"failed":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/disposable-email/list":{"get":{"operationId":"disposableEmailListGet","tags":["Lookup"],"summary":"List all known disposable email domains","description":"Returns the full list of known disposable email domains. Accepts optional `q` or `search` query params for case-insensitive substring matching against the domain name.","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Filter domains containing this substring"},{"name":"search","in":"query","required":false,"schema":{"type":"string"},"description":"Alias of `q`"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"integer"},"domains":{"type":"array","items":{"type":"string"}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}},"post":{"operationId":"disposableEmailList","tags":["Lookup"],"summary":"List all known disposable email domains","description":"Returns the full list of known disposable email domains. Optionally filter by search string.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"search":{"type":"string","description":"Filter domains containing this substring","example":"mail"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"count":{"type":"integer"},"domains":{"type":"array","items":{"type":"string"}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/breach/check":{"post":{"operationId":"breachCheck","tags":["Security"],"summary":"Check if a password has been in a data breach","description":"Uses the Have I Been Pwned k-Anonymity API to check if a password has appeared in known data breaches. The full password is never sent over the wire.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["password"],"properties":{"password":{"type":"string","description":"Password to check","example":"P@ssw0rd123"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"breached":{"type":"boolean"},"breach_count":{"type":"integer"},"recommendation":{"type":"string"}},"example":{"breached":true,"breach_count":37615,"recommendation":"This password has appeared in data breaches. Choose a different password."}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/dns-monitor/check":{"post":{"operationId":"dnsMonitorCheck","tags":["Lookup"],"summary":"Monitor DNS record changes for a domain","description":"Checks current DNS records and compares against a previous snapshot. Detects changes since the last check.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Domain to monitor","example":"example.com"},"types":{"type":"array","items":{"type":"string","enum":["A","AAAA","MX","TXT","NS","CNAME","SOA","PTR"]},"description":"DNS record types to check","default":["A","AAAA","MX","TXT","NS","CNAME"]}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"checked_at":{"type":"string","format":"date-time"},"previous_check":{"type":"string","format":"date-time","nullable":true},"changes_detected":{"type":"boolean"},"records":{"type":"object","additionalProperties":{"type":"object","properties":{"current":{"type":"array","items":{"type":"string"}},"previous":{"type":"array","items":{"type":"string"}},"changed":{"type":"boolean"}}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/ssl-cert/certificate":{"post":{"operationId":"sslCertCertificate","tags":["Lookup"],"summary":"Check HTTPS reachability and security headers for a domain","description":"Fetches the domain over HTTPS and returns reachability, status code, selected response headers, and a summary of security header presence (HSTS, CSP, X-Frame-Options, X-Content-Type-Options).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Domain to check","example":"github.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"https_reachable":{"type":"boolean"},"status_code":{"type":"integer"},"headers":{"type":"object","additionalProperties":{"type":"string"}},"security_headers":{"type":"object","properties":{"hsts":{"type":"boolean"},"csp":{"type":"boolean"},"x_frame_options":{"type":"boolean"},"x_content_type_options":{"type":"boolean"}}}},"example":{"domain":"github.com","https_reachable":true,"status_code":200,"headers":{"strict-transport-security":"max-age=31536000; includeSubdomains; preload","content-security-policy":"default-src 'none'","x-frame-options":"deny","x-content-type-options":"nosniff"},"security_headers":{"hsts":true,"csp":true,"x_frame_options":true,"x_content_type_options":true}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/ssl-cert/expiry":{"post":{"operationId":"sslCertExpiry","tags":["Lookup"],"summary":"Check SSL certificate expiry for a domain","description":"Looks up certificate details from Certificate Transparency logs and returns expiry information.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Domain to check","example":"github.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"issuer":{"type":"string"},"subject":{"type":"string"},"valid_from":{"type":"string","format":"date-time"},"valid_to":{"type":"string","format":"date-time"},"days_remaining":{"type":"integer"},"expired":{"type":"boolean"},"expiring_soon":{"type":"boolean"}},"example":{"domain":"github.com","issuer":"DigiCert Inc","subject":"github.com","valid_from":"2024-03-07T00:00:00Z","valid_to":"2025-03-12T23:59:59Z","days_remaining":290,"expired":false,"expiring_soon":false}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"No certificates found for domain","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/accessibility/check":{"post":{"operationId":"accessibilityCheck","tags":["Lookup"],"summary":"Run accessibility checks on a webpage","description":"Fetches a URL and runs 10 basic accessibility checks on the HTML, including alt text, heading order, form labels, and more.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"URL to check (must start with http:// or https://)","example":"https://example.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string"},"score":{"type":"integer"},"issues":{"type":"array","items":{"type":"object","properties":{"rule":{"type":"string"},"severity":{"type":"string","enum":["error","warning"]},"count":{"type":"integer"},"description":{"type":"string"}}}},"summary":{"type":"object","properties":{"errors":{"type":"integer"},"warnings":{"type":"integer"},"passes":{"type":"integer"},"total_checks":{"type":"integer"}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/weather/current":{"post":{"operationId":"weatherCurrent","tags":["Lookup"],"summary":"Get current weather","description":"Returns current weather conditions for a city name or lat/lng coordinates. Powered by Open-Meteo.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"city":{"type":"string","description":"City name to look up","example":"London"},"lat":{"type":"number","description":"Latitude (-90 to 90)"},"lng":{"type":"number","description":"Longitude (-180 to 180)"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"location":{"type":"object","properties":{"city":{"type":"string"},"country":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"}}},"temperature":{"type":"object","properties":{"current":{"type":"number"},"feels_like":{"type":"number"},"unit":{"type":"string"}}},"humidity":{"type":"number"},"precipitation":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string"}}},"wind":{"type":"object","properties":{"speed":{"type":"number"},"direction":{"type":"number"},"gusts":{"type":"number"},"unit":{"type":"string"}}},"cloud_cover":{"type":"number"},"weather_code":{"type":"integer"},"description":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/air-quality/check":{"post":{"operationId":"airQualityCheck","tags":["Lookup"],"summary":"Check air quality by location","description":"Returns current air quality index and pollutant levels for given coordinates. Powered by Open-Meteo.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["lat","lng"],"properties":{"lat":{"type":"number","description":"Latitude","example":40.7128},"lng":{"type":"number","description":"Longitude","example":-74.006}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"location":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}}},"aqi":{"type":"object","properties":{"us":{"type":"number"},"european":{"type":"number"}}},"aqi_category":{"type":"string"},"pollutants":{"type":"object"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/elevation/lookup":{"post":{"operationId":"elevationLookup","tags":["Lookup"],"summary":"Get elevation for coordinates","description":"Returns elevation in meters for a single point or batch of up to 10 coordinates. Powered by Open-Meteo.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lat":{"type":"number","description":"Latitude for single lookup"},"lng":{"type":"number","description":"Longitude for single lookup"},"locations":{"type":"array","items":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}}},"description":"Array of coordinates for batch lookup (max 10)"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"},"elevation":{"type":"number"},"unit":{"type":"string","example":"m"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/on-water/check":{"post":{"operationId":"onWaterCheck","tags":["Lookup"],"summary":"Check if coordinates are on water","description":"Determines whether a geographic point is on water or land.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["lat","lng"],"properties":{"lat":{"type":"number","description":"Latitude","example":41.01},"lng":{"type":"number","description":"Longitude","example":28.98}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"},"water":{"type":"boolean"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/phishing/check":{"post":{"operationId":"phishingCheck","tags":["Security"],"summary":"Check URL for phishing/malware","description":"Checks whether a URL is a known phishing or malware URL using the URLhaus database.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"URL to check","example":"https://example.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string"},"is_malicious":{"type":"boolean"},"threat_type":{"type":"string","nullable":true},"source":{"type":"string"},"details":{"type":"object","nullable":true}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/carbon/estimate":{"post":{"operationId":"carbonEstimate","tags":["Lookup"],"summary":"Estimate website carbon footprint","description":"Fetches a URL and estimates CO2 emissions per page view using the Green Web Foundation methodology (0.81 kWh/GB energy, 442 gCO2eq/kWh grid intensity).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Website URL to analyze","example":"https://www.google.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string"},"bytes":{"type":"number"},"co2_grams":{"type":"number"},"energy_kwh":{"type":"number"},"cleaner_than_percent":{"type":"number"},"methodology":{"type":"object"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/page-rank/check":{"post":{"operationId":"pageRankCheck","tags":["Lookup"],"summary":"Get domain page rank","description":"Returns the Open PageRank score and rank for a domain.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Domain to check","example":"google.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"page_rank_decimal":{"type":"number"},"rank":{"type":"integer"},"status_code":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/holidays/{country}/{year}":{"get":{"operationId":"holidaysGet","tags":["Lookup"],"summary":"Get public holidays by country and year","description":"Returns public holidays for a given country and year. Country is an ISO 3166-1 alpha-2 code; year is an integer between 1900 and 2100. Powered by Nager.Date.","parameters":[{"name":"country","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z]{2}$"},"description":"ISO 3166-1 alpha-2 country code","example":"US"},{"name":"year","in":"path","required":true,"schema":{"type":"integer","minimum":1900,"maximum":2100},"example":2026}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"country":{"type":"string"},"year":{"type":"integer"},"count":{"type":"integer"},"holidays":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"name":{"type":"string"},"local_name":{"type":"string"},"types":{"type":"array","items":{"type":"string"}},"counties":{"type":"array","items":{"type":"string"},"nullable":true},"launch_year":{"type":"integer","nullable":true}}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"No holiday data for country/year","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/bin/lookup":{"post":{"operationId":"binLookup","tags":["Lookup"],"summary":"Credit card BIN/IIN lookup","description":"Returns card network, type, issuing bank, and country for a BIN (first 6-8 digits of a card number).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["bin"],"properties":{"bin":{"type":"string","description":"First 6-8 digits of a card number","example":"45717360"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"bin":{"type":"string"},"scheme":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"brand":{"type":"string","nullable":true},"country":{"type":"object","nullable":true},"bank":{"type":"object","nullable":true},"prepaid":{"type":"boolean","nullable":true}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/domain-search/search":{"post":{"operationId":"domainSearch","tags":["Lookup"],"summary":"Search registered domains","description":"Search for registered domains by keyword. Powered by DomainsDB.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"Search keyword (min 2 chars)","example":"startup"},"zone":{"type":"string","description":"TLD zone filter","default":"com"},"limit":{"type":"integer","description":"Max results (1-100)","default":20}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"query":{"type":"string"},"zone":{"type":"string"},"count":{"type":"integer"},"domains":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"create_date":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"is_dead":{"type":"boolean"}}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/license/lookup":{"post":{"operationId":"licenseLookup","tags":["Developer Utilities"],"summary":"Get software license details","description":"Returns details, permissions, conditions, and limitations for a software license by SPDX ID.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"SPDX license identifier","example":"MIT"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"is_osi_approved":{"type":"boolean"},"is_fsf_libre":{"type":"boolean"},"is_deprecated":{"type":"boolean"},"permissions":{"type":"array","items":{"type":"string"}},"conditions":{"type":"array","items":{"type":"string"}},"limitations":{"type":"array","items":{"type":"string"}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/npm/{package}":{"get":{"operationId":"npmPackageGet","tags":["Developer Utilities"],"summary":"Get npm package info","description":"Returns metadata, version history, and dependency info for an npm package from the public registry. Scoped packages must be URL-encoded (e.g., `%40scope%2Fname` for `@scope/name`).","parameters":[{"name":"package","in":"path","required":true,"schema":{"type":"string"},"description":"npm package name (URL-encode scoped packages)","example":"express"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"description":{"type":"string","nullable":true},"license":{"type":"string","nullable":true},"homepage":{"type":"string","nullable":true},"repository":{"type":"string","nullable":true},"author":{"type":"object","nullable":true,"properties":{"name":{"type":"string"},"email":{"type":"string"}}},"keywords":{"type":"array","items":{"type":"string"}},"engines":{"type":"object","nullable":true,"additionalProperties":{"type":"string"}},"dependencies_count":{"type":"integer"},"maintainers":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"}}}},"created":{"type":"string","nullable":true},"modified":{"type":"string","nullable":true},"versions_count":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Package not found on npm","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/asn/lookup":{"post":{"operationId":"asnLookup","tags":["Lookup"],"summary":"Get ASN details","description":"Returns ASN organization, country, and RDAP registration data. Accepts numeric ASN or \"AS\" prefixed string. Uses RDAP and Cloudflare edge data.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["asn"],"properties":{"asn":{"type":"string","description":"ASN number (with or without \"AS\" prefix)","example":"AS13335"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"asn":{"type":"integer"},"organization":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"rdap":{"type":"object","nullable":true,"properties":{"handle":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"ip_range":{"type":"string","nullable":true},"registration_date":{"type":"string","nullable":true},"abuse_contact":{"type":"string","nullable":true}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/exchange/price":{"post":{"operationId":"cryptoPrice","tags":["Lookup"],"summary":"Get cryptocurrency price","description":"Returns current price, market cap, volume, and 24h change for a cryptocurrency. Powered by CoinGecko.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["coin"],"properties":{"coin":{"type":"string","description":"CoinGecko coin ID","example":"bitcoin"},"currencies":{"type":"array","items":{"type":"string"},"description":"Target currencies","default":["usd"]}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"coin":{"type":"string"},"prices":{"type":"object"},"market_caps":{"type":"object"},"volumes_24h":{"type":"object"},"change_24h":{"type":"object"},"last_updated":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/exchange/search":{"post":{"operationId":"cryptoSearch","tags":["Lookup"],"summary":"Search cryptocurrencies","description":"Search for cryptocurrencies by name or symbol.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"Search query","example":"ethereum"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"query":{"type":"string"},"coins":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"market_cap_rank":{"type":"integer"}}}},"count":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/age/estimate":{"post":{"operationId":"ageEstimate","tags":["Lookup"],"summary":"Estimate age from name","description":"Estimates the age of a person based on their first name. Powered by Agify.io.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"First name","example":"Michael"},"country_id":{"type":"string","description":"ISO 3166-1 alpha-2 country code for localization"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"name":{"type":"string"},"age":{"type":"integer","nullable":true},"count":{"type":"integer"},"country_id":{"type":"string","nullable":true}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/gender/estimate":{"post":{"operationId":"genderEstimate","tags":["Lookup"],"summary":"Estimate gender from name","description":"Estimates the gender of a person based on their first name. Powered by Genderize.io.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"First name","example":"Maria"},"country_id":{"type":"string","description":"ISO 3166-1 alpha-2 country code for localization"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"name":{"type":"string"},"gender":{"type":"string","nullable":true,"enum":["male","female"]},"probability":{"type":"number"},"count":{"type":"integer"},"country_id":{"type":"string","nullable":true}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/nationality/estimate":{"post":{"operationId":"nationalityEstimate","tags":["Lookup"],"summary":"Estimate nationality from name","description":"Estimates the most likely nationalities for a person based on their name. Powered by Nationalize.io.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Name to analyze","example":"Tanaka"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"name":{"type":"string"},"countries":{"type":"array","items":{"type":"object","properties":{"country_id":{"type":"string"},"probability":{"type":"number"}}}},"count":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/domain/report":{"post":{"operationId":"domainReport","tags":["Lookup"],"summary":"Full domain report","description":"Returns DNS records, WHOIS, SSL certificate, security headers, technology stack, and performance data for a domain in one call.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Domain to analyze","example":"github.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"dns":{"type":"object"},"whois":{"type":"object"},"ssl":{"type":"object"},"security_headers":{"type":"object"},"technologies":{"type":"array","items":{"type":"string"}},"performance":{"type":"object"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/security/grade":{"post":{"operationId":"securityGrade","tags":["Security & Validation"],"summary":"Grade website security headers","description":"Fetches a URL and grades its security headers (HSTS, CSP, X-Content-Type-Options, X-Frame-Options, Referrer-Policy, Permissions-Policy) from A+ to F with recommendations.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"URL to analyze","example":"https://github.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string"},"grade":{"type":"string"},"score":{"type":"number"},"max_score":{"type":"number"},"headers":{"type":"object"},"recommendations":{"type":"array","items":{"type":"string"}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/email-security/report":{"post":{"operationId":"emailSecurityReport","tags":["Lookup"],"summary":"Email security report (SPF + DMARC + DKIM)","description":"Checks SPF, DMARC, and DKIM records for a domain and returns a combined grade with specific fix recommendations.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Email domain to check","example":"google.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"grade":{"type":"string"},"score":{"type":"number"},"spf":{"type":"object"},"dmarc":{"type":"object"},"dkim":{"type":"object"},"recommendations":{"type":"array","items":{"type":"string"}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/social-preview/extract":{"post":{"operationId":"socialPreviewExtract","tags":["Lookup"],"summary":"Extract OG and Twitter meta tags","description":"Fetches a URL and extracts Open Graph, Twitter Card, and general meta tags for link preview validation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"URL to extract tags from","example":"https://github.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string"},"og":{"type":"object"},"twitter":{"type":"object"},"general":{"type":"object"},"warnings":{"type":"array","items":{"type":"string"}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/ip/intelligence":{"post":{"operationId":"ipIntelligence","tags":["Lookup"],"summary":"Rich IP profiling","description":"Returns geo, network, reverse DNS, VPN heuristics, and TLS connection data for the calling IP address.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ip":{"type":"string"},"geo":{"type":"object"},"network":{"type":"object"},"security":{"type":"object"},"tls":{"type":"object"},"connection":{"type":"object"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/site/performance":{"post":{"operationId":"sitePerformance","tags":["Lookup"],"summary":"Website performance profile","description":"Traces the redirect chain with per-hop timing, then measures TTFB, compression, and header count at the final URL.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"URL to profile","example":"https://example.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string"},"final_url":{"type":"string"},"status_code":{"type":"number"},"ttfb_ms":{"type":"number"},"total_time_ms":{"type":"number"},"compressed":{"type":"boolean"},"redirect_count":{"type":"number"},"redirect_chain":{"type":"array"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/dns/compare":{"post":{"operationId":"dnsCompare","tags":["Lookup"],"summary":"Compare DNS across 5 resolvers","description":"Queries a domain across Google, Cloudflare, Quad9, AdGuard, and Mullvad DNS resolvers and compares results side-by-side.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Domain to query","example":"example.com"},"type":{"type":"string","description":"DNS record type (default: A)","example":"A"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"type":{"type":"string"},"resolver_count":{"type":"number"},"resolvers":{"type":"object"},"consistent":{"type":"boolean"},"differences":{"type":"array"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/redirect/trace":{"post":{"operationId":"redirectTrace","tags":["Lookup"],"summary":"Trace redirect chain","description":"Follows the full redirect chain for a URL, recording status code, latency, server header, and location at each hop.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"URL to trace","example":"https://bit.ly/example"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"original_url":{"type":"string"},"final_url":{"type":"string"},"total_redirects":{"type":"number"},"total_time_ms":{"type":"number"},"hops":{"type":"array"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/tls/fingerprint":{"post":{"operationId":"tlsFingerprint","tags":["Lookup"],"summary":"TLS fingerprint (JA3/JA4)","description":"Returns the TLS version, cipher suite, HTTP protocol, TCP RTT, and JA3/JA4 fingerprint hashes for the calling connection.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"tls_version":{"type":"string"},"cipher":{"type":"string"},"http_protocol":{"type":"string"},"tcp_rtt_ms":{"type":"number"},"ja3_hash":{"type":"string"},"ja4":{"type":"string"},"bot_score":{"type":"number"},"verified_bot":{"type":"boolean"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/domain/availability":{"post":{"operationId":"domainAvailability","tags":["Lookup"],"summary":"Check domain availability","description":"Checks whether a domain name is available for registration via RDAP lookup. Returns registration status and registrar when the domain is taken.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"The domain name to check (e.g. \"example.com\")","example":"example.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"available":{"type":"boolean"},"registered":{"type":"boolean"},"registrar":{"type":"string"}},"example":{"domain":"example.com","available":false,"registered":true,"registrar":"ICANN"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/tech-detect/":{"post":{"operationId":"techDetect","tags":["Lookup"],"summary":"Detect technologies used by a website","description":"Fetches a URL and analyzes HTTP headers and HTML content to detect web servers, frameworks, CMS platforms, analytics tools, and more. Returns a list of detected technologies with confidence scores and grouped categories.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"The full URL to analyze (must start with http:// or https://)","example":"https://github.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string"},"technologies":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"category":{"type":"string"},"confidence":{"type":"number"}}}},"categories":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/vpn-detect/":{"post":{"operationId":"vpnDetect","tags":["Lookup"],"summary":"Detect VPN, proxy, or Tor usage for an IP","description":"Checks an IPv4 address against known datacenter CIDR ranges, Tor exit node lists, and reverse DNS hostname patterns to determine if the IP is associated with a VPN, proxy, or Tor network. Returns a risk score from 0 to 100.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ip"],"properties":{"ip":{"type":"string","description":"IPv4 address to check","example":"185.220.101.1"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ip":{"type":"string"},"is_vpn":{"type":"boolean"},"is_proxy":{"type":"boolean"},"is_tor":{"type":"boolean"},"is_datacenter":{"type":"boolean"},"provider":{"type":"string","nullable":true},"risk_score":{"type":"number"},"checks":{"type":"object","properties":{"tor":{"type":"boolean"},"datacenter":{"type":"boolean"},"suspicious_hostname":{"type":"boolean"}}}},"example":{"ip":"185.220.101.1","is_vpn":false,"is_proxy":false,"is_tor":true,"is_datacenter":false,"provider":null,"risk_score":90,"checks":{"tor":true,"datacenter":false,"suspicious_hostname":false}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/html-to-markdown/":{"post":{"operationId":"htmlToMarkdown","tags":["Text & Data"],"summary":"Convert HTML to Markdown","description":"Converts an HTML string to Markdown. Handles headings, paragraphs, lists, links, images, bold, italic, inline code, code blocks, blockquotes, and horizontal rules.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["html"],"properties":{"html":{"type":"string","description":"HTML string to convert to Markdown","example":"<h1>Hello</h1><p>This is <b>bold</b> text.</p>"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"markdown":{"type":"string"}},"example":{"markdown":"# Hello\n\nThis is **bold** text."}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/pii/detect":{"post":{"operationId":"piiDetect","tags":["Security"],"summary":"Detect personally identifiable information in text","description":"Scans text for PII patterns including email addresses, phone numbers, SSNs, credit card numbers (Luhn-validated), IP addresses, and dates of birth. Returns each finding with its type, position, and a masked version of the value.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"The text to scan for PII","example":"Contact john@example.com or call 555-123-4567."}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"found":{"type":"boolean"},"count":{"type":"integer"},"findings":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"PII type: email, phone, ssn, credit_card, ip_address, or date_of_birth"},"value":{"type":"string"},"start":{"type":"integer"},"end":{"type":"integer"},"masked":{"type":"string"}}}}},"example":{"found":true,"count":2,"findings":[{"type":"email","value":"john@example.com","start":8,"end":24,"masked":"jo**@example.com"},{"type":"phone","value":"555-123-4567","start":33,"end":45,"masked":"***-***-4567"}]}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/minify/js":{"post":{"operationId":"minifyJs","tags":["Developer Utilities"],"summary":"Minify JavaScript code","description":"Removes comments, collapses whitespace, and strips unnecessary characters from JavaScript code. Returns the minified output along with original size, minified size, and savings percentage.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"properties":{"code":{"type":"string","description":"JavaScript code to minify","example":"const x = 1; // a number\nconsole.log(x);"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"minified":{"type":"string"},"original_size":{"type":"integer"},"minified_size":{"type":"integer"},"savings_percent":{"type":"number"}},"example":{"minified":"const x=1;console.log(x);","original_size":40,"minified_size":26,"savings_percent":35}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/minify/css":{"post":{"operationId":"minifyCss","tags":["Developer Utilities"],"summary":"Minify CSS code","description":"Removes comments, collapses whitespace, and strips unnecessary characters from CSS code. Returns the minified output along with original size, minified size, and savings percentage.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"properties":{"code":{"type":"string","description":"CSS code to minify","example":"body {\n  margin: 0;\n  padding: 0;\n}"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"minified":{"type":"string"},"original_size":{"type":"integer"},"minified_size":{"type":"integer"},"savings_percent":{"type":"number"}},"example":{"minified":"body{margin:0;padding:0}","original_size":35,"minified_size":24,"savings_percent":31.43}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/minify/html":{"post":{"operationId":"minifyHtml","tags":["Developer Utilities"],"summary":"Minify HTML code","description":"Removes comments, collapses whitespace, and strips unnecessary characters from HTML code. Returns the minified output along with original size, minified size, and savings percentage.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"properties":{"code":{"type":"string","description":"HTML code to minify","example":"<html>\n  <body>\n    <p>Hello</p>\n  </body>\n</html>"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"minified":{"type":"string"},"original_size":{"type":"integer"},"minified_size":{"type":"integer"},"savings_percent":{"type":"number"}},"example":{"minified":"<html><body><p>Hello</p></body></html>","original_size":48,"minified_size":38,"savings_percent":20.83}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/sql/format":{"post":{"operationId":"sqlFormat","tags":["Developer Utilities"],"summary":"Format and prettify SQL queries","description":"Uppercases SQL keywords and adds line breaks before major clauses (SELECT, FROM, WHERE, JOIN, etc.) for readability. Supports an optional indent width for subqueries.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["sql"],"properties":{"sql":{"type":"string","description":"SQL query to format","example":"select id, name from users where active = true order by name"},"indent":{"type":"integer","description":"Number of spaces for indentation (default: 2)","default":2}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"formatted":{"type":"string"}},"example":{"formatted":"SELECT id, name\nFROM users\nWHERE active = TRUE\nORDER BY name"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/code/format":{"post":{"operationId":"codeFormat","tags":["Developer Utilities"],"summary":"Format source code","description":"Formats source code for a given language. Supported languages: javascript, json, html, css, sql, xml. Applies indentation, keyword casing (for SQL), and structural formatting.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code","language"],"properties":{"code":{"type":"string","description":"Source code to format","example":"{\"name\":\"botoi\",\"version\":\"1.0\"}"},"language":{"type":"string","description":"Programming language (javascript, json, html, css, sql, xml)","enum":["javascript","json","html","css","sql","xml"],"example":"json"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"formatted":{"type":"string"},"language":{"type":"string"}},"example":{"formatted":"{\n  \"name\": \"botoi\",\n  \"version\": \"1.0\"\n}","language":"json"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/schema/json-to-typescript":{"post":{"operationId":"jsonToTypescript","tags":["Developer Utilities"],"summary":"Convert a JSON value to a TypeScript interface","description":"Infers TypeScript types from a JSON value and generates an interface or type alias. Handles nested objects, arrays, and primitive types. Optionally accepts a custom interface name.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["json"],"properties":{"json":{"type":"object","description":"Any valid JSON value to convert (object, array, string, number, etc.)","example":{"name":"Alice","age":30,"active":true}},"name":{"type":"string","description":"Name for the generated interface (default: \"Root\")","default":"Root","example":"User"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"typescript":{"type":"string"},"name":{"type":"string"}},"example":{"typescript":"interface User {\n  name: string;\n  age: number;\n  active: boolean;\n}","name":"User"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/webhook/inbox/create":{"post":{"operationId":"webhookInboxCreate","tags":["Storage & Services"],"summary":"Create a webhook inbox","description":"Creates a temporary webhook inbox that captures incoming POST payloads for 24 hours. Useful for testing third-party webhook integrations without deploying a server.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"inbox_id":{"type":"string"},"url":{"type":"string","description":"URL where webhook providers should POST payloads"},"payloads_url":{"type":"string","description":"GET this URL to list captured payloads"},"expires_in":{"type":"integer","description":"Seconds until inbox expires"}},"example":{"inbox_id":"a1b2c3d4","url":"https://api.botoi.com/v1/webhook/inbox/a1b2c3d4/receive","payloads_url":"https://api.botoi.com/v1/webhook/inbox/a1b2c3d4/payloads","expires_in":86400}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/webhook/inbox/{id}/receive":{"post":{"operationId":"webhookInboxReceive","tags":["Storage & Services"],"summary":"Receive a webhook payload","description":"Captures an incoming POST payload into the specified inbox. Point webhook providers (Stripe, GitHub, etc.) to this URL. Accepts any JSON body.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Inbox ID returned from /v1/webhook/inbox/create","example":"a1b2c3d4"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"received":{"type":"boolean"},"payload_id":{"type":"string"}},"example":{"received":true,"payload_id":"e5f6g7h8"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"404":{"description":"Inbox not found or expired","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/webhook/inbox/{id}":{"get":{"operationId":"webhookInboxGet","tags":["Storage & Services"],"summary":"Get inbox metadata","description":"Returns metadata for a webhook inbox: creation time, receive URL, payloads URL, and current payload count.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"example":"a1b2c3d4"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"inbox_id":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"receive_url":{"type":"string"},"payloads_url":{"type":"string"},"payload_count":{"type":"integer"}},"example":{"inbox_id":"a1b2c3d4","created_at":"2026-04-15T10:00:00.000Z","receive_url":"https://api.botoi.com/v1/webhook/inbox/a1b2c3d4/receive","payloads_url":"https://api.botoi.com/v1/webhook/inbox/a1b2c3d4/payloads","payload_count":3}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"404":{"description":"Inbox not found or expired","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/webhook/inbox/{id}/payloads":{"get":{"operationId":"webhookInboxPayloads","tags":["Storage & Services"],"summary":"List captured webhook payloads","description":"Returns up to 50 of the most recent payloads captured by the inbox, each with an id, received_at timestamp, and the original JSON body.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"example":"a1b2c3d4"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"inbox_id":{"type":"string"},"count":{"type":"integer"},"payloads":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"received_at":{"type":"string","format":"date-time"},"body":{"type":"object","additionalProperties":true}}}}},"example":{"inbox_id":"a1b2c3d4","count":1,"payloads":[{"id":"e5f6g7h8","received_at":"2026-04-15T10:30:00.000Z","body":{"event":"payment.completed","amount":4999}}]}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"404":{"description":"Inbox not found or expired","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/webhook/inbox/{id}/list":{"post":{"operationId":"webhookInboxListDeprecated","tags":["Storage & Services"],"deprecated":true,"summary":"List captured webhook payloads (deprecated)","description":"Deprecated alias for `GET /v1/webhook/inbox/{id}/payloads`. Returns the same list of up to 50 recent payloads. Kept for SDK and backward compatibility. Prefer the GET endpoint for new integrations.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"example":"a1b2c3d4"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"inbox_id":{"type":"string"},"count":{"type":"integer"},"payloads":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"received_at":{"type":"string","format":"date-time"},"body":{"type":"object","additionalProperties":true}}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"404":{"description":"Inbox not found or expired","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/auth/signup":{"post":{"operationId":"authSignup","tags":["Auth"],"summary":"Send a magic-link signup email","description":"Sends a magic-link email to the provided address. Rate-limited to 3 requests per 15 minutes per IP. Clicking the link completes signup and provisions an API key on first use.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","example":"alice@example.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"message":{"type":"string"}},"example":{"message":"Check your email for a magic link"}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"429":{"description":"Too many signup requests","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/auth/verify":{"get":{"operationId":"authVerify","tags":["Auth"],"summary":"Verify a magic-link token","description":"Consumes a one-time magic-link token. On success, redirects to the dashboard with a session cookie and an optional claim token for first-time users. Never returns JSON; it issues a 302 redirect.","security":[],"parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string"},"description":"The magic-link token delivered by email"}],"responses":{"302":{"description":"Redirects to botoi.com/api/dashboard with session/claim params"}}}},"/auth/claim":{"get":{"operationId":"authClaim","tags":["Auth"],"summary":"Claim a freshly provisioned API key","description":"Exchanges a single-use claim token (returned after signup or key regeneration) for the plaintext API key. The claim token expires 5 minutes after issuance.","security":[],"parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string"},"description":"Claim token"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"key":{"type":"string","description":"Plaintext API key (shown once)"},"keyId":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Claim token expired or already used","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/auth/checkout-claim":{"get":{"operationId":"authCheckoutClaim","tags":["Auth"],"summary":"Finalize a Stripe checkout and claim an API key","description":"Fulfill-on-redirect endpoint for Stripe Checkout success URLs. Verifies the checkout session, provisions the user if needed, updates Unkey rate limits from the purchased tier, and returns session + claim tokens.","security":[],"parameters":[{"name":"checkout_session_id","in":"query","required":true,"schema":{"type":"string"},"description":"The Stripe Checkout session ID"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"sessionToken":{"type":"string"},"claimToken":{"type":"string","nullable":true},"existingUser":{"type":"boolean"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"402":{"description":"Payment has not completed yet","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Stripe checkout session not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/auth/me":{"get":{"operationId":"authMe","tags":["Auth"],"summary":"Get the signed-in user profile","description":"Returns the current user, keyId, tier, and rate-limit quotas. Requires a valid session cookie set by the magic-link flow.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"email":{"type":"string"},"keyId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"tier":{"type":"string","enum":["free","starter","pro","scale"]},"limits":{"type":"object","properties":{"requestsPerMinute":{"type":"integer"},"requestsPerDay":{"type":"integer"},"requestsPerMonth":{"type":"integer"}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/auth/usage":{"get":{"operationId":"authUsage","tags":["Auth"],"summary":"Get current API usage for the signed-in user","description":"Returns day and month usage counters plus the per-minute rate limit. Requires a valid session cookie.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"today":{"type":"object","properties":{"used":{"type":"integer"},"limit":{"type":"integer"}}},"month":{"type":"object","properties":{"used":{"type":"integer"},"limit":{"type":"integer"}}},"rateLimit":{"type":"object","properties":{"perMinute":{"type":"integer"}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/auth/regenerate":{"post":{"operationId":"authRegenerate","tags":["Auth"],"summary":"Rotate the signed-in user API key","description":"Revokes the existing Unkey key and provisions a new one. Returns a short-lived claim token used to fetch the new plaintext key. Requires a valid session cookie.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"claimToken":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"User not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/billing/checkout":{"post":{"operationId":"billingCheckout","tags":["Billing"],"summary":"Create a Stripe Checkout session","description":"Creates a subscription Checkout session for the selected price tier. Returns the hosted Stripe URL to redirect the customer to. Public endpoint; users do not need an API key yet.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["priceId"],"properties":{"priceId":{"type":"string","description":"Stripe price ID for one of the Botoi subscription tiers","example":"price_1QabcdEFgh1234"},"email":{"type":"string","format":"email"},"successUrl":{"type":"string"},"cancelUrl":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string"},"sessionId":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/billing/portal":{"post":{"operationId":"billingPortal","tags":["Billing"],"summary":"Create a Stripe Billing Portal session","description":"Creates a Stripe Customer Portal session so the user can update payment methods, download invoices, or cancel. Requires a valid session cookie.","security":[],"parameters":[{"name":"returnUrl","in":"query","required":false,"schema":{"type":"string"},"description":"URL Stripe redirects to when the user exits the portal"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"No active subscription found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/billing/change-plan":{"post":{"operationId":"billingChangePlan","tags":["Billing"],"summary":"Upgrade or downgrade the active subscription","description":"Updates the customer subscription to the requested price with prorated billing. Syncs Unkey rate limits to the new tier immediately. Requires a valid session cookie.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["priceId"],"properties":{"priceId":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"tier":{"type":"string"},"message":{"type":"string"},"warning":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"403":{"description":"Billing record does not match your account","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"No subscription found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"502":{"description":"Stripe update failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/billing/webhook":{"post":{"operationId":"billingStripeWebhook","tags":["Billing"],"summary":"Stripe webhook receiver","description":"Consumes Stripe webhook events (`checkout.session.completed`, `customer.subscription.updated`, `customer.subscription.deleted`, etc.) to keep billing state and Unkey rate limits in sync. Signed with the Stripe webhook secret; no API key required.","security":[],"parameters":[{"name":"stripe-signature","in":"header","required":true,"schema":{"type":"string"},"description":"Stripe webhook signature header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"responses":{"200":{"description":"Event received and processed"},"400":{"description":"Missing or invalid signature","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/image/resize":{"post":{"operationId":"imageResize","tags":["Image & Media"],"summary":"Describe a resize operation for a remote or base64 image","description":"Inspects the source image (URL or base64) and returns the target dimensions, CSS instructions, and size metadata. Native pixel resizing runs client-side; edge Workers cannot process image bytes directly.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["width"],"properties":{"url":{"type":"string"},"base64":{"type":"string"},"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"source":{"type":"string"},"content_type":{"type":"string"},"size_bytes":{"type":"integer"},"target_width":{"type":"integer"},"target_height":{"type":"integer","nullable":true},"css_resize":{"type":"string"},"note":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/image/convert":{"post":{"operationId":"imageConvert","tags":["Image & Media"],"summary":"Describe an image format conversion","description":"Reports whether a requested format conversion (e.g. jpeg->webp) is supported by browsers or common server-side libraries. Actual pixel encoding is not performed on edge Workers.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["from","to"],"properties":{"url":{"type":"string"},"base64":{"type":"string"},"from":{"type":"string","example":"jpeg"},"to":{"type":"string","example":"webp"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"},"supported":{"type":"boolean"},"note":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/image/metadata":{"post":{"operationId":"imageMetadata","tags":["Image & Media"],"summary":"Fetch metadata for a remote or base64 image","description":"Returns content type, byte size, last-modified, and cache-control headers for the provided image URL (via HEAD request) or infers the values from a base64 data URI.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"base64":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string","nullable":true},"content_type":{"type":"string"},"size_bytes":{"type":"integer"},"last_modified":{"type":"string","nullable":true},"cache_control":{"type":"string","nullable":true}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/pdf/from-html":{"post":{"operationId":"pdfFromHtml","tags":["Image & Media"],"summary":"Wrap HTML for print-to-PDF","description":"Returns HTML wrapped with print-ready `@page` CSS for the chosen paper size and orientation. Open the result in a browser and use File > Print > Save as PDF; edge Workers cannot render binary PDFs directly.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["html"],"properties":{"html":{"type":"string"},"options":{"type":"object","properties":{"format":{"type":"string","enum":["A4","letter"],"default":"A4"},"landscape":{"type":"boolean","default":false}}}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"html":{"type":"string"},"format":{"type":"string"},"landscape":{"type":"boolean"},"note":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/pdf/from-markdown":{"post":{"operationId":"pdfFromMarkdown","tags":["Image & Media"],"summary":"Render Markdown to print-ready HTML","description":"Converts Markdown to HTML and wraps it with print CSS. Open the result in a browser and use File > Print > Save as PDF.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["markdown"],"properties":{"markdown":{"type":"string"},"options":{"type":"object","properties":{"format":{"type":"string","enum":["A4","letter"],"default":"A4"},"landscape":{"type":"boolean","default":false}}}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"html":{"type":"string"},"format":{"type":"string"},"landscape":{"type":"boolean"},"note":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/screenshot/capture":{"post":{"operationId":"screenshotCapture","tags":["Image & Media"],"summary":"Wrap HTML for headless screenshot rendering","description":"Returns HTML with a fixed-size viewport wrapper suitable for headless Chromium/Puppeteer to render and capture at the specified dimensions. Native browser rendering is not available in edge Workers.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["html"],"properties":{"html":{"type":"string"},"width":{"type":"integer","minimum":100,"maximum":4096,"default":1280},"height":{"type":"integer","minimum":100,"maximum":4096,"default":720},"format":{"type":"string","enum":["png","jpeg"],"default":"png"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"html":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"},"format":{"type":"string"},"note":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/svg/optimize":{"post":{"operationId":"svgOptimize","tags":["Image & Media"],"summary":"Optimize an SVG string","description":"Removes XML declarations, comments, editor metadata, empty elements, and collapses whitespace. Returns the optimized SVG along with original and final byte sizes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["svg"],"properties":{"svg":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"optimized":{"type":"string"},"original_size":{"type":"integer"},"optimized_size":{"type":"integer"},"savings_percent":{"type":"number"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/code/detect":{"post":{"operationId":"codeDetect","tags":["Developer Utilities"],"summary":"Detect the programming language of a snippet","description":"Scores the snippet against language heuristics (keywords, syntax tokens) and returns the best guess with a confidence score and up to 3 alternatives.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code"],"properties":{"code":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"language":{"type":"string"},"confidence":{"type":"number"},"alternatives":{"type":"array","items":{"type":"object","properties":{"language":{"type":"string"},"confidence":{"type":"number"}}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/code/highlight":{"post":{"operationId":"codeHighlight","tags":["Developer Utilities"],"summary":"Syntax-highlight code as HTML","description":"Tokenizes the snippet and wraps each token in a styled `<span>` suitable for dropping into a page. Supports a dark or light color theme.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code","language"],"properties":{"code":{"type":"string"},"language":{"type":"string","example":"javascript"},"theme":{"type":"string","enum":["dark","light"],"default":"dark"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"html":{"type":"string"},"language":{"type":"string"},"theme":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/emoji/search":{"post":{"operationId":"emojiSearch","tags":["Text & Data"],"summary":"Search the emoji database","description":"Returns emojis whose name or keywords include the query. Responses include the emoji character, canonical name, Unicode code points, and matching keywords.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","example":"happy"},"limit":{"type":"integer","minimum":1,"maximum":100,"default":20}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string"},"name":{"type":"string"},"unicode":{"type":"string"},"keywords":{"type":"array","items":{"type":"string"}}}}},"count":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/regex/generate":{"post":{"operationId":"regexGenerate","tags":["Developer Utilities"],"summary":"Generate a regex pattern from a description","description":"Matches the description against known patterns (email, URL, phone, date, IPv4, hex color, UUID, credit card, ZIP) and returns the corresponding regex. If `test_string` is supplied, also runs the pattern against it.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["description"],"properties":{"description":{"type":"string","example":"email"},"test_string":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"pattern":{"type":"string"},"flags":{"type":"string"},"description":{"type":"string"},"test_result":{"type":"object","properties":{"matches":{"type":"boolean"},"found":{"type":"array","items":{"type":"string"}}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/country/lookup":{"post":{"operationId":"countryLookup","tags":["Text & Data"],"summary":"Look up country metadata","description":"Resolves a country by ISO 3166-1 alpha-2 code, alpha-3 code, or (partial) name. Returns the canonical record including dial codes and currency.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","example":"US"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"country":{"type":"object","additionalProperties":true}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"No country found for the query","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/number/spell":{"post":{"operationId":"numberSpell","tags":["Text & Data"],"summary":"Spell a number in words","description":"Spells a finite number in English words (other locales fall back to English with a note). Supports integers and up to trillions plus decimal digits.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["number"],"properties":{"number":{"type":"number","example":1234},"locale":{"type":"string","example":"en"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"words":{"type":"string"},"number":{"type":"number"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/text/readability":{"post":{"operationId":"textReadability","tags":["Text & Data"],"summary":"Calculate readability scores","description":"Returns Flesch-Kincaid grade, Flesch reading ease, and Gunning Fog indices for the supplied text, along with sentence/word/syllable counts.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"flesch_kincaid_grade":{"type":"number"},"flesch_reading_ease":{"type":"number"},"gunning_fog":{"type":"number"},"sentences":{"type":"integer"},"words":{"type":"integer"},"syllables":{"type":"integer"},"complex_words":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/text/similarity":{"post":{"operationId":"textSimilarity","tags":["Text & Data"],"summary":"Compute text similarity","description":"Returns the similarity score between two text snippets using either cosine (default) or jaccard word-set comparison. Output is in the 0-1 range.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text_a","text_b"],"properties":{"text_a":{"type":"string"},"text_b":{"type":"string"},"method":{"type":"string","enum":["cosine","jaccard"],"default":"cosine"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"similarity":{"type":"number"},"method":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/currency/convert":{"post":{"operationId":"currencyConvert","tags":["Lookup"],"summary":"Convert between currencies","description":"Uses live exchange rates from Frankfurter to convert a given `amount` from one ISO 4217 code to another.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["amount","from","to"],"properties":{"amount":{"type":"number","example":100},"from":{"type":"string","example":"USD"},"to":{"type":"string","example":"EUR"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"amount":{"type":"number"},"from":{"type":"string"},"to":{"type":"string"},"result":{"type":"number"},"rate":{"type":"number"},"timestamp":{"type":"string","format":"date-time"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/currency/rates":{"post":{"operationId":"currencyRates","tags":["Lookup"],"summary":"Get exchange rates for a base currency","description":"Returns the latest cross rates for the base currency (defaults to USD) from Frankfurter.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"base":{"type":"string","default":"USD"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"base":{"type":"string"},"date":{"type":"string","format":"date"},"rates":{"type":"object","additionalProperties":{"type":"number"}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/currency-list/list":{"get":{"operationId":"currencyListList","tags":["Lookup"],"summary":"List ISO 4217 currencies","description":"Returns the full static currency catalog with names, symbols, decimal digits, and country codes. Accepts an optional `filter` or `q` query param for case-insensitive substring matching against code or name.","parameters":[{"name":"filter","in":"query","schema":{"type":"string"}},{"name":"q","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"currencies":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"decimal_digits":{"type":"integer"},"countries":{"type":"array","items":{"type":"string"}}}}},"count":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"No currencies matched the filter","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/ical/parse":{"post":{"operationId":"icalParse","tags":["Text & Data"],"summary":"Parse an iCalendar (ICS) feed","description":"Parses RFC 5545 content and extracts `VEVENT` entries with UID, summary, description, location, start, end, and all-day status.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ics"],"properties":{"ics":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{"uid":{"type":"string"},"summary":{"type":"string"},"description":{"type":"string"},"location":{"type":"string"},"start":{"type":"string"},"end":{"type":"string"},"all_day":{"type":"boolean"}}}},"count":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/ical/generate":{"post":{"operationId":"icalGenerate","tags":["Text & Data"],"summary":"Generate an iCalendar (ICS) feed","description":"Builds a VCALENDAR/VEVENT string from one or more events. Accepts all-day (YYYY-MM-DD) or timed (ISO 8601) start/end values.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["events"],"properties":{"events":{"type":"array","minItems":1,"items":{"type":"object","required":["summary","start"],"properties":{"summary":{"type":"string"},"start":{"type":"string"},"end":{"type":"string"},"description":{"type":"string"},"location":{"type":"string"}}}}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ics":{"type":"string"},"events":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/json-extra/flatten":{"post":{"operationId":"jsonExtraFlatten","tags":["Text & Data"],"summary":"Flatten nested JSON to a single-level map","description":"Walks the object tree and produces `{\"a.b.c\": value}` style flat keys. Supports a custom delimiter.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["json"],"properties":{"json":{"type":"object","additionalProperties":true},"delimiter":{"type":"string","default":"."}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"flattened":{"type":"object","additionalProperties":true},"keys":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/json-extra/unflatten":{"post":{"operationId":"jsonExtraUnflatten","tags":["Text & Data"],"summary":"Unflatten a dotted JSON map","description":"Reverses `/flatten`. Interprets numeric path parts as array indexes and reconstructs nested arrays/objects.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["json"],"properties":{"json":{"type":"object","additionalProperties":true},"delimiter":{"type":"string","default":"."}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"unflattened":{}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/sql/parse":{"post":{"operationId":"sqlParse","tags":["Developer Utilities"],"summary":"Parse a SQL statement","description":"Best-effort parser that identifies the statement type, referenced tables and columns, and whether it contains WHERE/JOIN/subqueries.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["sql"],"properties":{"sql":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"type":{"type":"string"},"tables":{"type":"array","items":{"type":"string"}},"columns":{"type":"array","items":{"type":"string"}},"has_where":{"type":"boolean"},"has_join":{"type":"boolean"},"has_subquery":{"type":"boolean"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/metatag/generate":{"post":{"operationId":"metatagGenerate","tags":["Text & Data"],"summary":"Generate SEO and social meta tags","description":"Produces `<title>`, `description`, canonical, Open Graph, and Twitter Card tags for a page. Returns both raw HTML and a normalized `{name, content}` array.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"title":{"type":"string"},"description":{"type":"string"},"url":{"type":"string"},"image":{"type":"string"},"type":{"type":"string","default":"website"},"twitter_card":{"type":"string","default":"summary_large_image"},"locale":{"type":"string","default":"en_US"},"site_name":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"html":{"type":"string"},"tags":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"content":{"type":"string"}}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/mock/generate":{"post":{"operationId":"mockGenerate","tags":["Developer Utilities"],"summary":"Generate mock data from a JSON Schema","description":"Produces realistic placeholder values matching the given JSON Schema. Returns a single object when `count` is 1 (default) or an array when `count` > 1.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["schema"],"properties":{"schema":{"type":"object","additionalProperties":true},"count":{"type":"integer","minimum":1,"maximum":100,"default":1}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"data":{},"count":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/schema/validate":{"post":{"operationId":"schemaValidate","tags":["Developer Utilities"],"summary":"Validate data against a JSON Schema","description":"Runs a minimal draft-07 validator over the supplied `data` using the supplied `schema`. Returns the validation result and a structured list of errors.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["data","schema"],"properties":{"data":{},"schema":{"type":"object","additionalProperties":true}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"valid":{"type":"boolean"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/schema/openapi-validate":{"post":{"operationId":"schemaOpenapiValidate","tags":["Developer Utilities"],"summary":"Validate an OpenAPI 3.x spec","description":"Checks the supplied OpenAPI document (object or JSON string) for required fields, valid HTTP methods, and common issues. Returns a list of errors plus non-fatal warnings.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["spec"],"properties":{"spec":{"oneOf":[{"type":"object","additionalProperties":true},{"type":"string"}]}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"valid":{"type":"boolean"},"version":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"warnings":{"type":"array","items":{"type":"string"}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/schema/json-to-zod":{"post":{"operationId":"schemaJsonToZod","tags":["Developer Utilities"],"summary":"Infer a Zod schema from a JSON value","description":"Generates `const <name>Schema = z.object({...})` for the provided JSON sample. Detects primitives, arrays, nested objects, and tags integers with `.int()`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["json"],"properties":{"json":{},"name":{"type":"string","default":"Root"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"zod":{"type":"string"},"name":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/schema/json-to-jsonschema":{"post":{"operationId":"schemaJsonToJsonschema","tags":["Developer Utilities"],"summary":"Infer a JSON Schema from a JSON value","description":"Generates a draft-07 JSON Schema describing the shape of the provided sample, marking all observed properties as required.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["json"],"properties":{"json":{}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"schema":{"type":"object","additionalProperties":true}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/dns-security/dkim-check":{"post":{"operationId":"dnsSecurityDkimCheck","tags":["Lookup"],"summary":"Check a domain DKIM record","description":"Queries `<selector>._domainkey.<domain>` for DKIM public key records. If no selector is supplied, tries `default`, `google`, `s1`, and `k1`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string"},"selector":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"selector":{"type":"string"},"has_dkim":{"type":"boolean"},"record":{"type":"string","nullable":true},"key_type":{"type":"string","nullable":true},"public_key_length":{"type":"integer","nullable":true}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/dns-security/dmarc-check":{"post":{"operationId":"dnsSecurityDmarcCheck","tags":["Lookup"],"summary":"Check a domain DMARC policy","description":"Fetches the `_dmarc.<domain>` TXT record and parses the policy, subdomain policy, reporting addresses, percentage, and alignment modes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"has_dmarc":{"type":"boolean"},"record":{"type":"string","nullable":true},"policy":{"type":"string","nullable":true},"subdomain_policy":{"type":"string","nullable":true},"reporting":{"type":"object","properties":{"rua":{"type":"array","items":{"type":"string"}},"ruf":{"type":"array","items":{"type":"string"}}}},"pct":{"type":"integer"},"alignment":{"type":"object","properties":{"dkim":{"type":"string"},"spf":{"type":"string"}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/dns-security/spf-check":{"post":{"operationId":"dnsSecuritySpfCheck","tags":["Lookup"],"summary":"Check a domain SPF record","description":"Fetches the domain TXT records, locates the SPF record, and parses mechanisms, the `all` policy, and includes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"has_spf":{"type":"boolean"},"record":{"type":"string","nullable":true},"mechanisms":{"type":"array","items":{"type":"object","additionalProperties":true}},"all_policy":{"type":"string","nullable":true},"includes":{"type":"array","items":{"type":"string"}},"valid":{"type":"boolean"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/ip-blocklist/check":{"post":{"operationId":"ipBlocklistCheck","tags":["Lookup"],"summary":"Check an IPv4 address against blocklists","description":"Runs private-range, bogon, and reverse-DNS heuristic checks against the given IPv4 address. Returns a risk_level (low/medium/high) plus per-check outcomes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ip"],"properties":{"ip":{"type":"string","example":"8.8.8.8"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ip":{"type":"string"},"is_private":{"type":"boolean"},"is_bogon":{"type":"boolean"},"reverse_dns":{"type":"string"},"risk_level":{"type":"string","enum":["low","medium","high"]},"checks":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"result":{"type":"string"}}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/ip-whois/lookup":{"post":{"operationId":"ipWhoisLookup","tags":["Lookup"],"summary":"RDAP lookup for an IP address","description":"Queries rdap.org for the given IP and returns the network range, organization, country, and handle.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ip"],"properties":{"ip":{"type":"string","example":"1.1.1.1"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"ip":{"type":"string"},"name":{"type":"string"},"handle":{"type":"string"},"network":{"type":"object","properties":{"start":{"type":"string"},"end":{"type":"string"},"cidr":{"type":"string"}}},"organization":{"type":"string"},"country":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"No RDAP data found for this IP","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"429":{"description":"RDAP rate-limited or blocked","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/uptime/check":{"post":{"operationId":"uptimeCheck","tags":["Lookup"],"summary":"Check URL uptime and history","description":"Performs a HEAD request against the URL, records the result in KV for 7 days, and returns the latest status plus the last 10 historical checks.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","example":"https://botoi.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string"},"status":{"type":"integer"},"response_time_ms":{"type":"integer"},"is_up":{"type":"boolean"},"checked_at":{"type":"string","format":"date-time"},"history":{"type":"array","items":{"type":"object","properties":{"status":{"type":"integer"},"response_time_ms":{"type":"integer"},"checked_at":{"type":"string","format":"date-time"}}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/site/check":{"post":{"operationId":"siteCheck","tags":["Lookup"],"summary":"Basic site health and transfer metrics","description":"Measures TTFB, status code, content type, content length, compression, and server header for a URL. Intended for quick single-shot diagnostics.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string"},"status_code":{"type":"integer"},"ttfb_ms":{"type":"integer"},"content_type":{"type":"string"},"content_length":{"type":"integer","nullable":true},"compressed":{"type":"boolean"},"compression":{"type":"string","nullable":true},"server":{"type":"string","nullable":true},"response_time_ms":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/link/check":{"post":{"operationId":"linkCheck","tags":["Lookup"],"summary":"Check whether a URL is reachable","description":"Issues a HEAD (falling back to GET) and reports status, response time, and basic content metadata.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"url":{"type":"string"},"alive":{"type":"boolean"},"status_code":{"type":"integer"},"content_type":{"type":"string"},"content_length":{"type":"integer","nullable":true},"response_time_ms":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/link/expand":{"post":{"operationId":"linkExpand","tags":["Lookup"],"summary":"Follow redirect chains to a final URL","description":"Follows up to 10 redirect hops manually and returns every intermediate URL plus its status code.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","example":"https://bit.ly/abc"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"original":{"type":"string"},"final":{"type":"string"},"hops":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"status":{"type":"integer"}}}},"redirect_count":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/robots/":{"post":{"operationId":"robotsFetch","tags":["Lookup"],"summary":"Fetch and parse /robots.txt","description":"Downloads `https://<domain>/robots.txt` and returns a structured list of rules (user-agent, allow/disallow), sitemap URLs, and any declared crawl delay.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"domain":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"found":{"type":"boolean"},"rules":{"type":"array","items":{"type":"object","additionalProperties":true}},"sitemaps":{"type":"array","items":{"type":"string"}},"crawl_delay":{"type":"number","nullable":true}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/sitemap/":{"post":{"operationId":"sitemapFetch","tags":["Lookup"],"summary":"Parse a sitemap XML","description":"Downloads a sitemap or sitemapindex URL, detects the format, and returns up to `limit` URLs (default 100, max 1000).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","example":"https://botoi.com/sitemap.xml"},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":100}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","additionalProperties":true},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/rss/parse":{"post":{"operationId":"rssParse","tags":["Lookup"],"summary":"Parse an RSS or Atom feed","description":"Detects RSS or Atom format, then returns feed metadata and up to `limit` items (default 50, max 500).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":500,"default":50}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"feed":{"type":"object","properties":{"title":{"type":"string"},"link":{"type":"string"},"description":{"type":"string"}}},"items":{"type":"array","items":{"type":"object","additionalProperties":true}},"format":{"type":"string","enum":["rss","atom"]},"count":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/email-mx/verify":{"post":{"operationId":"emailMxVerify","tags":["Lookup"],"summary":"Check email deliverability via MX records","description":"Validates the email format, looks up MX records for the domain (falling back to an A record), and reports a deliverability estimate.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"email":{"type":"string"},"valid_format":{"type":"boolean"},"domain":{"type":"string"},"has_mx":{"type":"boolean"},"mx_records":{"type":"array","items":{"type":"object","properties":{"priority":{"type":"integer"},"exchange":{"type":"string"}}}},"deliverable":{"type":"string","enum":["likely","unlikely","unknown"]}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/abuse-email/check":{"post":{"operationId":"abuseEmailCheck","tags":["Lookup"],"summary":"Heuristic abuse/suspicion check for an email","description":"Scores an email for disposable-provider use plus suspicious local-part patterns. Returns a 0-100 risk score and a list of reasons.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"email":{"type":"string"},"domain":{"type":"string"},"is_suspicious":{"type":"boolean"},"is_disposable":{"type":"boolean"},"reasons":{"type":"array","items":{"type":"string"}},"risk_score":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/disposable-email/check":{"post":{"operationId":"disposableEmailCheck","tags":["Lookup"],"summary":"Check whether an email uses a disposable provider","description":"Matches the email domain against a curated disposable-provider list (plus a suspicious-pattern check) and tags free providers like Gmail.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"email":{"type":"string"},"domain":{"type":"string"},"is_disposable":{"type":"boolean"},"is_free":{"type":"boolean"},"provider":{"type":"string","nullable":true}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/mx/check":{"post":{"operationId":"mxCheck","tags":["Lookup"],"summary":"List MX records for a domain","description":"Queries Cloudflare DNS-over-HTTPS for MX records and returns them sorted by priority.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","example":"example.com"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"domain":{"type":"string"},"has_mx":{"type":"boolean"},"records":{"type":"array","items":{"type":"object","properties":{"exchange":{"type":"string"},"priority":{"type":"integer"}}}},"count":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/date/":{"post":{"operationId":"dateParse","tags":["Text & Data"],"summary":"Parse a natural-language date","description":"Accepts phrases like \"next Friday\", \"3 days ago\", or common absolute formats. Returns the normalized ISO date, Unix timestamp, day-of-week, and a relative description.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string","example":"next Friday"},"reference_date":{"type":"string","format":"date"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"parsed":{"type":"string"},"iso":{"type":"string"},"unix":{"type":"integer"},"day_of_week":{"type":"string"},"relative":{"type":"string"},"confidence":{"type":"number"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/geo/distance":{"post":{"operationId":"geoDistance","tags":["Storage & Services"],"summary":"Great-circle distance between two coordinates","description":"Computes the Haversine distance between two (lat, lng) points. Result is reported in km, mi, or nm.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["from","to"],"properties":{"from":{"type":"object","required":["lat","lng"],"properties":{"lat":{"type":"number"},"lng":{"type":"number"}}},"to":{"type":"object","required":["lat","lng"],"properties":{"lat":{"type":"number"},"lng":{"type":"number"}}},"unit":{"type":"string","enum":["km","mi","nm"],"default":"km"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"distance":{"type":"number"},"unit":{"type":"string"},"from":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}}},"to":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}}}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/geo/geocode":{"post":{"operationId":"geoGeocode","tags":["Storage & Services"],"summary":"Forward geocode an address","description":"Resolves an address to coordinates using OpenStreetMap Nominatim. Returns the top match with lat, lng, canonical display name, and location type.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["address"],"properties":{"address":{"type":"string","example":"Empire State Building"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"address":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"display_name":{"type":"string"},"type":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"No results found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/geo/reverse":{"post":{"operationId":"geoReverse","tags":["Storage & Services"],"summary":"Reverse geocode coordinates","description":"Resolves coordinates to a human-readable address using OpenStreetMap Nominatim.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["lat","lng"],"properties":{"lat":{"type":"number"},"lng":{"type":"number"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"},"address":{"type":"string"},"display_name":{"type":"string"},"city":{"type":"string"},"country":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"No address found for coordinates","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/paste/create":{"post":{"operationId":"pasteCreate","tags":["Storage & Services"],"summary":"Create a text paste","description":"Stores up to ~1 MB of text (content + language) in KV for the requested TTL (default 1 hour, max 24 hours) and returns an ID used to fetch it back.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["content"],"properties":{"content":{"type":"string"},"language":{"type":"string","default":"plaintext"},"ttl":{"type":"integer","minimum":1,"maximum":86400,"default":3600}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"expires_in":{"type":"integer"},"language":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/paste/{id}":{"get":{"operationId":"pasteGet","tags":["Storage & Services"],"summary":"Retrieve a paste by ID","description":"Returns the stored content, language, and creation timestamp for a paste. Responds with 404 once the paste TTL expires.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Paste ID returned by `POST /v1/paste/create`"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"id":{"type":"string"},"content":{"type":"string"},"language":{"type":"string"},"created_at":{"type":"string","format":"date-time"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Paste not found or expired","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/short-url/create":{"post":{"operationId":"shortUrlCreate","tags":["Storage & Services"],"summary":"Create a short URL","description":"Generates a slug (or uses the supplied `custom_slug`) mapping to the target URL. Returns the slug plus the redirect URL served at `/v1/short-url/r/{slug}`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string"},"custom_slug":{"type":"string"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"slug":{"type":"string"},"short_url":{"type":"string"},"original_url":{"type":"string"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/short-url/{slug}/stats":{"get":{"operationId":"shortUrlStats","tags":["Storage & Services"],"summary":"Get click stats for a short URL","description":"Returns the original URL, creation time, and click count for the given slug. Responds with 404 when the slug is unknown.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Short URL slug"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"slug":{"type":"string"},"original_url":{"type":"string"},"clicks":{"type":"integer"},"created_at":{"type":"string","format":"date-time"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Short URL not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/short-url/r/{slug}":{"get":{"operationId":"shortUrlRedirect","tags":["Storage & Services"],"summary":"Redirect to the target URL","description":"Issues a 302 redirect to the URL registered for `slug` and increments the click counter. Returns 404 when the slug is unknown.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Short URL slug"}],"responses":{"302":{"description":"Redirect to the original URL"},"404":{"description":"Short URL not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/token/count":{"post":{"operationId":"tokenCount","tags":["Developer Utilities"],"summary":"Estimate token count for text","description":"Estimates the number of LLM tokens the text consumes using characters-per-token ratios for the requested model family (GPT, Claude, Llama, Mistral, Gemini).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"},"model":{"type":"string","default":"gpt-4o"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"tokens":{"type":"integer"},"model":{"type":"string"},"method":{"type":"string","example":"estimated"},"characters":{"type":"integer"},"words":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/v1/token/truncate":{"post":{"operationId":"tokenTruncate","tags":["Developer Utilities"],"summary":"Truncate text to a token budget","description":"Cuts the text at a word boundary so the estimated token count stays within `max_tokens` for the selected model. Returns the new text and whether truncation occurred.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text","max_tokens"],"properties":{"text":{"type":"string"},"max_tokens":{"type":"integer","minimum":1},"model":{"type":"string","default":"gpt-4o"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"data":{"type":"object","properties":{"truncated":{"type":"string"},"tokens":{"type":"integer"},"was_truncated":{"type":"boolean"},"model":{"type":"string"},"max_tokens":{"type":"integer"},"original_tokens":{"type":"integer"}}},"meta":{"type":"object","properties":{"requestId":{"type":"string"},"duration":{"type":"number"}}}}}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Unauthorized - missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}}}}